001: /* uDig - User Friendly Desktop Internet GIS client
002: * http://udig.refractions.net
003: * (C) 2004, Refractions Research Inc.
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation;
008: * version 2.1 of the License.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: */
015: package net.refractions.udig.project.ui.internal;
016:
017: import java.util.Set;
018: import java.util.concurrent.CopyOnWriteArraySet;
019:
020: import net.refractions.udig.project.ILayer;
021:
022: import org.eclipse.core.runtime.IAdaptable;
023: import org.geotools.feature.Feature;
024: import org.geotools.filter.AbstractFilter;
025: import org.geotools.filter.Filter;
026: import org.geotools.filter.FilterVisitor;
027:
028: /**
029: * Wraps a filter and can adapt to the wrapped filter or to possibly a layer if it is associated with a layer.
030: * For example if it is the selection filter of a layer.
031: *
032: * @author jones
033: * @since 1.1.0
034: */
035: public class AdaptingFilter extends AbstractFilter implements Filter,
036: IAdaptable {
037:
038: final private Filter wrapped;
039:
040: protected Set<Object> adapters = new CopyOnWriteArraySet<Object>();
041:
042: public AdaptingFilter(Filter filterA, ILayer layerA) {
043: this (filterA);
044: addAdapter(layerA);
045: }
046:
047: public AdaptingFilter(Filter filterA) {
048: if (filterA == null)
049: throw new NullPointerException("filterA cannot be null"); //$NON-NLS-1$
050: wrapped = filterA;
051: }
052:
053: @SuppressWarnings("unchecked")
054: public Object getAdapter(Class adapter) {
055: for (Object obj : adapters) {
056: if (adapter.isAssignableFrom(obj.getClass()))
057: return obj;
058: }
059: if (Filter.class.isAssignableFrom(adapter)) {
060: return wrapped;
061: }
062: return null;
063: }
064:
065: public void addAdapter(Object adapter) {
066: if (adapter == null)
067: throw new NullPointerException("adapter cannont be null"); //$NON-NLS-1$
068: adapters.add(adapter);
069: }
070:
071: public boolean removeAdapter(Object adapter) {
072: if (adapter == null)
073: throw new NullPointerException("adapter cannont be null"); //$NON-NLS-1$
074: return adapters.remove(adapter);
075: }
076:
077: public boolean contains(Feature feature) {
078: return wrapped.contains(feature);
079: }
080:
081: public Filter and(Filter filter) {
082: return wrapped.and(filter);
083: }
084:
085: public Filter or(Filter filter) {
086: return wrapped.or(filter);
087: }
088:
089: public Filter not() {
090: return wrapped.not();
091: }
092:
093: public short getFilterType() {
094: return wrapped.getFilterType();
095: }
096:
097: public void accept(FilterVisitor visitor) {
098: wrapped.accept(visitor);
099: }
100:
101: @Override
102: public String toString() {
103: return wrapped.toString();
104: }
105:
106: }
|