/* Copyright (c) 2001 - 2013 OpenPlans - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wps.web; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.transform.dom.DOMSource; import org.custommonkey.xmlunit.SimpleNamespaceContext; import org.custommonkey.xmlunit.XMLUnit; import org.easymock.classextension.EasyMock; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.NamespaceInfo; import org.geoserver.web.GeoServerWicketTestSupport; import org.geoserver.wps.web.InputParameterValues.ParameterType; import org.geoserver.wps.web.InputParameterValues.ParameterValue; import org.geoserver.wps.xml.WPSConfiguration; import org.geotools.feature.NameImpl; import org.geotools.xml.Parser; import org.junit.Before; import org.junit.Test; import org.opengis.feature.type.Name; import org.w3c.dom.Document; import org.xml.sax.SAXParseException; public class WPSExecuteTransformerTest extends GeoServerWicketTestSupport { @Before public void setUpInternal() throws Exception { // init xmlunit Map<String, String> namespaces = new HashMap<String, String>(); namespaces.put("wps", "http://www.opengis.net/wps/1.0.0"); namespaces.put("ows", "http://www.opengis.net/ows/1.1"); namespaces.put("gml", "http://www.opengis.net/gml"); namespaces.put("wfs", "http://www.opengis.net/wfs"); namespaces.put("xlink", "http://www.w3.org/1999/xlink"); namespaces.put("xsi", "http://www.w3.org/2001/XMLSchema-instance"); namespaces.put("feature", "http://geoserver.sf.net"); XMLUnit.setXpathNamespaceContext(new SimpleNamespaceContext(namespaces)); } @Test public void testSingleProcess() throws Exception { ExecuteRequest executeBuffer = getExecuteBuffer(); WPSExecuteTransformer tx = new WPSExecuteTransformer(); tx.setIndentation(2); String xml = tx.transform(executeBuffer); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<wps:Execute version=\"1.0.0\" service=\"WPS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xmlns=\"http://www.opengis.net/wps/1.0.0\" xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:wps=\"http://www.opengis.net/wps/1.0.0\" xmlns:ows=\"http://www.opengis.net/ows/1.1\" " + "xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" " + "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\">\n" + " <ows:Identifier>JTS:buffer</ows:Identifier>\n" + " <wps:DataInputs>\n" + " <wps:Input>\n" + " <ows:Identifier>geom</ows:Identifier>\n" + " <wps:Data>\n" + " <wps:ComplexData mimeType=\"application/wkt\"><![CDATA[POINT(0 0)]]></wps:ComplexData>\n" + " </wps:Data>\n" + " </wps:Input>\n" + " <wps:Input>\n" + " <ows:Identifier>distance</ows:Identifier>\n" + " <wps:Data>\n" + " <wps:LiteralData>10</wps:LiteralData>\n" + " </wps:Data>\n" + " </wps:Input>\n" + " </wps:DataInputs>\n" + " <wps:ResponseForm>\n" + " <wps:RawDataOutput mimeType=\"text/xml; subtype=gml/3.1.1\">\n" + " <ows:Identifier>result</ows:Identifier>\n" + " </wps:RawDataOutput>\n" + " </wps:ResponseForm>\n" + "</wps:Execute>"; Document test = XMLUnit.buildTestDocument(xml); checkValidationErrors(test); Document control = XMLUnit.buildControlDocument(expected); assertXMLEqual(control, test); } @Test public void testSubprocess() throws Exception { Name areaName = new NameImpl("JTS", "area"); InputParameterValues areaGeomValues = new InputParameterValues(areaName, "geom"); ParameterValue geom = areaGeomValues.values.get(0); geom.setType(ParameterType.SUBPROCESS); geom.setValue(getExecuteBuffer()); OutputParameter bufferOutput = new OutputParameter(areaName, "result"); ExecuteRequest executeArea = new ExecuteRequest(areaName.getURI(), Arrays.asList( areaGeomValues), Arrays.asList(bufferOutput)); WPSExecuteTransformer tx = new WPSExecuteTransformer(); tx.setIndentation(2); String xml = tx.transform(executeArea); // System.out.println(xml); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<wps:Execute version=\"1.0.0\" service=\"WPS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.opengis.net/wps/1.0.0\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:wps=\"http://www.opengis.net/wps/1.0.0\" xmlns:ows=\"http://www.opengis.net/ows/1.1\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\">\n" + " <ows:Identifier>JTS:area</ows:Identifier>\n" + " <wps:DataInputs>\n" + " <wps:Input>\n" + " <ows:Identifier>geom</ows:Identifier>\n" + " <wps:Reference mimeType=\"text/xml; subtype=gml/3.1.1\" xlink:href=\"http://geoserver/wps\" method=\"POST\">\n" + " <wps:Body>\n" + " <wps:Execute version=\"1.0.0\" service=\"WPS\">\n" + " <ows:Identifier>JTS:buffer</ows:Identifier>\n" + " <wps:DataInputs>\n" + " <wps:Input>\n" + " <ows:Identifier>geom</ows:Identifier>\n" + " <wps:Data>\n" + " <wps:ComplexData mimeType=\"application/wkt\"><![CDATA[POINT(0 0)]]></wps:ComplexData>\n" + " </wps:Data>\n" + " </wps:Input>\n" + " <wps:Input>\n" + " <ows:Identifier>distance</ows:Identifier>\n" + " <wps:Data>\n" + " <wps:LiteralData>10</wps:LiteralData>\n" + " </wps:Data>\n" + " </wps:Input>\n" + " </wps:DataInputs>\n" + " <wps:ResponseForm>\n" + " <wps:RawDataOutput mimeType=\"text/xml; subtype=gml/3.1.1\">\n" + " <ows:Identifier>result</ows:Identifier>\n" + " </wps:RawDataOutput>\n" + " </wps:ResponseForm>\n" + " </wps:Execute>\n" + " </wps:Body>\n" + " </wps:Reference>\n" + " </wps:Input>\n" + " </wps:DataInputs>\n" + " <wps:ResponseForm>\n" + " <wps:RawDataOutput>\n" + " <ows:Identifier>result</ows:Identifier>\n" + " </wps:RawDataOutput>\n" + " </wps:ResponseForm>\n" + "</wps:Execute>"; Document test = XMLUnit.buildTestDocument(xml); checkValidationErrors(test); Document control = XMLUnit.buildControlDocument(expected); assertXMLEqual(control, test); } private ExecuteRequest getExecuteBuffer() { Name bufferName = new NameImpl("JTS", "buffer"); InputParameterValues bufferGeomValues = new InputParameterValues(bufferName, "geom"); ParameterValue geom = bufferGeomValues.values.get(0); geom.setMime("application/wkt"); geom.setType(ParameterType.TEXT); geom.setValue("POINT(0 0)"); InputParameterValues bufferDistanceValues = new InputParameterValues(bufferName, "distance"); ParameterValue distance = bufferDistanceValues.values.get(0); distance.setType(ParameterType.LITERAL); distance.setValue("10"); OutputParameter bufferOutput = new OutputParameter(bufferName, "result"); ExecuteRequest executeBuffer = new ExecuteRequest(bufferName.getURI(), Arrays.asList( bufferGeomValues, bufferDistanceValues), Arrays.asList(bufferOutput)); return executeBuffer; } /** * Validates a document against the * @param dom * @param configuration */ protected void checkValidationErrors(Document dom) throws Exception { Parser p = new Parser(new WPSConfiguration()); p.setValidating( true ); p.parse( new DOMSource( dom ) ); if ( !p.getValidationErrors().isEmpty() ) { for ( Iterator e = p.getValidationErrors().iterator(); e.hasNext(); ) { SAXParseException ex = (SAXParseException) e.next(); System.out.println( ex.getLineNumber() + "," + ex.getColumnNumber() + " -" + ex.toString() ); } fail( "Document did not validate."); } } @Test public void testIncludeNamespaceMapping() throws Exception { Name centroidName = new NameImpl("gs", "Centroid"); InputParameterValues inputValues = new InputParameterValues(centroidName, "features"); VectorLayerConfiguration layer = new VectorLayerConfiguration(); layer.setLayerName("foo:myLayer"); ParameterValue features = inputValues.values.get(0); features.setType(ParameterType.VECTOR_LAYER); features.setValue(layer); OutputParameter output = new OutputParameter(centroidName, "result"); ExecuteRequest execute = new ExecuteRequest(centroidName.getURI(), Arrays.asList(inputValues), Arrays.asList(output)); NamespaceInfo fooNs = EasyMock.createNiceMock(NamespaceInfo.class); expect(fooNs.getURI()).andReturn("http://foo.org"); replay(fooNs); Catalog cat = createNiceMock(Catalog.class); expect(cat.getNamespaceByPrefix("foo")).andReturn(fooNs); replay(cat); WPSExecuteTransformer tx = new WPSExecuteTransformer(cat); tx.setIndentation(2); String xml = tx.transform(execute); assertTrue(xml.contains("xmlns:foo=\"http://foo.org\"")); } }