/*
* 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.xml;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDParticle;
import org.picocontainer.MutablePicoContainer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.List;
import javax.xml.namespace.QName;
/**
* A strategy for parsing elements in an instance document which are of
* complex type.
*
* <p>
* Complex types contain child elements, and attributes. A complex strategy
* has the ability to
* <p>
*
* @author Justin Deoliveira,Refractions Research Inc.,jdeolive@refractions.net
*
*
* @source $URL$
*/
public interface ComplexBinding extends Binding {
/**
* Initializes the context to be used while parsing child elements of the
* complex type.
*
* <p>
* This method is called when the leading edge of the associated element is
* reached. It is used to create context in which child elements will be
* parsed in. The context is in the form of a pico container. For types that
* do not need to create context for children this method should do nothing.
* </p>
*
* @param instance The element being parsed.
* @param node The node in the parse tree representing the element being
* parsed. It is important to note that at the time this method is called
* the node contains no child element nodes, only child attribute nodes.
* @param context The container to be used as context for child strategies.
*
*/
// void initialize(ElementInstance instance, Node node,
// MutablePicoContainer context);
/**
* Initializes the context for a child element.
* <p>
* This method is called on the leading edge of a child element. It is used
* to create context for the binding of a child element. It is important to
* note that each time this method is called, the <param>node</param> parse
* tree will contain different, ie child nodes for those previous elements
* parsed.
* </p>
*
* @param childinstance The child element instance
* @param node The parse node for the parent element.
* @param context the context in which the child element will be parsed.
*/
void initializeChildContext(ElementInstance childInstance, Node node,
MutablePicoContainer context);
/**
* Parses a complex element from an instance document into an object
* representation.
*
* <p>
* This method is called when the trailing edge of the associated element is
* reached.
* </p>
*
* @param instance The element being parsed.
* @param node The node in the parse tree representing the element being
* parsed.
* @param value The result of the parse from another strategy in the type
* hierarchy. Could be null if this is the first strategy being executed.
*
* @return The parsed object, or null if the component could not be parsed.
*
* @throws Exception Strategy objects should not attempt to handle any exceptions.
*/
Object parse(ElementInstance instance, Node node, Object value)
throws Exception;
/**
* Performs the encoding of the object into its xml representation.
*
* <p>
* Complex objects are encoded as elements in a document. The <param>value</param>
* parameter is the encoded element, created by the parent binding. For the
* first binding in the execution chain this is just an empty element ( no
* children or attributes ). The binding has the choice to return <param>value</param>
* or to create a new element to return.
* </p>
*
* <p>
* This method may choose to create child elements and attributes for the element.
* Or as an alternative return the object values for these contructs in
* {@link #getProperty(Object, QName)}.
* </p>
*
* @param object The object being encoded.
* @param document The document containing the encoded element.
* @param value The object as encoded by the parent binding.
*
* @return The element for the objcet being encoded, or <code>null</code>
*
*/
Element encode(Object object, Document document, Element value)
throws Exception;
/**
* Returns a property of a particular object which corresponds to the
* specified name.
*
* </p>
* <p>This method should just return null in the event that the object being
* encoded is an leaf in its object model.</p>
*
* <p>
* For multi-values properties ( maxOccurs > 0 ), this method may return an
* instance of {@link java.util.Collection}, {@link java.util.Iterator}, or
* an array.
* </p>
*
* @param object The object being encoded.
* @param name The name of the property to obtain.
*
* @return The value of the property, or <code>null</code>.
*/
Object getProperty(Object object, QName name) throws Exception;
/**
* Returns a list of properties of the specified object.
* <p>
* The return list contains a set of {@link QName}, {@link Object} tuples,
* each as a two element object array.
* </p>
* <p>
* This method should only be implemented in the case where the encoder
* can not determine what the properties of the object are from the schema.
* </p>
* <p>
* An example would be an object which corresponds to an element in the
* schema which has a the type <code>xs:anyType</code>. Since the content
* of this type can be anything the schema has no way to determine what
* the properties are. So in this case this method must specify the
* properties manually as a set of name, object tuples.
* </p>
* <p>
* In the case of a multi-valued property, this method must return a tuple
* for each instance of the property, and not a list, iterator, or array
* containing all of the instances.
* </p>
* @param object the object being encoded.
*
* @return A list of the properties for the object.
* @deprecated use {@link #getProperties(Object, XSDElementDeclaration)}.
*/
List /*Object[QName,Object]*/ getProperties(Object object)
throws Exception;
/**
* Returns a list of properties of the specified object.
* <p>
* The return list contains a set of tuples (two element object array) which represent the
* properties of the object. The second value is an object which respresents the value. The first
* value of the tuple can one of two things:
* <ol>
* <li>A {@link QName} identifying an element. This name will be used to locate the schema
* element for the property.
* <li>A {@link XSDParticle} representing the element itself.
* </ol>
* </p>
* <p>
* This method should only be implemented in the case where the encoder
* can not determine what the properties of the object are from the schema.
* </p>
* <p>
* An example would be an object which corresponds to an element in the
* schema which has a the type <code>xs:anyType</code>. Since the content
* of this type can be anything the schema has no way to determine what
* the properties are. So in this case this method must specify the
* properties manually as a set of name, object tuples.
* </p>
* <p>
* In the case of a multi-valued property, this method must return a tuple
* for each instance of the property, and not a list, iterator, or array
* containing all of the instances.
* </p>
* @param object the object being encoded.
* @param element
*
* @return A list of the properties for the object.
*/
List /*Object[QName,Object]*/ getProperties(Object object, XSDElementDeclaration element )
throws Exception;
}