blob: fb02cac03f72c18e7a60936dbdf975d68d5eedcd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.dynamic;
import org.eclipse.core.runtime.IProduct;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
/*
* Resolves filters by determining whether the element in question should
* or shouldn't be filtered.
*/
public class FilterResolver {
private static final String NAME_OS = "os"; //$NON-NLS-1$
private static final String NAME_WS = "ws"; //$NON-NLS-1$
private static final String NAME_ARCH = "arch"; //$NON-NLS-1$
private static final String NAME_PRODUCT = "product"; //$NON-NLS-1$
private static final String NAME_PLUGIN = "plugin"; //$NON-NLS-1$
private static Extension extension;
private static FilterResolver instance;
public static FilterResolver getInstance() {
if (instance == null) {
instance = new FilterResolver();
}
return instance;
}
/*
* Returns whether or not the given filter expression gets rejected by the
* filter. e.g. "os=win32", "ws!=gtk"
*/
public boolean isFiltered(String expression) {
String name = null;
String value = null;
boolean not = false;
int index = expression.indexOf("!="); //$NON-NLS-1$
if (index != -1) {
name = expression.substring(0, index).trim();
value = expression.substring(index + 2).trim();
not = true;
}
else {
index = expression.indexOf('=');
if (index != -1) {
name = expression.substring(0, index).trim();
value = expression.substring(index + 1).trim();
not = false;
}
}
if (name != null && name.length() > 0 && value != null && value.length() > 0) {
return isFiltered(name, value, not);
}
// don't apply any invalid filters
return false;
}
/*
* Returns whether or not the given filter name and value get rejected by
* the filter.
*/
public boolean isFiltered(String name, String value, boolean not) {
boolean filtered;
if (name.equals(NAME_OS)) {
filtered = filterByWS(value);
}
else if (name.equals(NAME_WS)) {
filtered = filterByOS(value);
}
else if (name.equals(NAME_ARCH)) {
filtered = filterByARCH(value);
}
else if (name.equals(NAME_PRODUCT)) {
filtered = filterByProduct(value);
}
else if (name.equals(NAME_PLUGIN)) {
filtered = filterByPlugin(value);
}
else if (extension != null && extension.isHandled(name)) {
filtered = extension.isFiltered(name, value);
}
else {
filtered = filterBySystemProperty(name, value);
}
return not ? !filtered : filtered;
}
/*
* Hack: We don't have access to UI classes from here; the activity
* and category filters are dropped in from org.eclipse.help.ui when it
* starts.
*/
public static void setExtension(Extension extension) {
FilterResolver.extension = extension;
}
/*
* Evaluates the "ws" filter.
*/
private boolean filterByWS(String ws) {
return !ws.equals(Platform.getWS());
}
/*
* Evaluates the "os" filter.
*/
private boolean filterByOS(String os) {
return !os.equals(Platform.getOS());
}
/*
* Evaluates the "arch" filter.
*/
private boolean filterByARCH(String arch) {
return !arch.equals(Platform.getOSArch());
}
/*
* Evaluates the "product" filter.
*/
private boolean filterByProduct(String productId) {
IProduct product = Platform.getProduct();
if (product != null) {
return !productId.equals(product.getId());
}
return true;
}
/*
* Evaluates the "plugin" filter.
*/
private boolean filterByPlugin(String bundleId) {
Bundle bundle = Platform.getBundle(bundleId);
return bundle == null;
}
/*
* Evaluates the system property filter (when filter name doesn't match
* any known filter).
*/
private boolean filterBySystemProperty(String property, String value) {
try {
String systemValue = System.getProperty(property);
if (systemValue != null) {
return !value.equals(systemValue);
}
}
catch (Throwable t) {
// skip
}
return true;
}
/*
* Hack: A way for the org.eclipse.help.ui plugin to extend the filtering
* capability with UI-related filters (this is a core plugin).
*/
public static interface Extension {
/*
* Returns whether or not this extension handles the given filter.
*/
public boolean isHandled(String name);
/*
* Returns whether the given filter is rejected or not.
*/
public boolean isFiltered(String name, String value);
}
}