Update copyright.
[shibboleth/cpp-xmltooling.git] / xmltooling / impl / AnyElement.cpp
index a467741..1e4e2f0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2006 Internet2
+ *  Copyright 2001-2007 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 
 /**
- * @file AnyElement.h
+ * AnyElement.cpp
  * 
  * Advanced anyType implementation suitable for deep processing of unknown content.
  */
 
 #include "internal.h"
-#include "AbstractAttributeExtensibleXMLObject.h"
-#include "AbstractElementProxy.h"
 #include "exceptions.h"
 #include "impl/AnyElement.h"
-#include "io/AbstractXMLObjectMarshaller.h"
-#include "io/AbstractXMLObjectUnmarshaller.h"
 #include "util/NDC.h"
 #include "util/XMLHelper.h"
 
-#include <log4cpp/Category.hh>
 #include <xercesc/util/XMLUniDefs.hpp>
 
 using namespace xmltooling;
-using namespace log4cpp;
 using namespace std;
 
-#if defined (_MSC_VER)
-    #pragma warning( push )
-    #pragma warning( disable : 4250 4251 )
-#endif
+XMLObject* AnyElementImpl::clone() const {
+    auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());
+    AnyElementImpl* ret=dynamic_cast<AnyElementImpl*>(domClone.get());
+    if (ret) {
+        domClone.release();
+        return ret;
+    }
 
-namespace xmltooling {
-
-    /**
-     * Implements a smart wrapper around unknown DOM content.
-     */
-    class XMLTOOL_DLLLOCAL AnyElementImpl : public AbstractElementProxy, public AbstractAttributeExtensibleXMLObject,
-        public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller
-    {
-    public:
-        AnyElementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)
-            : AbstractXMLObject(nsURI, localName, prefix) {}
-        virtual ~AnyElementImpl() {}
-        
-        AnyElementImpl* clone() const {
-            auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());
-            AnyElementImpl* ret=dynamic_cast<AnyElementImpl*>(domClone.get());
-            if (ret) {
-                domClone.release();
-                return ret;
-            }
-
-            ret=new AnyElementImpl(
-                getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix()
-                );
-            ret->m_namespaces=m_namespaces;
-            for (map<QName,XMLCh*>::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) {
-                ret->m_attributeMap[i->first]=XMLString::replicate(i->second);
-            }
-            ret->setTextContent(getTextContent());
-            xmltooling::clone(m_children, ret->m_children);
-            return ret;
-        }
-
-        void marshallAttributes(DOMElement* domElement) const {
-            for (map<QName,XMLCh*>::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) {
-                DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(i->first.getNamespaceURI(),i->first.getLocalPart());
-                if (i->first.hasPrefix())
-                    attr->setPrefix(i->first.getPrefix());
-                attr->setNodeValue(i->second);
-                domElement->setAttributeNode(attr);
-            }
-        }
-
-        void marshallElementContent(DOMElement* domElement) const {
-            if(getTextContent()) {
-                domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent()));
-            }
-        }
-
-        void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-            getXMLObjects().push_back(childXMLObject);
-        }
-
-        void processAttribute(const DOMAttr* attribute) {
-            QName q(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()); 
-            setAttribute(q,attribute->getNodeValue());
-        }
+    return new AnyElementImpl(*this);
+}
 
-        void processElementContent(const XMLCh* elementContent) {
-            setTextContent(elementContent);
-        }
-    };
+AnyElementImpl::AnyElementImpl(const AnyElementImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src),
+        AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src) {
+    const vector<XMLObject*>& children = src.getUnknownXMLObjects();
+    for (vector<XMLObject*>::const_iterator i=children.begin(); i!=children.end(); ++i)
+        getUnknownXMLObjects().push_back((*i)->clone());
+}       
 
-};
+void AnyElementImpl::marshallAttributes(DOMElement* domElement) const {
+    marshallExtensionAttributes(domElement);
+}
 
-#if defined (_MSC_VER)
-    #pragma warning( pop )
-#endif
+void AnyElementImpl::processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
+    getUnknownXMLObjects().push_back(childXMLObject);
+}
 
+void AnyElementImpl::processAttribute(const DOMAttr* attribute) {
+    unmarshallExtensionAttribute(attribute);
+}
 
 XMLObject* AnyElementBuilder::buildObject(
-    const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix
+    const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType
     ) const {
-    return new AnyElementImpl(namespaceURI,elementLocalName,namespacePrefix);
+    return new AnyElementImpl(nsURI, localName, prefix, schemaType);
 }