/******************************************************************************* * Copyright (c) 2008 The Eclipse Foundation. * 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: * The Eclipse Foundation - initial API and implementation *******************************************************************************/ package org.eclipse.epp.usagedata.internal.recording.filtering; import org.eclipse.epp.usagedata.internal.gathering.events.UsageDataEvent; import org.eclipse.epp.usagedata.internal.recording.UsageDataRecordingActivator; import org.eclipse.epp.usagedata.internal.recording.settings.UsageDataRecordingSettings; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; /** * The {@link PreferencesBasedFilter} is a {@link UsageDataEventFilter} with * direct links to preferences for the org.eclipse.epp.usagedata.recording * bundle. When created, instances hook a listener into the preference store * for the bundle so as to be notified by changes in preferences and update * accordingly. Instances must be released using the {@link #dispose()} method * to clean up the listener. * <p> * A single instance of this class is maintained by the activator for the * bundle via the settings object. The activator manages the lifecycle. * * @see UsageDataRecordingSettings * @author Wayne Beaton */ public class PreferencesBasedFilter extends AbstractUsageDataEventFilter { public PreferencesBasedFilter() { hookListeners(); } protected void hookListeners() { propertyChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (isFilterProperty(event.getProperty())) { fireFilterChangedEvent(); } } }; getPreferenceStore().addPropertyChangeListener(propertyChangeListener); } /** * This method cleans up hooks made by the instance. */ public void dispose() { getPreferenceStore().removePropertyChangeListener(propertyChangeListener); } /** * This method is used to test whether or the parameter represents * a property that the receiver is interested in. */ boolean isFilterProperty(String property) { if (UsageDataRecordingSettings.FILTER_ECLIPSE_BUNDLES_ONLY_KEY.equals(property)) return true; if (UsageDataRecordingSettings.FILTER_PATTERNS_KEY.equals(property)) return true; return false; } public boolean includes(UsageDataEvent event) { if (includeOnlyEclipseDotOrgBundles()) { return event.bundleId.startsWith("org.eclipse."); //$NON-NLS-1$ } for (String filter : getFilterPatterns()) { if (matches(filter, event.bundleId)) return false; } return true; } public String[] getFilterPatterns() { String patternString = getPreferenceStore().getString(UsageDataRecordingSettings.FILTER_PATTERNS_KEY); if ("".equals(patternString)) return new String[0]; //$NON-NLS-1$ return patternString.split("\n"); //$NON-NLS-1$ } private boolean includeOnlyEclipseDotOrgBundles() { return getPreferenceStore().getBoolean(UsageDataRecordingSettings.FILTER_ECLIPSE_BUNDLES_ONLY_KEY); } IPreferenceStore getPreferenceStore() { return UsageDataRecordingActivator.getDefault().getPreferenceStore(); } public void addPattern(String value) { String patternString = getPreferenceStore().getString(UsageDataRecordingSettings.FILTER_PATTERNS_KEY); if (patternString.trim().length() == 0) { patternString = value; } else { patternString += "\n" + value; //$NON-NLS-1$ } getPreferenceStore().setValue(UsageDataRecordingSettings.FILTER_PATTERNS_KEY, patternString); UsageDataRecordingActivator.getDefault().savePluginPreferences(); } public boolean includesPattern(String pattern) { for (String filter : getFilterPatterns()) { if (pattern.equals(filter)) return true; } return false; } public void removeFilterPatterns(Object[] toRemove) { String patternString = getPreferenceStore().getString(UsageDataRecordingSettings.FILTER_PATTERNS_KEY); String[] patterns = patternString.split("\n"); //$NON-NLS-1$ StringBuilder builder = new StringBuilder(); String separator = ""; //$NON-NLS-1$ for (String pattern : patterns) { if (!shouldRemovePattern(pattern, toRemove)) { builder.append(separator); builder.append(pattern); separator = "\n"; //$NON-NLS-1$ } } getPreferenceStore().setValue(UsageDataRecordingSettings.FILTER_PATTERNS_KEY, builder.toString()); UsageDataRecordingActivator.getDefault().savePluginPreferences(); } private boolean shouldRemovePattern(String pattern, Object[] toRemove) { for (Object object : toRemove) { if (object.equals(pattern)) return true; } return false; } public void setEclipseOnly(boolean value) { getPreferenceStore().setValue(UsageDataRecordingSettings.FILTER_ECLIPSE_BUNDLES_ONLY_KEY, value); UsageDataRecordingActivator.getDefault().savePluginPreferences(); // Don't need to do this, happens indirectly when value is set above. // fireFilterChangedEvent(); } public boolean isEclipseOnly() { return getPreferenceStore().getBoolean(UsageDataRecordingSettings.FILTER_ECLIPSE_BUNDLES_ONLY_KEY); } }