| /******************************************************************************* |
| * Copyright (c) 2011, 2012 Tasktop Technologies and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.commons.notifications.core; |
| |
| import java.util.Collections; |
| import java.util.Dictionary; |
| import java.util.Hashtable; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.mylyn.commons.core.CoreUtil; |
| import org.eclipse.osgi.service.resolver.VersionRange; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.Filter; |
| import org.osgi.framework.FrameworkUtil; |
| import org.osgi.framework.InvalidSyntaxException; |
| import org.osgi.framework.Version; |
| |
| /** |
| * @author Steffen Pingel |
| */ |
| public class NotificationEnvironment { |
| |
| private final Dictionary<Object, Object> environment; |
| |
| public NotificationEnvironment() { |
| environment = new Hashtable<Object, Object>(System.getProperties()); |
| } |
| |
| public Version getFrameworkVersion() { |
| return CoreUtil.getFrameworkVersion(); |
| } |
| |
| public Version getPlatformVersion() { |
| Bundle bundle = Platform.getBundle("org.eclipse.platform"); //$NON-NLS-1$ |
| if (bundle == null) { |
| bundle = Platform.getBundle(Platform.PI_RUNTIME); |
| } |
| if (bundle != null) { |
| String versionString = (String) bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION); |
| try { |
| return new Version(versionString); |
| } catch (IllegalArgumentException e) { |
| // should never happen |
| } |
| } |
| return Version.emptyVersion; |
| } |
| |
| public Version getRuntimeVersion() { |
| return CoreUtil.getRuntimeVersion(); |
| } |
| |
| @SuppressWarnings({ "unchecked", "rawtypes" }) |
| public boolean matches(IAdaptable item, IProgressMonitor monitor) { |
| IFilterable entry = (IFilterable) item.getAdapter(IFilterable.class); |
| if (entry == null) { |
| return true; |
| } |
| |
| if (!matchesVersion(entry.getFilter("frameworkVersion"), getFrameworkVersion())) { //$NON-NLS-1$ |
| return false; |
| } |
| if (!matchesVersion(entry.getFilter("platformVersion"), getPlatformVersion())) { //$NON-NLS-1$ |
| return false; |
| } |
| if (!matchesVersion(entry.getFilter("runtimeVersion"), getRuntimeVersion())) { //$NON-NLS-1$ |
| return false; |
| } |
| List<String> filterExpressions = entry.getFilters("filter"); //$NON-NLS-1$ |
| for (String filterExpression : filterExpressions) { |
| try { |
| Filter filter = FrameworkUtil.createFilter(filterExpression); |
| if (!filter.match((Dictionary) environment)) { |
| return false; |
| } |
| } catch (InvalidSyntaxException e) { |
| // ignore that filter |
| } |
| } |
| List<String> requiredFeatures = entry.getFilters("requires"); //$NON-NLS-1$ |
| for (String requiredFeature : requiredFeatures) { |
| if (!getInstalledFeatures(monitor).contains(parseFeature(requiredFeature))) { |
| return false; |
| } |
| } |
| List<String> conflictedFeatures = entry.getFilters("conflicts"); //$NON-NLS-1$ |
| for (String conflictedFeature : conflictedFeatures) { |
| if (getInstalledFeatures(monitor).contains(parseFeature(conflictedFeature))) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| public Set<String> getInstalledFeatures(IProgressMonitor monitor) { |
| return Collections.emptySet(); |
| } |
| |
| private boolean matchesVersion(String expectedVersionRangeExpression, Version actualVersion) { |
| if (expectedVersionRangeExpression != null) { |
| try { |
| VersionRange versionRange = new VersionRange(expectedVersionRangeExpression); |
| if (!versionRange.isIncluded(actualVersion)) { |
| return false; |
| } |
| } catch (IllegalArgumentException e) { |
| // ignore |
| } |
| } |
| return true; |
| } |
| |
| private String parseFeature(String requiredFeature) { |
| int i = requiredFeature.indexOf(";"); //$NON-NLS-1$ |
| if (i != -1) { |
| return requiredFeature.substring(0, i); |
| } |
| return requiredFeature; |
| } |
| |
| } |