/**
 * <copyright>
 *
 * Service Data Objects
 * Version 2.0
 * Licensed Materials - Property of BEA and IBM
 *
 * (c) Copyright BEA Systems, Inc. and International Business Machines Corp 2005.  All rights reserved.
 *
 * </copyright>
 * 
 */

package commonj.sdo.helper;

import commonj.sdo.DataObject;

/**
 * Represents an XML Document containing a tree of DataObjects.
 * 
 * An example XMLDocument fragment is:
 * <?xml version="1.0"?>
 * <purchaseOrder orderDate="1999-10-20">
 * 
 * created from this XML Schema fragment:
 * <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 *   <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
 *   <xsd:complexType name="PurchaseOrderType">
 *
 * Upon loading this XMLDocument:
 *   DataObject is an instance of Type PurchaseOrderType.
 *   RootElementURI is null because the XSD has no targetNamespace URI.
 *   RootElementName is purchaseOrder.
 *   Encoding is null because the document did not specify an encoding.
 *   XMLDeclaration is true because the document contained an XML declaration.
 *   XMLVersion is 1.0
 *   SchemaLocation and noNamespaceSchemaLocation are null because they are
 *     not specified in the document.
 * 
 * When saving the root element, if the type of the root dataObject is not the
 *   type of global element specified by rootElementURI and rootElementName, 
 *   or if a global element does not exist for rootElementURI and rootElementName,
 *   then an xsi:type declaration is written to record the root DataObject's Type.
 * 
 * When loading the root element and an xsi:type declaration is found
 *   it is used as the type of the root DataObject.  In this case,
 *   if validation is not being performed, it is not an error if the
 *   rootElementName is not a global element.
 */
public interface XMLDocument
{
  /**
   * Return the root DataObject for the XMLDocument.
   * @return root DataObject for the XMLDocument.
   */
  DataObject getRootObject();
  
  /**
   * Return the targetNamespace URI for the root element.
   * If there is no targetNamespace URI, the value is null.
   * The root element is a global element of the XML Schema
   *   with a type compatible to the DataObject.
   * @return the targetNamespace URI for the root element.
   */
  String getRootElementURI();
  
  /**
   * Return the name of the root element.
   * The root element is a global element of the XML Schema
   *   with a type compatible to the DataObject.
   * @return the name of the root element.
   */
  String getRootElementName();
  
  /**
   * Return the XML encoding of the document, or null if not specified.
   * The default value is "UTF-8".
   * Specification of other values is implementation-dependent.
   * @return the XML encoding of the document, or null if not specified.
   */
  String getEncoding();
  
  /**
   * Set the XML encoding of the document, or null if not specified.
   * @param encoding
   */
  void setEncoding(String encoding);

  /**
   * Return the XML declaration of the document.  If true,
   *   XMLHelper save() will produce a declaration of the form:
   * <?xml version="1.0" encoding="UTF-8"?>
   *   Encoding will be suppressed if getEncoding() is null.
   * The default value is true.
   * @return the XML declaration of the document.
   */
  boolean isXMLDeclaration();
  
  /**
   * Set the XML declaration version of the document.
   * @param xmlDeclaration the XML declaration version of the document.
   */
  void setXMLDeclaration(boolean xmlDeclaration);
  
  /**
   * Return the XML version of the document, or null if not specified. 
   * The default value is "1.0".
   * Specification of other values is implementation-dependent.
   * @return the XML version of the document, or null if not specified.
   */
  String getXMLVersion();
  
  /**
   * Set the XML version of the document, or null if not specified.
   * @param xmlVersion the XML version of the document, or null if not specified.
   */
  void setXMLVersion(String xmlVersion);

  /**
   * Return the value of the schemaLocation declaration
   * for the http://www.w3.org/2001/XMLSchema-instance namespace in the
   * root element, or null if not present.
   * @return the value of the schemaLocation declaration,
   * or null if not present.
   */
  String getSchemaLocation();
  
  /**
   * Sets the value of the schemaLocation declaration
   * for the http://www.w3.org/2001/XMLSchema-instance namespace in the
   * root element, or null if it should not be present.
   * @param schemaLocation the value of the schemaLocation declaration, or null.
   */
  void setSchemaLocation(String schemaLocation);

  /**
   * Return the value of the noNamespaceSchemaLocation declaration
   * for the http://www.w3.org/2001/XMLSchema-instance namespace in the
   * root element, or null if not present.
   * @return the value of the noNamespaceSchemaLocation declaration,
   * or null if not present.
   */
  String getNoNamespaceSchemaLocation();
  
  /**
   * Sets the value of the noNamespaceSchemaLocation declaration
   * for the http://www.w3.org/2001/XMLSchema-instance namespace in the
   * root element, or null if it should not be present.
   * @param schemaLocation the value of the noNamespaceSchemaLocation declaration, or null.
   */
  void setNoNamespaceSchemaLocation(String schemaLocation);
}
