/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 *   
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* $Rev$ $Date$ */

#ifndef _XMLDOCUMENT_H_
#define _XMLDOCUMENT_H_


#include "commonj/sdo/export.h"

#include "commonj/sdo/DataObject.h"

namespace commonj
{
    namespace sdo
    {
        /**  XMLDocument - place for holding a graph
         *
         * The XMLDocument class provides a place to hold a loaded
         * graph of data. The root element name is maintained here so that
         * the graph can be serialized to the same name later.
         */

        
        class XMLDocument : public RefCountingObject
        {
            
        public:
            
            SDO_API virtual ~XMLDocument();
            
        /**  getRootDataObject- return the topmost data object
         *
         * When XML data is loaded, there is one base element which becomes
         * the root data object. As this data object is not a property of any
         * other data object, it has no name
         * The XMLDocument stores the name which was in the XML file.
         * This root data object has a URI and a Name only within this
         * XMLDocument
         */

            SDO_API virtual DataObjectPtr getRootDataObject() const = 0;

        /**  getRootElementName- return the topmost data objects name
         *
         * When XML data is loaded, there is one base element which becomes
         * the root data object. As this data object is not a property of any
         * other data object, it has no name
         * The XMLDocument stores the name/uri which was in the XML file.
         */
            SDO_API virtual const char* getRootElementURI() const = 0;

        /**  getRootElementURI- return the topmost data objects uri
         *
         * When XML data is loaded, there is one base element which becomes
         * the root data object. As this data object is not a property of any
         * other data object, it has no name
         * The XMLDocument stores the name/uri which was in the XML file.
         */
            SDO_API virtual const char* getRootElementName() const = 0;

        /**  getEncoding- return the encoding for this document
         *
         * NOT IMPLEMENTED
         * This returns the encoding specified in the original XML.
         */
            SDO_API virtual const char* getEncoding() const = 0;

        /**  setEncoding- set the encoding to save this document
         *
         * This sets the encoding to save this data to XML.
         */
            SDO_API virtual void setEncoding(const char* encoding) = 0;
            SDO_API virtual void setEncoding(const SDOString& encoding) = 0;

        /**  getXMLDeclaration
         *
         * NOT IMPLEMENTED
         */
            SDO_API virtual bool getXMLDeclaration() const = 0;

        /**  setXMLDeclaration
         *
         * Sets the XMLDeclaration
         */
            SDO_API virtual void setXMLDeclaration(bool xmlDeclaration) = 0;

        /**  getXMLVersion- return the xml version for this document
         *
         * NOT IMPLEMENTED
         */
            SDO_API virtual const char* getXMLVersion() const = 0;

        /**  setXMLVersion- sets the version for this document
         *
         * NOT IMPLEMENTED
         */
            SDO_API virtual void setXMLVersion(const char* xmlVersion) = 0;
            SDO_API virtual void setXMLVersion(const SDOString& xmlVersion) = 0;

        /**  getSchemaLocation- return the schema location
         *
         * NOT IMPLEMENTED
         */
            SDO_API virtual const char* getSchemaLocation() const = 0;

        /**  setSchemaLocation
         *
         * Sets the XML Schema location.
         */
            SDO_API virtual void setSchemaLocation(const char* schemaLocation) = 0;
            SDO_API virtual void setSchemaLocation(const SDOString& schemaLocation) = 0;

        /**  getNoNamespaceSchemaLocation
         *
         * NOT IMPLEMENTED
         */
            SDO_API virtual const char* getNoNamespaceSchemaLocation() const = 0;

        /**  setNoNamespaceSchemaLocation
         *
         * Sets the nonamespace schema location
         */
            SDO_API virtual void setNoNamespaceSchemaLocation(const char* noNamespaceSchemaLocation) = 0;        
            SDO_API virtual void setNoNamespaceSchemaLocation(const SDOString& noNamespaceSchemaLocation) = 0;        
            
            SDO_API friend std::istream& operator>>(std::istream& input, XMLDocument& doc);
            
        };
    } // End - namespace sdo
} // End - namespace commonj


#endif //_XMLDOCUMENT_H_
