/* * 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.xs.bindings; import org.picocontainer.MutablePicoContainer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import org.geotools.xml.AbstractComplexBinding; import org.geotools.xml.ElementInstance; import org.geotools.xml.Node; import org.geotools.xs.XS; /** * Binding object for the type http://www.w3.org/2001/XMLSchema:anyType. * * <p> * <pre> * <code> * <xs:complexType name="anyType" mixed="true"> * <xs:annotation> * <xs:documentation> Not the real urType, but as close an * approximation as we can get in the XML representation</xs:documentation> * </xs:annotation> * <xs:sequence> * <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> * </xs:sequence> * <xs:anyAttribute processContents="lax"/> * </xs:complexType> * * </code> * </pre> * </p> * * @generated * * * @source $URL$ */ public class XSAnyTypeBinding extends AbstractComplexBinding { /** * @generated */ public QName getTarget() { return XS.ANYTYPE; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public int getExecutionMode() { return OVERRIDE; } /** * <!-- begin-user-doc --> * This binding returns objects of type Map * <!-- end-user-doc --> * * @generated modifiable */ public Class getType() { return Object.class; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public void initialize(ElementInstance instance, Node node, MutablePicoContainer context) { } /** * * <!-- begin-user-doc --> * A quick approx of the available content: * <p> * This method returns a {@link Map} in which the names of children and * attributes are keys, and the parsed children and attributes are the * values. If the element being parsed contains child text, it is available * under the <code>nulll</code> key. * * @return Map, * </p> * <!-- end-user-doc --> * * @generated modifiable */ public Object parse(ElementInstance instance, Node node, Object value) throws Exception { String text = null; if ((value != null) && value instanceof String) { text = ((String) value).trim(); if ("".equals(text)) { text = null; } } //if there is just some text, return it if (node.getChildren().isEmpty() && node.getAttributes().isEmpty() && (text != null)) { return text; } //if there is only a single child, return it if ((node.getChildren().size() == 1) && node.getAttributes().isEmpty() && (text == null)) { return node.getChildValue(0); } //if there is a single attribute, return it if ((node.getAttributes().size() == 1) && node.getChildren().isEmpty() && (text == null)) { return ((Node) node.getAttributes().get(0)).getValue(); } //create a map of the elements and attributes Map map = new HashMap(); List attributes = node.getAttributes(); List children = node.getChildren(); mapBinding(map, attributes); mapBinding(map, children); if ((text != null) && !"".equals(text.trim())) { map.put(null, text.trim()); } return map; } private void mapBinding(Map map, List attributes) { for (Iterator i = attributes.iterator(); i.hasNext();) { Node attribute = (Node) i.next(); String name = attribute.getComponent().getName(); Object value = attribute.getValue(); if (map.containsKey(name)) { List values; Object obj = map.get(name); if (obj instanceof List) { values = (List) obj; } else { values = new ArrayList(); values.add(obj); map.put(name, values); } values.add(value); } else { map.put(name, value); } } } }