/* Copyright (C) 2009 Mobile Sorcery AB This program is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License v1.0. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for more details. You should have received a copy of the Eclipse Public License v1.0 along with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html */ package com.mobilesorcery.sdk.profiles.filter; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import org.eclipse.ui.IMemento; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.profiles.ICompositeDeviceFilter; import com.mobilesorcery.sdk.profiles.IDeviceFilter; import com.mobilesorcery.sdk.profiles.IProfile; /** * Sort of an AND filter. * * @author Mattias * */ public class CompositeDeviceFilter extends AbstractDeviceFilter implements ICompositeDeviceFilter, PropertyChangeListener { private static final String CRITERIA = "criteria"; private static final String FILTER = "filter"; private final ArrayList<IDeviceFilter> filters = new ArrayList<IDeviceFilter>(); public CompositeDeviceFilter() { } public CompositeDeviceFilter(IDeviceFilter... filters) { this.filters.addAll(Arrays.asList(filters)); } @Override public void addFilter(IDeviceFilter filter) { this.filters.add(filter); filter.addPropertyChangeListener(this); notifyListeners(new PropertyChangeEvent(this, FILTER_ADDED, null, filter)); } @Override public void removeFilter(IDeviceFilter filter) { this.filters.remove(filter); filter.removePropertyChangeListener(this); notifyListeners(new PropertyChangeEvent(this, FILTER_REMOVED, filter, null)); } @Override public void removeAllFilters() { for (IDeviceFilter filter : new ArrayList<IDeviceFilter>(filters)) { removeFilter(filter); } } @Override public IDeviceFilter[] getFilters() { return filters.toArray(new IDeviceFilter[0]); } @Override public void update(IDeviceFilter child) { notifyListeners(new PropertyChangeEvent(this, FILTER_CHANGED, null, child)); } @Override public boolean acceptProfile(IProfile profile) { for (Iterator<IDeviceFilter> filterIterator = filters.iterator(); filterIterator.hasNext();) { IDeviceFilter filter = filterIterator.next(); if (!filter.accept(profile)) { return false; } } return true; } @Override public void saveState(IMemento memento) { if (filters.size() > 0) { IMemento criteria = memento.createChild(CRITERIA); for (Iterator<IDeviceFilter> filterIterator = filters.iterator(); filterIterator.hasNext();) { IDeviceFilter filter = filterIterator.next(); IMemento child = criteria.createChild(FILTER); child.putString("type", filter.getFactoryId()); filter.saveState(child); } } } public static CompositeDeviceFilter read(IMemento memento) { CompositeDeviceFilter result = new CompositeDeviceFilter(); IMemento criteria = memento.getChild(CRITERIA); if (criteria != null) { IMemento[] children = criteria.getChildren(FILTER); for (int i = 0; i < children.length; i++) { IMemento child = children[i]; String factoryId = child.getString("type"); IDeviceFilterFactory factory = CoreMoSyncPlugin.getDefault().getDeviceFilterFactory(factoryId); if (factory != null) { IDeviceFilter filter = factory.createFilter(child); if (filter != null) { result.addFilter(filter); } } } } return result; } @Override public String getFactoryId() { return "com.mobilesorcery.mosync.filters.composite"; } @Override public void propertyChange(PropertyChangeEvent event) { // Propagate. notifyListeners(event); } }