X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltoolingtest%2FXMLObjectBaseTestCase.h;h=d2d56c0f04abc40724347caac86de289fa804463;hb=9edc32bbe3f1e2b16ba6694bec8fe7a079eb1d16;hp=28aa71642f2c4cd986f8788f60b0b7495bc59026;hpb=12e3c34ebeefb3b2f2d4f7dc662e77866c67c505;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltoolingtest/XMLObjectBaseTestCase.h b/xmltoolingtest/XMLObjectBaseTestCase.h index 28aa716..d2d56c0 100644 --- a/xmltoolingtest/XMLObjectBaseTestCase.h +++ b/xmltoolingtest/XMLObjectBaseTestCase.h @@ -15,23 +15,28 @@ */ #include -#include -#include -#include +#include +#include #include #include #include #include #include +#include +#include #include -#include +#include #include +#include + +#ifndef XMLTOOLING_NO_XMLSEC + #include + using namespace xmlsignature; +#endif using namespace xmltooling; using namespace std; -extern ParserPool* validatingPool; -extern ParserPool* nonvalidatingPool; extern string data_path; #if defined (_MSC_VER) @@ -39,30 +44,47 @@ extern string data_path; #pragma warning( disable : 4250 4251 ) #endif -class SimpleXMLObject : public AbstractDOMCachingXMLObject +class SimpleXMLObject + : public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller { +protected: + SimpleXMLObject(const SimpleXMLObject& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), + m_id(XMLString::replicate(src.m_id)), m_value(XMLString::replicate(src.m_value)) { +#ifndef XMLTOOLING_NO_XMLSEC + m_children.push_back(NULL); + m_signature=m_children.begin(); +#endif + VectorOf(SimpleXMLObject) mine=getSimpleXMLObjects(); + for (vector::const_iterator i=src.m_simples.begin(); i!=src.m_simples.end(); i++) { + mine.push_back((*i) ? (*i)->clone() : NULL); + } + } + public: static const XMLCh NAMESPACE[]; static const XMLCh NAMESPACE_PREFIX[]; static const XMLCh LOCAL_NAME[]; + static const XMLCh DERIVED_NAME[]; + static const XMLCh TYPE_NAME[]; static const XMLCh ID_ATTRIB_NAME[]; - SimpleXMLObject() : AbstractDOMCachingXMLObject(NAMESPACE, LOCAL_NAME, NAMESPACE_PREFIX), m_id(NULL), m_value(NULL) {} + SimpleXMLObject( + const XMLCh* nsURI=NULL, const XMLCh* localName=NULL, const XMLCh* prefix=NULL, const QName* schemaType=NULL + ) : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_id(NULL), m_value(NULL) { +#ifndef XMLTOOLING_NO_XMLSEC + m_children.push_back(NULL); + m_signature=m_children.begin(); +#endif + } + virtual ~SimpleXMLObject() { XMLString::release(&m_id); XMLString::release(&m_value); } - - const XMLCh* getId() const { return m_id; } - void setId(const XMLCh* id) { m_id=prepareForAssignment(m_id,id); } - const XMLCh* getValue() const { return m_value; } - void setValue(const XMLCh* value) { m_value=prepareForAssignment(m_value,value); } - - VectorOf(SimpleXMLObject) getSimpleXMLObjects() { - return VectorOf(SimpleXMLObject)(this, m_simples, &m_children, m_children.end()); - } - SimpleXMLObject* clone() const { auto_ptr domClone(AbstractDOMCachingXMLObject::clone()); SimpleXMLObject* ret=dynamic_cast(domClone.get()); @@ -71,194 +93,106 @@ public: return ret; } - ret=new SimpleXMLObject(); - ret->m_namespaces=m_namespaces; - ret->setId(m_id); - ret->setValue(m_value); - xmltooling::clone(m_children, ret->m_children); - return ret; + return new SimpleXMLObject(*this); } -private: - XMLCh* m_id; - XMLCh* m_value; - vector m_simples; -}; - -class SimpleXMLObjectBuilder : public XMLObjectBuilder -{ -public: - SimpleXMLObject* buildObject() const { - return new SimpleXMLObject(); - } -}; + const XMLCh* getId() const { return m_id; } + void setId(const XMLCh* id) { m_id=prepareForAssignment(m_id,id); } -class SimpleXMLObjectMarshaller : public AbstractXMLObjectMarshaller -{ -public: - SimpleXMLObjectMarshaller() {} + const XMLCh* getValue() const { return m_value; } + void setValue(const XMLCh* value) { m_value=prepareForAssignment(m_value,value); } -private: - void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const { - const SimpleXMLObject& simpleXMLObject = dynamic_cast(xmlObject); - - if(simpleXMLObject.getId()) { - domElement->setAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME, simpleXMLObject.getId()); - domElement->setIdAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME); - } +#ifndef XMLTOOLING_NO_XMLSEC + Signature* getSignature() const { + return dynamic_cast(*m_signature); } - void marshallElementContent(const XMLObject& xmlObject, DOMElement* domElement) const { - const SimpleXMLObject& simpleXMLObject = dynamic_cast(xmlObject); - - if(simpleXMLObject.getValue()) { - domElement->setTextContent(simpleXMLObject.getValue()); - } + void setSignature(Signature* sig) { + *m_signature=prepareForAssignment(*m_signature,sig); } -}; - -class SimpleXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller -{ -public: - SimpleXMLObjectUnmarshaller() {} +#endif -private: - void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const { - SimpleXMLObject& simpleXMLObject = dynamic_cast(parentXMLObject); + VectorOf(SimpleXMLObject) getSimpleXMLObjects() { + return VectorOf(SimpleXMLObject)(this, m_simples, &m_children, m_children.end()); + } + + const std::vector& getSimpleXMLObjects() const { + return m_simples; + } - SimpleXMLObject* child = dynamic_cast(childXMLObject); - if (child) { - simpleXMLObject.getSimpleXMLObjects().push_back(child); - } - else { - throw UnmarshallingException("Unknown child element cannot be added to parent object."); +protected: + void marshallAttributes(DOMElement* domElement) const { + if(getId()) { + domElement->setAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME, getId()); + domElement->setIdAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME); } } - void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const { - SimpleXMLObject& simpleXMLObject = dynamic_cast(xmlObject); - - if (XMLString::equals(attribute->getLocalName(),SimpleXMLObject::ID_ATTRIB_NAME)) { - simpleXMLObject.setId(attribute->getValue()); - } - else { - throw UnmarshallingException("Unknown attribute cannot be processed by parent object."); + void marshallElementContent(DOMElement* domElement) const { + if(getValue()) { + domElement->setTextContent(getValue()); } } - void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const { - SimpleXMLObject& simpleXMLObject = dynamic_cast(xmlObject); + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + SimpleXMLObject* simple=dynamic_cast(childXMLObject); + if (simple) { + getSimpleXMLObjects().push_back(simple); + return; + } - simpleXMLObject.setValue(elementContent); - } - -}; - -class WildcardXMLObjectMarshaller; - -class WildcardXMLObject : public AbstractElementProxy, public AbstractAttributeExtensibleXMLObject -{ - friend class WildcardXMLObjectMarshaller; -public: - WildcardXMLObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) - : AbstractDOMCachingXMLObject(nsURI, localName, prefix), - AbstractElementProxy(nsURI, localName, prefix), - AbstractAttributeExtensibleXMLObject(nsURI, localName, prefix) {} - virtual ~WildcardXMLObject() {} - - WildcardXMLObject* clone() const { - auto_ptr domClone(AbstractDOMCachingXMLObject::clone()); - WildcardXMLObject* ret=dynamic_cast(domClone.get()); - if (ret) { - domClone.release(); - return ret; +#ifndef XMLTOOLING_NO_XMLSEC + Signature* sig=dynamic_cast(childXMLObject); + if (sig) { + setSignature(sig); + return; } +#endif - ret=new WildcardXMLObject( - getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix() - ); - ret->m_namespaces=m_namespaces; - for (map::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; + throw UnmarshallingException("Unknown child element cannot be added to parent object."); } -}; -class WildcardXMLObjectBuilder : public XMLObjectBuilder -{ -public: - XMLObject* buildObject() const { - throw XMLObjectException("No default builder available."); + void processAttribute(const DOMAttr* attribute) { + if (XMLHelper::isNodeNamed(attribute, NULL, SimpleXMLObject::ID_ATTRIB_NAME)) + setId(attribute->getValue()); + else + throw UnmarshallingException("Unknown attribute cannot be processed by parent object."); } - WildcardXMLObject* buildObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) const { - return new WildcardXMLObject(nsURI,localName,prefix); + void processElementContent(const XMLCh* elementContent) { + setValue(elementContent); } -}; - -class WildcardXMLObjectMarshaller : public AbstractXMLObjectMarshaller -{ -public: - WildcardXMLObjectMarshaller() : AbstractXMLObjectMarshaller() {} private: - void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const { - const WildcardXMLObject& wcXMLObject = dynamic_cast(xmlObject); - - for (map::const_iterator i=wcXMLObject.m_attributeMap.begin(); i!=wcXMLObject.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(const XMLObject& xmlObject, DOMElement* domElement) const { - const WildcardXMLObject& wcXMLObject = dynamic_cast(xmlObject); - - if(wcXMLObject.getTextContent()) { - domElement->appendChild(domElement->getOwnerDocument()->createTextNode(wcXMLObject.getTextContent())); - } - } + XMLCh* m_id; + XMLCh* m_value; + vector m_simples; +#ifndef XMLTOOLING_NO_XMLSEC + list::iterator m_signature; +#endif }; -class WildcardXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller +class SimpleXMLObjectBuilder : public XMLObjectBuilder { public: - WildcardXMLObjectUnmarshaller() {} - -private: - XMLObject* buildXMLObject(const DOMElement* domElement) const { - const WildcardXMLObjectBuilder* builder = - dynamic_cast(XMLObjectBuilder::getBuilder(domElement)); - if (builder) - return builder->buildObject(domElement->getNamespaceURI(),domElement->getLocalName(),domElement->getPrefix()); - throw UnmarshallingException("Failed to locate WildcardObjectBuilder for element."); - } - - void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const { - WildcardXMLObject& wcXMLObject = dynamic_cast(parentXMLObject); - - wcXMLObject.getXMLObjects().push_back(childXMLObject); - } - - void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const { - WildcardXMLObject& wcXMLObject = dynamic_cast(xmlObject); - - QName q(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()); - wcXMLObject.setAttribute(q,attribute->getNodeValue()); + SimpleXMLObject* buildObject() const { + return buildObject(SimpleXMLObject::NAMESPACE, SimpleXMLObject::LOCAL_NAME, SimpleXMLObject::NAMESPACE_PREFIX); } - void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const { - WildcardXMLObject& wcXMLObject = dynamic_cast(xmlObject); - - wcXMLObject.setTextContent(elementContent); + SimpleXMLObject* buildObject( + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const QName* schemaType=NULL + ) const { + return new SimpleXMLObject(nsURI, localName, prefix, schemaType); } + static SimpleXMLObject* newSimpleXMLObject() { + const SimpleXMLObjectBuilder* b = dynamic_cast( + XMLObjectBuilder::getBuilder(QName(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME)) + ); + if (b) + return b->buildObject(); + throw XMLObjectException("Unable to obtain typed builder for SimpleXMLObject."); + } }; #if defined (_MSC_VER)