/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-2008, 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.geotools.data.wfs.v1_0_0; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import junit.framework.TestCase; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.IllegalFilterException; import org.opengis.filter.And; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.filter.Id; import org.opengis.filter.Or; import org.opengis.filter.identity.FeatureId; /** * FidFilterVisitor is used to fix up feature Ids that have * been modifed (or actually assigned) after a transaction response. * * @author Jesse * * * * @source $URL$ */ public class FidFilterVisitorTest extends TestCase { private UpdateFidFilterVisitor visitor; private FilterFactory2 ff=CommonFactoryFinder.getFilterFactory2(null); private Map<String,String> state; protected void setUp() throws Exception { state=new HashMap<String,String>(); state.put("new1","final1"); state.put("new2","final2"); state.put("new3","final3"); visitor=new UpdateFidFilterVisitor(state); } /** * This is really the only valid thing we have to take care of. */ public void testVisitIdFilter() throws Exception { Set<FeatureId> fidSet = new HashSet<FeatureId>(); fidSet.add( ff.featureId("new1")); fidSet.add( ff.featureId("new2")); Id before = ff.id( fidSet ); Id after = (Id) before.accept( visitor, null ); assertSame( after, after ); assertTrue( after.getIDs().contains("final1") ); assertTrue( after.getIDs().contains("final2") ); } /** Check to make sure others ids are not harmed */ public void testVisitIdFilter2() throws Exception { Set<FeatureId> fidSet = new HashSet<FeatureId>(); fidSet.add( ff.featureId("new1")); fidSet.add( ff.featureId("other")); Id before = ff.id( fidSet ); Id after = (Id) before.accept( visitor, null ); assertSame( after, after ); assertTrue( after.getIDs().contains("final1") ); assertTrue( after.getIDs().contains("other") ); } /** Check to make sure others ids are not harmed */ public void testVisitIdFilter3() throws Exception { Set<FeatureId> fidSet = new HashSet<FeatureId>(); fidSet.add( ff.featureId("new1")); fidSet.add( ff.featureId("new2")); fidSet.add( ff.featureId("new3")); fidSet.add( ff.featureId("other")); Id before = ff.id( fidSet ); Id after = (Id) before.accept( visitor, null ); assertSame( after, after ); assertTrue( after.getIDs().contains("final1") ); assertTrue( after.getIDs().contains("final2") ); assertTrue( after.getIDs().contains("final3") ); assertTrue( after.getIDs().contains("other") ); } /** * Test method for {@link org.geotools.wfs.UpdateFidFilterVisitor.data.FidFilterVisitor#visit(org.geotools.filter.LogicFilter)}. */ public void testVisitLogicFilterOR() throws Exception { Set<FeatureId> fidSet1 = Collections.singleton(ff.featureId("new1")); Set<FeatureId> fidSet2 = Collections.singleton(ff.featureId("new2")); Or before = ff.or( ff.id( fidSet1 ), ff.id( fidSet2 ) ); Or after = (Or) before.accept( visitor, null ); assertSame( after, after ); assertTrue( ((Id)after.getChildren().get(0)).getIDs().contains("final1") ); assertTrue( ((Id)after.getChildren().get(1)).getIDs().contains("final2") ); } /** * Test method for {@link org.geotools.wfs.UpdateFidFilterVisitor.data.FidFilterVisitor#visit(org.geotools.filter.FidFilter)}. */ public void testVisitLogicFilterNOT() { Set<FeatureId> fidSet1 = Collections.singleton(ff.featureId("new1")); Set<FeatureId> fidSet2 = Collections.singleton(ff.featureId("new2")); And before = ff.and( ff.id( fidSet1 ), ff.id( fidSet2 ) ); And after = (And) before.accept( visitor, null ); assertSame( after, after ); assertTrue( ((Id)after.getChildren().get(0)).getIDs().contains("final1") ); assertTrue( ((Id)after.getChildren().get(1)).getIDs().contains("final2") ); } /** * Lets ensure that others kinds of filters are not harmed * @throws IllegalFilterException */ public void testVisitBetweenFilter() { Filter before = ff.between( ff.literal("1"), ff.literal("1"), ff.literal("1")); Filter after = (Filter) before.accept(visitor, null ); assertEquals( before, after ); assertNotSame( before, after); } public void testVisitCompareFilter() { Filter before = ff.less(ff.literal("1"), ff.literal("1") ); Filter after = (Filter) before.accept(visitor, null ); assertEquals( before, after ); assertNotSame( before, after ); } }