package org.geotools.kml.v22.bindings;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.geotools.kml.v22.KML;
import org.geotools.xml.AbstractComplexBinding;
import org.geotools.xml.ElementInstance;
import org.geotools.xml.Node;
/**
* Binding object for the type http://www.opengis.net/kml/2.2:ExtendedDataType.
*
* <p>
*
* <pre>
* <code>
* <complexType final="#all" name="ExtendedDataType">
* <sequence>
* <element maxOccurs="unbounded" minOccurs="0" ref="kml:Data"/>
* <element maxOccurs="unbounded" minOccurs="0" ref="kml:SchemaData"/>
* <any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
* </sequence>
* </complexType>
*
* </code>
* </pre>
*
* </p>
*
* @generated
*/
public class ExtendedDataTypeBinding extends AbstractComplexBinding {
/**
* @generated
*/
public QName getTarget() {
return KML.ExtendedDataType;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated modifiable
*/
@SuppressWarnings("rawtypes")
public Class getType() {
return Map.class;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated modifiable
*/
@SuppressWarnings("unchecked")
public Object parse(ElementInstance instance, Node node, Object value) throws Exception {
Map<String, Object> extendedData = new HashMap<String, Object>();
Map<String, Object> unTypedData = new LinkedHashMap<String, Object>();
for (Node n : (List<Node>)node.getChildren("Data")) {
unTypedData.put((String) n.getAttributeValue("name"), n.getChildValue("value"));
}
Map<String, Object> typedData = new LinkedHashMap<String, Object>();
List<URI> schemas = new ArrayList<URI>();
for (Node schemaData : (List<Node>)node.getChildren("SchemaData")) {
URI schemaUrl = (URI) schemaData.getAttributeValue("schemaUrl");
if (schemaUrl != null) {
for (Node n : (List<Node>)schemaData.getChildren("SimpleData")) {
typedData.put((String) n.getAttributeValue("name"), n.getValue());
}
schemas.add(schemaUrl);
}
}
/**
* Schema-less extended data (see https://developers.google.com/kml/documentation/extendeddata especially the
* "Adding Untyped Name/Value Pairs" section):
*
* <ExtendedData>
* <Data name="string">
* <displayName>...</displayName> <!-- string -->
* <value>...</value> <!-- string -->
* </Data>
* </ExtendedData>
*
*/
for (Node freeExtendedData : (List<Node>) node.getChildren("Data")) {
for (Node n : (List<Node>) freeExtendedData.getChildren("Data")) {
Node v = n.getChild("value");
if (v != null)
typedData.put((String) n.getAttributeValue("name"), v.getValue());
}
}
extendedData.put("schemas", schemas);
extendedData.put("untyped", unTypedData);
extendedData.put("typed", typedData);
return extendedData;
}
public Object getProperty(Object object, QName name) throws Exception {
if ("Data".equals(name.getLocalPart())) {
return object;
}
return super.getProperty(object, name);
}
}