FeatureDecoder.java
- package de.turnertech.ows.gml;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import de.turnertech.ows.Logging;
- public class FeatureDecoder {
- public static IFeature decode(Node xmlRootNode, GmlDecoderContext gmlContext, FeatureType featureType) {
- Feature returnFeature = featureType.createInstance();
- xmlRootNode.normalize();
- gmlContext.setFeatureType(featureType);
- gmlContext.getSrsDeque().push(featureType.getSrs());
- NodeList propertyNodes = xmlRootNode.getChildNodes();
- for(int i = 0; i < propertyNodes.getLength(); ++i) {
- Node propertyNode = propertyNodes.item(i);
- if(propertyNode.getNodeType() != Node.ELEMENT_NODE) {
- continue;
- }
- String propertyName = propertyNode.getLocalName();
- String propertyNamespace = propertyNode.getNamespaceURI();
- //TODO: Here we need to rely on the FeatureType, and its map of FeatureProperty instances, which will
- //contain type information needed for handling casting to the correct data type.
- if(!featureType.hasProperty(propertyName)) {
- // TODO: Throw Exception
- return null;
- }
-
- FeatureProperty featureProperty = featureType.getProperty(propertyName);
- if(featureProperty.getPropertyType() == FeaturePropertyType.TEXT) {
- returnFeature.setPropertyValue(propertyName, propertyNode.getTextContent());
- } else if(featureProperty.getPropertyType() == FeaturePropertyType.POLYGON) {
- Element element = (Element)propertyNode;
- returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("Polygon").item(0), gmlContext));
- } else if(featureProperty.getPropertyType() == FeaturePropertyType.POINT) {
- Element element = (Element)propertyNode;
- returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("Point").item(0), gmlContext));
- } else if(featureProperty.getPropertyType() == FeaturePropertyType.LINE_STRING) {
- Element element = (Element)propertyNode;
- returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("LineString").item(0), gmlContext));
- } else if(featureProperty.getPropertyType() == FeaturePropertyType.ID) {
- returnFeature.setPropertyValue(propertyName, propertyNode.getTextContent());
- } else if(featureProperty.getPropertyType() == FeaturePropertyType.GEOMETRY) {
- NodeList children = propertyNode.getChildNodes();
- for(int c = 0; c < children.getLength(); ++c) {
- Node child = children.item(c);
- if(child.getNodeType() == Node.ELEMENT_NODE) {
- returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode((Element)child, gmlContext));
- break;
- }
- }
- } else {
- Logging.LOG.severe("FeatureDecoder: Property was not decoded - " + propertyName);
- }
- }
- gmlContext.getFeatureIdRetriever().retrieveFeatureId(returnFeature);
- return returnFeature;
- }
-
- }