/* (c) 2015 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wfs; import net.opengis.wfs20.StoredQueryDescriptionType; import org.geoserver.catalog.Catalog; import org.geoserver.platform.GeoServerResourceLoader; import org.geotools.wfs.v2_0.WFS; import org.geotools.wfs.v2_0.WFSConfiguration; import org.geotools.xml.Parser; import org.junit.Assume; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import java.io.*; import java.util.List; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.classextension.EasyMock.createMock; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; public class StoredQueryProviderTest { public static final String MY_STORED_QUERY = "MyStoredQuery"; @Rule public TemporaryFolder tmpFolder = new TemporaryFolder(); public static final String MY_STORED_QUERY_DEFINITION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<wfs:StoredQueryDescription id='MyStoredQuery'" + " xmlns:xlink=\"http://www.w3.org/1999/xlink\"" + " xmlns:ows=\"http://www.opengis.net/ows/1.1\"" + " xmlns:gml=\"http://www.opengis.net/gml/3.2\"" + " xmlns:wfs=\"http://www.opengis.net/wfs/2.0\"" + " xmlns:fes=\"http://www.opengis.net/fes/2.0\">>\n" + " <wfs:Parameter name='AreaOfInterest' type='gml:Polygon'/>\n" + " <wfs:QueryExpressionText\n" + " returnFeatureTypes='topp:states'\n" + " language='urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression'\n" + " isPrivate='false'>\n" + " <wfs:Query typeNames='topp:states'>\n" + " <fes:Filter>\n" + " <fes:Within>\n" + " <fes:ValueReference>the_geom</fes:ValueReference>\n" + " ${AreaOfInterest}\n" + " </fes:Within>\n" + " </fes:Filter>\n" + " </wfs:Query>\n" + " </wfs:QueryExpressionText>\n" + "</wfs:StoredQueryDescription>"; private StoredQueryProvider storedQueryProvider; private File baseDirectory; private Catalog catalog; private GeoServerResourceLoader loader; @Before public void setup() throws IOException { baseDirectory = tmpFolder.newFolder(); catalog = createMock(Catalog.class); loader = new GeoServerResourceLoader(baseDirectory); expect(catalog.getResourceLoader()).andReturn(loader); replay(catalog); storedQueryProvider = new StoredQueryProvider(catalog); } @Test public void whenNoStoredQueriesDefinedAGetFeatureByIdQueryIsReturned() { List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(1)); assertThat(queries.get(0).getName(), is(equalTo("urn:ogc:def:query:OGC-WFS::GetFeatureById"))); assertThat(storedQueryProvider.getStoredQuery("urn:ogc:def:query:OGC-WFS::GetFeatureById"), is(notNullValue())); } @Test public void whenBogusStoredQueryDefinitionCreatedItIsNotReturnedInTheListOfStoredQueries() throws IOException { createMyStoredQueryDefinitionFile(storedQueryProvider.storedQueryDir().dir()); createMyBogusStoredQueryDefinition(); List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(2)); assertThat(storedQueryProvider.getStoredQuery("urn:ogc:def:query:OGC-WFS::GetFeatureById"), is(notNullValue())); assertThat(storedQueryProvider.getStoredQuery(MY_STORED_QUERY), is(notNullValue())); } @Test public void whenStoredQueryDefinitionCreatedByFileItIsReturnedInTheListOfStoredQueries() throws IOException { createMyStoredQueryDefinitionFile(storedQueryProvider.storedQueryDir().dir()); List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(2)); assertThat(storedQueryProvider.getStoredQuery("urn:ogc:def:query:OGC-WFS::GetFeatureById"), is(notNullValue())); assertThat(storedQueryProvider.getStoredQuery(MY_STORED_QUERY).getName(), is(MY_STORED_QUERY)); } @Test public void whenStoredQueryDefinitionCreatedByDescriptionItIsReturnedInTheListOfStoredQueries() throws Exception { StoredQueryDescriptionType storedQueryDescriptionType = createMyStoredQueryDefinitionInStoredQueryDescriptionType(); StoredQuery result = storedQueryProvider.createStoredQuery(storedQueryDescriptionType); assertThat(result.getName(), is(MY_STORED_QUERY)); assertThat(storedQueryProvider.getStoredQuery(MY_STORED_QUERY).getName(), is(MY_STORED_QUERY)); } @Test public void storedQueryDefinitionIsNotRewrittenByListingTheQueries() throws IOException { // c.f. GEOS-7297 File myStoredQueryDefinition = createMyStoredQueryDefinitionFile(storedQueryProvider.storedQueryDir().dir()); try { myStoredQueryDefinition.setReadOnly(); List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(2)); assertThat(storedQueryProvider.getStoredQuery("urn:ogc:def:query:OGC-WFS::GetFeatureById"), is(notNullValue())); assertThat(storedQueryProvider.getStoredQuery(MY_STORED_QUERY).getName(), is(MY_STORED_QUERY)); } finally { myStoredQueryDefinition.setWritable(true); } } @Test public void canRemoveStoredQueryDefinition() throws IOException { File myStoredQueryDefinition = createMyStoredQueryDefinitionFile(storedQueryProvider.storedQueryDir().dir()); List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(2)); StoredQuery myStoredQuery = storedQueryProvider.getStoredQuery(MY_STORED_QUERY); assertThat(myStoredQuery.getName(), is(MY_STORED_QUERY)); storedQueryProvider.removeStoredQuery(myStoredQuery); assertThat(myStoredQueryDefinition.exists(), is(false)); assertThat(storedQueryProvider.getStoredQuery(myStoredQuery.getName()), is(nullValue())); } @Test public void canRemoveAllStoredQueryDefinitions() throws IOException { File myStoredQueryDefinition = createMyStoredQueryDefinitionFile(storedQueryProvider.storedQueryDir().dir()); List<StoredQuery> queries = storedQueryProvider.listStoredQueries(); assertThat(queries, hasSize(2)); storedQueryProvider.removeAll(); assertThat(myStoredQueryDefinition.exists(), is(false)); assertThat(storedQueryProvider.getStoredQuery(MY_STORED_QUERY), is(nullValue())); } @Test public void testGetLanguage() { assertThat(storedQueryProvider.getLanguage(), is(equalTo(storedQueryProvider.LANGUAGE))); } private File createMyStoredQueryDefinitionFile(File storedQueryDir) throws IOException { File storedQueryDefinition = new File(storedQueryDir, MY_STORED_QUERY + ".xml"); Writer writer = new FileWriter(storedQueryDefinition); writer.write(MY_STORED_QUERY_DEFINITION); writer.close(); return storedQueryDefinition; } private StoredQueryDescriptionType createMyStoredQueryDefinitionInStoredQueryDescriptionType() throws Exception { Parser p = new Parser(new WFSConfiguration()); p.setRootElementType(WFS.StoredQueryDescriptionType); StringReader reader = new StringReader(MY_STORED_QUERY_DEFINITION); try { return (StoredQueryDescriptionType) p.parse(reader); } finally { reader.close(); } } private File createMyBogusStoredQueryDefinition() throws IOException { File storedQueryDir = storedQueryProvider.storedQueryDir().dir(); File storedQueryDefinition = new File(storedQueryDir, "MyBogusStoredQuery.xml"); Writer writer = new FileWriter(storedQueryDefinition); writer.write("This is not a well-formed query"); writer.close(); return storedQueryDefinition; } }