| /******************************************************************************* |
| * 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); |
| } |
| } |