blob: 36014d1e70a3b75f982d3a5a40a42003c8b02fd8 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}