/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2011, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 GNU * Lesser General Public License for more details. */ package org.geoserver.data.versioning.decorator; import java.util.HashSet; import java.util.Set; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.identity.ResourceIdImpl; import org.geotools.filter.visitor.AbstractFinderFilterVisitor; import org.geotools.filter.visitor.DuplicatingFilterVisitor; import org.opengis.filter.Filter; import org.opengis.filter.FilterVisitor; import org.opengis.filter.Id; import org.opengis.filter.identity.FeatureId; import org.opengis.filter.identity.Identifier; import org.opengis.filter.identity.ResourceId; public class VersionFilters { /** * @return a copy of {@code filter} with any {@link ResourceId} stripped off * and converted to normal {@link FeatureId} with no version * information. */ public static final Filter getUnversioningFilter(Filter filter) { if (filter == null || Filter.INCLUDE.equals(filter) || Filter.EXCLUDE.equals(filter)) { return filter; } DuplicatingFilterVisitor visitor = new DuplicatingFilterVisitor() { @Override public Object visit(final Id filter, final Object data) { Set<Identifier> featureIds = new HashSet<Identifier>(); for (Identifier id : filter.getIdentifiers()) { if (id instanceof FeatureId && !(id instanceof ResourceId)) { String rid = ((FeatureId) id).getID(); int idx = rid.indexOf(ResourceId.VERSION_SEPARATOR); if (idx > 0) { String fid = rid.substring(0, idx); featureIds.add(getFactory(data).featureId(fid)); } else { featureIds.add(id); } } else { featureIds.add(id); } } return getFactory(data).id(featureIds); } }; return (Filter) filter.accept(visitor, null); } public static final Id getVersioningFilter(Filter filter) { if (filter == null || Filter.INCLUDE.equals(filter) || Filter.EXCLUDE.equals(filter)) { return null; } final FilterVisitor ridFinder = new AbstractFinderFilterVisitor() { @Override public Object visit(final Id filter, final Object data) { Set<ResourceId> resourceIds = new HashSet<ResourceId>(); for (Identifier id : filter.getIdentifiers()) { if (id instanceof ResourceId) { // does it contain any actual versioning predicate? ResourceId rid = (ResourceId) id; if (rid.getFeatureVersion() != null || rid.getEndTime() != null || rid.getStartTime() != null || rid.getVersion() != null) { // yes, there's something to query in the version // history resourceIds.add((ResourceId) id); } } else if (id instanceof FeatureId) { FeatureId fid = (FeatureId) id; int idx = fid.getID().indexOf( FeatureId.VERSION_SEPARATOR); if (idx > 0) { String featureId = fid.getID().substring(0, idx); String versionId = fid.getID().substring(idx + 1); resourceIds.add(new ResourceIdImpl(featureId, versionId)); } } } if (resourceIds.size() > 0) { found = true; return CommonFactoryFinder.getFilterFactory2(null).id( resourceIds); } return null; } }; Object found = filter.accept(ridFinder, null); if (found instanceof Id) { return (Id) found; } return null; } }