FeatureDecoder.java

  1. package de.turnertech.ows.gml;

  2. import org.w3c.dom.Element;
  3. import org.w3c.dom.Node;
  4. import org.w3c.dom.NodeList;

  5. import de.turnertech.ows.Logging;

  6. public class FeatureDecoder {

  7.     public static IFeature decode(Node xmlRootNode, GmlDecoderContext gmlContext, FeatureType featureType) {
  8.         Feature returnFeature = featureType.createInstance();
  9.         xmlRootNode.normalize();

  10.         gmlContext.setFeatureType(featureType);
  11.         gmlContext.getSrsDeque().push(featureType.getSrs());

  12.         NodeList propertyNodes = xmlRootNode.getChildNodes();
  13.         for(int i = 0; i < propertyNodes.getLength(); ++i) {
  14.             Node propertyNode = propertyNodes.item(i);
  15.             if(propertyNode.getNodeType() != Node.ELEMENT_NODE) {
  16.                 continue;
  17.             }

  18.             String propertyName = propertyNode.getLocalName();
  19.             String propertyNamespace = propertyNode.getNamespaceURI();

  20.             //TODO: Here we need to rely on the FeatureType, and its map of FeatureProperty instances, which will
  21.             //contain type information needed for handling casting to the correct data type.
  22.             if(!featureType.hasProperty(propertyName)) {
  23.                 // TODO: Throw Exception
  24.                 return null;
  25.             }
  26.            
  27.             FeatureProperty featureProperty = featureType.getProperty(propertyName);
  28.             if(featureProperty.getPropertyType() == FeaturePropertyType.TEXT) {
  29.                 returnFeature.setPropertyValue(propertyName, propertyNode.getTextContent());
  30.             } else if(featureProperty.getPropertyType() == FeaturePropertyType.POLYGON) {
  31.                 Element element = (Element)propertyNode;
  32.                 returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("Polygon").item(0), gmlContext));
  33.             } else if(featureProperty.getPropertyType() == FeaturePropertyType.POINT) {
  34.                 Element element = (Element)propertyNode;
  35.                 returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("Point").item(0), gmlContext));
  36.             } else if(featureProperty.getPropertyType() == FeaturePropertyType.LINE_STRING) {
  37.                 Element element = (Element)propertyNode;
  38.                 returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode(element.getElementsByTagName("LineString").item(0), gmlContext));
  39.             } else if(featureProperty.getPropertyType() == FeaturePropertyType.ID) {
  40.                 returnFeature.setPropertyValue(propertyName, propertyNode.getTextContent());
  41.             } else if(featureProperty.getPropertyType() == FeaturePropertyType.GEOMETRY) {
  42.                 NodeList children = propertyNode.getChildNodes();
  43.                 for(int c = 0; c < children.getLength(); ++c) {
  44.                     Node child = children.item(c);
  45.                     if(child.getNodeType() == Node.ELEMENT_NODE) {
  46.                         returnFeature.setPropertyValue(propertyName, new GeometryDecoder().decode((Element)child, gmlContext));
  47.                         break;
  48.                     }
  49.                 }
  50.             } else {
  51.                 Logging.LOG.severe("FeatureDecoder: Property was not decoded - " + propertyName);
  52.             }
  53.         }

  54.         gmlContext.getFeatureIdRetriever().retrieveFeatureId(returnFeature);

  55.         return returnFeature;
  56.     }
  57.    
  58. }