/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2012, 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.shapefile; import static org.geotools.data.shapefile.ShapefileDataStoreFactory.ENABLE_SPATIAL_INDEX; import static org.geotools.data.shapefile.ShapefileDataStoreFactory.FSTYPE; import static org.geotools.data.shapefile.ShapefileDataStoreFactory.URLP; import static org.junit.Assert.*; import java.io.File; import java.io.Serializable; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.geotools.TestData; import org.geotools.data.DataStore; import org.geotools.data.QueryCapabilities; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.util.KVP; import org.junit.After; import org.junit.Test; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.Name; import org.opengis.filter.sort.SortBy; import org.opengis.filter.sort.SortOrder; /** * Test the functionality of ShapefileDataStoreFactory; specifically the handling of * connection parameters. * * @author Jody Garnett */ public class ShapefileDataStoreFactoryTest extends TestCaseSupport { private ShapefileDataStore store = null; private ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory(); @After public void tearDown() throws Exception { if(store != null) { store.dispose(); } super.tearDown(); } @Test public void testFSTypeParameter() throws Exception { URL url = TestData.url(STATE_POP); KVP params = new KVP( URLP.key,url ); assertTrue( "Sorting is optional", factory.canProcess(params) ); params.put( FSTYPE.key, "shape-ng" ); assertTrue( "Shape NG supported", factory.canProcess(params) ); params.put(FSTYPE.key, "shape" ); assertTrue( "Plain shape supported", factory.canProcess(params) ); params.put(FSTYPE.key, "index" ); assertTrue( "Plain index supported", factory.canProcess(params) ); params.put( FSTYPE.key, "smurf" ); assertFalse( "Feeling blue; don't try a smruf", factory.canProcess(params) ); } @Test public void testQueryCapabilities() throws Exception { URL url = TestData.url(STATE_POP); Map params = new KVP( URLP.key,url ); DataStore dataStore = factory.createDataStore( params ); Name typeName = dataStore.getNames().get(0); SimpleFeatureSource featureSource = dataStore.getFeatureSource( typeName); QueryCapabilities caps = featureSource.getQueryCapabilities(); SortBy[] sortBy = new SortBy[]{SortBy.NATURAL_ORDER,}; assertTrue( "Natural", caps.supportsSorting( sortBy )); SimpleFeatureType schema = featureSource.getSchema(); String attr = schema.getDescriptor(1).getLocalName(); sortBy[0] = ff.sort( attr, SortOrder.ASCENDING ); assertTrue( "Sort "+attr, caps.supportsSorting( sortBy )); sortBy[0] = ff.sort( "the_geom", SortOrder.ASCENDING ); assertFalse( "Cannot sort the_geom", caps.supportsSorting( sortBy )); } @Test public void testEnableIndexParameter() throws Exception { Map<String, Serializable> params; ShapefileDataStore ds; // remote (jar file) shapefiles URL remoteUrl = TestData.url(STATE_POP); // local shapefiles (copied out of jar) File f = copyShapefiles(STATE_POP); URL localUrl = f.toURI().toURL(); // test remote file has spatial index disabled even if requested params = map(URLP.key, remoteUrl, ENABLE_SPATIAL_INDEX.key, true); ds = (ShapefileDataStore) factory.createDataStore(params); assertNotNull("Null datastore should not be returned", ds); assertTrue("should be a non indexed shapefile", ds instanceof org.geotools.data.shapefile.ShapefileDataStore); ds.dispose(); // test default has spatial index enabled params = map(URLP.key, localUrl); ds = (ShapefileDataStore) factory.createDataStore(params); assertNotNull("Null datastore should not be returned", ds); assertTrue(ds.isIndexed()); assertTrue(ds.isIndexCreationEnabled()); ds.dispose(); // test disable works params = map(URLP.key, localUrl, ENABLE_SPATIAL_INDEX.key, false); ds = (ShapefileDataStore) factory.createDataStore(params); assertNotNull("Null datastore should not be returned", ds); assertFalse(ds.isIndexed()); assertFalse(ds.isIndexCreationEnabled()); ds.dispose(); // text explicit enable works params = map(URLP.key, localUrl, ENABLE_SPATIAL_INDEX.key, true); ds = (ShapefileDataStore) factory.createDataStore(params); assertNotNull("Null datastore should not be returned", ds); assertTrue(ds.isIndexed()); assertTrue(ds.isIndexCreationEnabled()); ds.dispose(); } private Map<String, Serializable> map(Object... pairs) { if ((pairs.length & 1) != 0) { throw new IllegalArgumentException("Pairs was not an even number"); } Map<String, Serializable> result = new HashMap<String, Serializable>(); for (int i = 0; i < pairs.length; i += 2) { String key = (String) pairs[i]; Serializable value = (Serializable) pairs[i + 1]; result.put(key, value); } return result; } }