/* * 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.HashMap; import java.util.Map; import junit.framework.TestCase; import org.geotools.data.DataUtilities; import org.geotools.data.wfs.v1_0_0.Action.InsertAction; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.filter.CompareFilter; import org.geotools.filter.FidFilter; import org.geotools.filter.Filter; import org.geotools.filter.FilterFactory; import org.geotools.filter.FilterFactoryFinder; import org.geotools.filter.FilterType; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.filter.PropertyIsEqualTo; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; /** * Testing the ability of WFS to turn transaction state into a series of actions * for encoding into a Transaction request. * <p> * This test focuses on ability to combine a bunch of update actions for the same * feature into a single action. * * @author Jesse * * @source $URL$ */ public class ProcessEditsBeforeCommitTest extends TestCase { private static final PropertyIsEqualTo CUSTOM_FILTERALL; private static FilterFactory filterFac=FilterFactoryFinder.createFilterFactory(); static{ CUSTOM_FILTERALL=filterFac.equals( filterFac.createLiteralExpression(1), filterFac.createLiteralExpression(2) ); } private WFSTransactionState state; private SimpleFeatureType featureType; private String typename; private String GEOM_ATT="geom"; private String NAME_ATT="name"; protected void setUp() throws Exception { super.setUp(); state=new WFSTransactionState(null); typename="Type"; featureType=DataUtilities.createType(typename, GEOM_ATT+":Point,"+NAME_ATT+":String"); } private SimpleFeature createFeature(int x, int y, String name) throws IllegalAttributeException { GeometryFactory fac=new GeometryFactory(); Object p = fac.createPoint(new Coordinate(x,y)); return SimpleFeatureBuilder.build( featureType, new Object[]{p,name}, null ); } public void testBasicInsertFIDFilterUpdateCollapse() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); Map properties=new HashMap(); properties.put(NAME_ATT, "newName"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), properties)); state.combineActions(); Action.InsertAction action=(InsertAction) state.getActions(featureType.getTypeName()).get(0); assertEquals(1, state.getActions(featureType.getTypeName()).size()); assertEquals("newName", action.getFeature().getAttribute(NAME_ATT)); assertTrue(((Point)createFeature.getAttribute(GEOM_ATT)).equals((Point)action.getFeature().getAttribute(GEOM_ATT))); } public void testMultiInsertUpdateCollapse() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature(10,10,NAME_ATT))); Map properties=new HashMap(); properties.put(NAME_ATT, "newName"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), properties)); state.combineActions(); Action.InsertAction action=(InsertAction) state.getActions(featureType.getTypeName()).get(0); assertTrue(state.getActions(featureType.getTypeName()).get(1) instanceof InsertAction); assertEquals(2, state.getActions(featureType.getTypeName()).size()); assertEquals("newName", action.getFeature().getAttribute(NAME_ATT)); assertTrue(((Point)createFeature.getAttribute(GEOM_ATT)).equals((Point)action.getFeature().getAttribute(GEOM_ATT))); } public void testMultiFIDFilterUpdateCollapse() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); Map properties=new HashMap(); properties.put(NAME_ATT, "newName"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), properties)); properties.put(NAME_ATT, "secondUpdate"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), properties)); state.combineActions(); Action.InsertAction action=(InsertAction) state.getActions(featureType.getTypeName()).get(0); assertEquals(1, state.getActions(featureType.getTypeName()).size()); assertEquals("secondUpdate", action.getFeature().getAttribute(NAME_ATT)); assertTrue(((Point)createFeature.getAttribute(GEOM_ATT)).equals((Point)action.getFeature().getAttribute(GEOM_ATT))); } public void testFidAndNonFidFilterUpdates() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); Map updateProperties=new HashMap(); updateProperties.put(NAME_ATT, "noMatch"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, Filter.INCLUDE, updateProperties)); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); updateProperties.put(NAME_ATT, "newName"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), updateProperties)); updateProperties.put(NAME_ATT, "secondUpdate"); CompareFilter matchFilter=filterFac.createCompareFilter(FilterType.COMPARE_EQUALS); matchFilter.addLeftValue(filterFac.createAttributeExpression("name")); matchFilter.addRightValue(filterFac.createLiteralExpression("newName")); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, matchFilter, updateProperties)); updateProperties.put(NAME_ATT, "secondNoMatch"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, CUSTOM_FILTERALL, updateProperties)); state.combineActions(); Action.InsertAction action=(InsertAction) state.getActions(featureType.getTypeName()).get(3); assertEquals(4, state.getActions(featureType.getTypeName()).size()); assertEquals("secondUpdate", action.getFeature().getAttribute(NAME_ATT)); assertTrue(((Point)createFeature.getAttribute(GEOM_ATT)).equals((Point)action.getFeature().getAttribute(GEOM_ATT))); } public void testDeleteAndInsert() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); Map updateProperties=new HashMap(); updateProperties.put(NAME_ATT, "noMatch"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, Filter.INCLUDE, updateProperties)); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); updateProperties.put(NAME_ATT, "newName"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), updateProperties)); updateProperties.put(NAME_ATT, "secondUpdate"); CompareFilter matchFilter=filterFac.createCompareFilter(FilterType.COMPARE_EQUALS); matchFilter.addLeftValue(filterFac.createAttributeExpression("name")); matchFilter.addRightValue(filterFac.createLiteralExpression("newName")); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, matchFilter, updateProperties)); updateProperties.put(NAME_ATT, "secondNoMatch"); state.addAction(featureType.getTypeName(), new Action.UpdateAction(typename, CUSTOM_FILTERALL, updateProperties)); state.combineActions(); Action.InsertAction action=(InsertAction) state.getActions(featureType.getTypeName()).get(3); assertEquals(4, state.getActions(featureType.getTypeName()).size()); assertEquals("secondUpdate", action.getFeature().getAttribute(NAME_ATT)); assertTrue(((Point)createFeature.getAttribute(GEOM_ATT)).equals((Point)action.getFeature().getAttribute(GEOM_ATT))); } public void testInsertAndDelete() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); state.addAction(featureType.getTypeName(), new Action.InsertAction(createFeature)); state.addAction(featureType.getTypeName(), new Action.DeleteAction(typename, filterFac.createFidFilter(createFeature.getID()))); state.combineActions(); assertEquals(0, state.getActions(featureType.getTypeName()).size()); } public void testUpdatesDeletesAndInsertes() throws Exception { SimpleFeature createFeature = createFeature(0,0,NAME_ATT); Map updateProperties=new HashMap(); updateProperties.put(NAME_ATT, "noMatch"); //create delete actions Action.DeleteAction deleteNone = new Action.DeleteAction(typename, CUSTOM_FILTERALL); FidFilter createFidFilter = filterFac.createFidFilter(); createFidFilter.addFid(createFeature.getID()); createFidFilter.addFid("someotherfid"); Action.DeleteAction deleteInsert1 = new Action.DeleteAction(typename, createFidFilter); //create update actions Action.UpdateAction updateAll = new Action.UpdateAction(typename, Filter.INCLUDE, updateProperties); updateProperties.put(NAME_ATT, "newName"); Action.UpdateAction updateInsert1 = new Action.UpdateAction(typename, filterFac.createFidFilter(createFeature.getID()), updateProperties); updateProperties.put(NAME_ATT, "secondUpdate"); CompareFilter matchFilter=filterFac.createCompareFilter(FilterType.COMPARE_EQUALS); matchFilter.addLeftValue(filterFac.createAttributeExpression("name")); matchFilter.addRightValue(filterFac.createLiteralExpression("newName")); Action.UpdateAction updateManyIncludingInsert1 = new Action.UpdateAction(typename, matchFilter, updateProperties); updateProperties.put(NAME_ATT, "secondNoMatch"); Action.UpdateAction updateNone = new Action.UpdateAction(typename, CUSTOM_FILTERALL, updateProperties); // create Insert actions Action.InsertAction insertAction = new Action.InsertAction(createFeature); Action.InsertAction insertAction2 = new Action.InsertAction(createFeature(10,10,"name")); state.addAction(featureType.getTypeName(), updateAll); state.addAction(featureType.getTypeName(), insertAction); state.addAction(featureType.getTypeName(), updateInsert1); state.addAction(featureType.getTypeName(), insertAction2); state.addAction(featureType.getTypeName(), deleteInsert1); state.addAction(featureType.getTypeName(), deleteNone); state.addAction(featureType.getTypeName(), updateManyIncludingInsert1); state.addAction(featureType.getTypeName(), updateNone); state.combineActions(); assertEquals(6, state.getActions(featureType.getTypeName()).size()); assertSame(updateAll, state.getActions(featureType.getTypeName()).get(0)); assertSame(deleteInsert1, state.getActions(featureType.getTypeName()).get(1)); assertSame(deleteNone, state.getActions(featureType.getTypeName()).get(2)); assertSame(updateManyIncludingInsert1, state.getActions(featureType.getTypeName()).get(3)); assertSame(updateNone, state.getActions(featureType.getTypeName()).get(4)); assertSame(insertAction2, state.getActions(featureType.getTypeName()).get(5)); } }