/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-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.wps.bindings; import java.io.Reader; import java.io.StringReader; import net.opengis.wfs.FeatureCollectionType; import net.opengis.wps10.ComplexDataType; import net.opengis.wps10.Wps10Factory; import org.geotools.feature.FeatureCollection; import org.geotools.wps.WPS; import org.geotools.wps.WPSConfiguration; import org.geotools.wps.WPSTestSupport; import org.geotools.xml.Encoder; import org.geotools.xml.EncoderDelegate; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.ContentHandler; import org.xml.sax.ext.LexicalHandler; import com.vividsolutions.jts.geom.Polygon; /** * * * @source $URL$ */ public class ComplexDataTypeBindingTest extends WPSTestSupport { public void testParsePolygon() throws Exception { String xml = "<wps:ComplexData xmlns:wps='http://www.opengis.net/wps/1.0.0'>" + "<gml:Polygon xmlns:gml='http://www.opengis.net/gml'>" + "<gml:exterior>" + "<gml:LinearRing>" + "<gml:posList>1 1 2 1 2 2 1 2 1 1</gml:posList>" + "</gml:LinearRing>" + "</gml:exterior>" + "</gml:Polygon>" + "</wps:ComplexData>"; buildDocument(xml); Object o = parse(WPS.ComplexDataType); assertTrue( o instanceof ComplexDataType ); ComplexDataType data = (ComplexDataType) o; assertEquals( 1, data.getData().size() ); assertTrue( data.getData().get( 0 ) instanceof Polygon ); } public void testParseFeatureCollection() throws Exception { String xml = "<wps:ComplexData xmlns:wps='http://www.opengis.net/wps/1.0.0'>" + "<wfs:FeatureCollection xmlns='http://www.opengis.net/wfs' " + "xmlns:wfs='http://www.opengis.net/wfs' xmlns:geotools='http://geotools.org' " + "xmlns:gml='http://www.opengis.net/gml'>" + "<gml:boundedBy>" + "<gml:Envelope srsName='urn:x-ogc:def:crs:EPSG:4326'>" + "<gml:lowerCorner>0 0</gml:lowerCorner>" + "<gml:upperCorner>1 1</gml:upperCorner>" + "</gml:Envelope>" + "</gml:boundedBy>" + "<gml:featureMember>" + "<geotools:feature fid='feature.1'>" + "<geotools:geometry>" + "<gml:LineString>" + "<gml:posList>0 0 1 1</gml:posList>" + "</gml:LineString>" + "</geotools:geometry>" + "<geotools:integer>1</geotools:integer>" + "</geotools:feature>" + "</gml:featureMember>" + "</wfs:FeatureCollection>" + "</wps:ComplexData>"; buildDocument(xml); Object o = parse(WPS.ComplexDataType); assertTrue( o instanceof ComplexDataType ); ComplexDataType data = (ComplexDataType) o; assertEquals( 1, data.getData().size() ); assertTrue( data.getData().get( 0 ) instanceof FeatureCollectionType ); FeatureCollectionType fc = (FeatureCollectionType) data.getData().get( 0 ); assertEquals( 1, fc.getFeature().size() ); FeatureCollection features = (FeatureCollection) fc.getFeature().get( 0 ); assertEquals( 1, features.size() ); } @SuppressWarnings("unchecked") public void testEncodeCData() throws Exception { Wps10Factory factory = Wps10Factory.eINSTANCE; ComplexDataType complexData = factory.createComplexDataType(); complexData.setMimeType("text/plain"); complexData.getData().add(0, new EncoderDelegate() { @Override public void encode(ContentHandler output) throws Exception { ((LexicalHandler) output).startCDATA(); Reader r = new StringReader("test data"); char[] buffer = new char[1024]; int read; while ((read = r.read(buffer)) > 0) { output.characters(buffer, 0, read); } r.close(); ((LexicalHandler) output).endCDATA(); } }); Encoder encoder = new Encoder(new WPSConfiguration()); encoder.setIndenting(true); encoder.setIndentSize(2); encoder.setRootElementType(WPS.ComplexDataType); String xml = encoder.encodeAsString(complexData, WPS.ComplexDataType); // System.out.println(xml); buildDocument(xml); Element element = document.getDocumentElement(); assertEquals("ComplexDataType", element.getLocalName()); assertEquals("text/plain", element.getAttribute("mimeType")); Node node = element.getChildNodes().item(0); assertEquals("test data", node.getTextContent()); } @SuppressWarnings("unchecked") public void testEncodeXML() throws Exception { Wps10Factory factory = Wps10Factory.eINSTANCE; ComplexDataType complexData = factory.createComplexDataType(); complexData.setMimeType("text/xml"); complexData.getData().add(0, new EncoderDelegate() { @Override public void encode(ContentHandler output) throws Exception { String ns = "http://www.geotools.org"; String local = "myElement"; String qualified = "gt:myElement"; output.startPrefixMapping("gt", ns); output.startElement(ns, local, qualified, new org.xml.sax.helpers.AttributesImpl()); String txt = "hello world"; output.characters(txt.toCharArray(), 0, txt.length()); output.endElement(ns, local, qualified); } }); Encoder encoder = new Encoder(new WPSConfiguration()); encoder.setIndenting(true); encoder.setIndentSize(2); encoder.setRootElementType(WPS.ComplexDataType); String xml = encoder.encodeAsString(complexData, WPS.ComplexDataType); // System.out.println(xml); buildDocument(xml); Element element = document.getDocumentElement(); assertEquals("ComplexDataType", element.getLocalName()); assertEquals("text/xml", element.getAttribute("mimeType")); NodeList children = element.getChildNodes(); boolean myElementFound = false; for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Text) { continue; } else { myElementFound |= node.getLocalName().equals("myElement"); assertEquals("hello world", node.getTextContent()); } } assertTrue(myElementFound); } }