/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testPolygon() throws XMLStreamException, FactoryConfigurationError, IOException, UnknownCRSException, TransformationException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + POLYGON_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Polygon"), xmlReader.getName()); Polygon polygon = new GML2GeometryReader().parsePolygon(xmlReader, null); Assert.assertEquals(XMLStreamConstants.END_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Polygon"), xmlReader.getName()); Points points = polygon.getExteriorRing().getControlPoints(); comparePoint(0.0, 0.0, points.get(0)); comparePoint(100.0, 0.0, points.get(1)); comparePoint(100.0, 100.0, points.get(2)); comparePoint(0.0, 100.0, points.get(3)); comparePoint(0.0, 0.0, points.get(4)); List<Points> innerPoints = polygon.getInteriorRingsCoordinates(); Points points1 = innerPoints.get(0); comparePoint(10.0, 10.0, points1.get(0)); comparePoint(10.0, 40.0, points1.get(1)); comparePoint(40.0, 40.0, points1.get(2)); comparePoint(40.0, 10.0, points1.get(3)); comparePoint(10.0, 10.0, points1.get(4)); Points points2 = innerPoints.get(1); comparePoint(60.0, 60.0, points2.get(0)); comparePoint(60.0, 90.0, points2.get(1)); comparePoint(90.0, 90.0, points2.get(2)); comparePoint(90.0, 60.0, points2.get(3)); comparePoint(60.0, 60.0, points2.get(4)); Assert.assertEquals( CRSRegistry.lookup("http://www.opengis.net/gml/srs/epsg.xml#4326"), polygon.getCoordinateSystem().getWrappedCRS()); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); writer.setPrefix("gml", "http://www.opengis.net/gml"); writer.setPrefix("xlink", "http://www.w3.org/1999/xlink"); exporter.export(polygon); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testBox() throws XMLStreamException, FactoryConfigurationError, IOException, UnknownCRSException, TransformationException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + BOX_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Box"), xmlReader.getName()); Envelope envelope = new GML2GeometryReader().parseEnvelope(xmlReader, null); Assert.assertEquals(XMLStreamConstants.END_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Box"), xmlReader.getName()); Assert.assertEquals(0.0, envelope.getMin().get0(), DELTA); Assert.assertEquals(0.0, envelope.getMin().get1(), DELTA); Assert.assertEquals(100.0, envelope.getMax().get0(), DELTA); Assert.assertEquals(100.0, envelope.getMax().get1(), DELTA); Assert.assertEquals( CRSRegistry.lookup("http://www.opengis.net/gml/srs/epsg.xml#4326"), envelope.getCoordinateSystem().getWrappedCRS()); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); // writer.setPrefix( "app", "http://www.deegree.org" ); // writer.setPrefix( "app", "http://www.deegree.org/app" ); writer.setPrefix("gml", "http://www.opengis.net/gml"); // writer.setPrefix( "ogc", "http://www.opengis.net/ogc" ); // writer.setPrefix( "wfs", "http://www.opengis.net/wfs" ); // writer.setPrefix( "xlink", "http://www.w3.org/1999/xlink" ); // writer.setPrefix( "xsi", "http://www.w3.org/2001/XMLSchema-instance" ); exporter.export(envelope); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testMultiGeometry() throws XMLStreamException, FactoryConfigurationError, IOException, TransformationException, UnknownCRSException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + MULTIGEOMETRY_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "MultiGeometry"), xmlReader.getName()); MultiGeometry<?> multiGeometry = new GML2GeometryReader().parseMultiGeometry(xmlReader, null); assertEquals("c731", multiGeometry.getId()); Point firstMember = (Point) multiGeometry.get(0); assertEquals("P6776", firstMember.getId()); comparePoint(50.0, 50.0, firstMember); LineString secondMember = (LineString) multiGeometry.get(1); assertEquals("L21216", secondMember.getId()); Points controlPoints = secondMember.getControlPoints(); comparePoint(0.0, 0.0, controlPoints.get(0)); comparePoint(0.0, 50.0, controlPoints.get(1)); comparePoint(100.0, 50.0, controlPoints.get(2)); Polygon thirdMember = (Polygon) multiGeometry.get(2); assertEquals("_877789", thirdMember.getId()); Points points = thirdMember.getExteriorRing().getControlPoints(); comparePoint(0.0, 0.0, points.get(0)); comparePoint(100.0, 0.0, points.get(1)); comparePoint(50.0, 100.0, points.get(2)); comparePoint(0.0, 0.0, points.get(3)); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); writer.setPrefix("gml", "http://www.opengis.net/gml"); writer.setPrefix("xlink", "http://www.w3.org/1999/xlink"); exporter.export(multiGeometry); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testPoint() throws XMLStreamException, FactoryConfigurationError, IOException, UnknownCRSException, TransformationException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + POINT_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Point"), xmlReader.getName()); Point point = new GML2GeometryReader().parsePoint(xmlReader, null); Assert.assertEquals(XMLStreamConstants.END_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "Point"), xmlReader.getName()); Assert.assertEquals(5.0, point.get0(), DELTA); Assert.assertEquals(40.0, point.get1(), DELTA); Assert.assertEquals( CRSRegistry.lookup("http://www.opengis.net/gml/srs/epsg.xml#4326"), point.getCoordinateSystem().getWrappedCRS()); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); writer.setPrefix("gml", "http://www.opengis.net/gml"); exporter.export(point); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testMultiLineString() throws XMLStreamException, FactoryConfigurationError, IOException, TransformationException, UnknownCRSException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + MULTILINESTRING_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "MultiLineString"), xmlReader.getName()); MultiLineString multiLineString = new GML2GeometryReader().parseMultiLineString(xmlReader, null); LineString firstMember = multiLineString.get(0); Points controlPoints = firstMember.getControlPoints(); comparePoint(56.1, 0.45, controlPoints.get(0)); comparePoint(67.23, 0.98, controlPoints.get(1)); LineString secondMember = multiLineString.get(1); controlPoints = secondMember.getControlPoints(); comparePoint(46.71, 9.25, controlPoints.get(0)); comparePoint(56.88, 10.44, controlPoints.get(1)); LineString thirdMember = multiLineString.get(2); controlPoints = thirdMember.getControlPoints(); comparePoint(324.1, 219.7, controlPoints.get(0)); comparePoint(0.45, 4.56, controlPoints.get(1)); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); writer.setPrefix("gml", "http://www.opengis.net/gml"); writer.setPrefix("xlink", "http://www.w3.org/1999/xlink"); exporter.export(multiLineString); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * @throws XMLStreamException * @throws FactoryConfigurationError * @throws IOException * @throws UnknownCRSException * @throws TransformationException */ @Test public void testMultiPoint() throws XMLStreamException, FactoryConfigurationError, IOException, TransformationException, UnknownCRSException { XMLStreamReaderWrapper xmlReader = new XMLStreamReaderWrapper(this.getClass().getResource(BASE_DIR + MULTIPOINT_FILE)); xmlReader.nextTag(); Assert.assertEquals(XMLStreamConstants.START_ELEMENT, xmlReader.getEventType()); Assert.assertEquals(new QName(GML21NS, "MultiPoint"), xmlReader.getName()); MultiPoint multiPoint = new GML2GeometryReader().parseMultiPoint(xmlReader, null); Point firstMember = multiPoint.get(0); comparePoint(5.0, 40.0, firstMember); Point secondMember = multiPoint.get(1); comparePoint(0.0, 0.0, secondMember); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", new Boolean(true)); XMLMemoryStreamWriter memoryWriter = new XMLMemoryStreamWriter(); SchemaLocationXMLStreamWriter writer = new SchemaLocationXMLStreamWriter( memoryWriter.getXMLStreamWriter(), SCHEMA_LOCATION_ATTRIBUTE); GML2GeometryWriter exporter = new GML2GeometryWriter(writer, null, null, new HashSet<String>()); writer.setPrefix("gml", "http://www.opengis.net/gml"); writer.setPrefix("xlink", "http://www.w3.org/1999/xlink"); exporter.export(multiPoint); writer.flush(); XMLAssert.assertValidity(memoryWriter.getReader(), SCHEMA_LOCATION); }
/** * Returns the object representation for the feature (or feature collection) element event that * the cursor of the given <code>XMLStreamReader</code> points at. * * @param xmlStream cursor must point at the <code>START_ELEMENT</code> event of the feature * element, afterwards points at the next event after the <code>END_ELEMENT</code> event of * the feature element * @param crs default CRS for all descendant geometry properties * @return object representation for the given feature element * @throws XMLStreamException * @throws UnknownCRSException * @throws XMLParsingException */ public Feature parseFeature(XMLStreamReaderWrapper xmlStream, CRS crs) throws XMLStreamException, XMLParsingException, UnknownCRSException { if (schema == null) { schema = buildApplicationSchema(xmlStream); } Feature feature = null; String fid = parseFeatureId(xmlStream); QName featureName = xmlStream.getName(); FeatureType ft = lookupFeatureType(xmlStream, featureName); LOG.debug("- parsing feature, gml:id=" + fid + " (begin): " + xmlStream.getCurrentEventInfo()); // parse properties Iterator<PropertyType<?>> declIter = ft.getPropertyDeclarations(version).iterator(); PropertyType activeDecl = declIter.next(); int propOccurences = 0; CRS activeCRS = crs; List<Property<?>> propertyList = new ArrayList<Property<?>>(); xmlStream.nextTag(); while (xmlStream.getEventType() == START_ELEMENT) { QName propName = xmlStream.getName(); LOG.debug("- property '" + propName + "'"); if (findConcretePropertyType(propName, activeDecl) != null) { // current property element is equal to active declaration if (activeDecl.getMaxOccurs() != -1 && propOccurences > activeDecl.getMaxOccurs()) { String msg = Messages.getMessage( "ERROR_PROPERTY_TOO_MANY_OCCURENCES", propName, activeDecl.getMaxOccurs(), ft.getName()); throw new XMLParsingException(xmlStream, msg); } } else { // current property element is not equal to active declaration while (declIter.hasNext() && findConcretePropertyType(propName, activeDecl) == null) { if (propOccurences < activeDecl.getMinOccurs()) { String msg = null; if (activeDecl.getMinOccurs() == 1) { msg = Messages.getMessage( "ERROR_PROPERTY_MANDATORY", activeDecl.getName(), ft.getName()); } else { msg = Messages.getMessage( "ERROR_PROPERTY_TOO_FEW_OCCURENCES", activeDecl.getName(), activeDecl.getMinOccurs(), ft.getName()); } throw new XMLParsingException(xmlStream, msg); } activeDecl = declIter.next(); propOccurences = 0; } if (findConcretePropertyType(propName, activeDecl) == null) { String msg = Messages.getMessage("ERROR_PROPERTY_UNEXPECTED", propName, ft.getName()); throw new XMLParsingException(xmlStream, msg); } } Property<?> property = parseProperty( xmlStream, findConcretePropertyType(propName, activeDecl), activeCRS, propOccurences); if (property != null) { // if this is the "gml:boundedBy" property, override active CRS (see GML spec. (where???)) if (StandardGMLFeatureProps.PT_BOUNDED_BY_GML31.getName().equals(activeDecl.getName())) { Envelope bbox = (Envelope) property.getValue(); if (bbox.getCoordinateSystem() != null) { activeCRS = bbox.getCoordinateSystem(); LOG.debug("- crs (from boundedBy): '" + activeCRS + "'"); } } propertyList.add(property); } propOccurences++; xmlStream.nextTag(); } LOG.debug(" - parsing feature (end): " + xmlStream.getCurrentEventInfo()); feature = ft.newFeature(fid, propertyList, version); if (fid != null && !"".equals(fid)) { if (idContext.getObject(fid) != null) { String msg = Messages.getMessage("ERROR_FEATURE_ID_NOT_UNIQUE", fid); throw new XMLParsingException(xmlStream, msg); } idContext.addObject(feature); } return feature; }