+class WildcardXMLObjectMarshaller;\r
+\r
+class WildcardXMLObject : public AbstractExtensibleXMLObject, public AbstractAttributeExtensibleXMLObject\r
+{\r
+ friend class WildcardXMLObjectMarshaller;\r
+public:\r
+ WildcardXMLObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)\r
+ : AbstractDOMCachingXMLObject(nsURI, localName, prefix),\r
+ AbstractExtensibleXMLObject(nsURI, localName, prefix),\r
+ AbstractAttributeExtensibleXMLObject(nsURI, localName, prefix) {}\r
+ virtual ~WildcardXMLObject() {}\r
+ \r
+ WildcardXMLObject* clone() const {\r
+ auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());\r
+ WildcardXMLObject* ret=dynamic_cast<WildcardXMLObject*>(domClone.get());\r
+ if (ret) {\r
+ domClone.release();\r
+ return ret;\r
+ }\r
+\r
+ ret=new WildcardXMLObject(\r
+ getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix()\r
+ );\r
+ for (map<QName,XMLCh*>::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) {\r
+ ret->m_attributeMap[i->first]=XMLString::replicate(i->second);\r
+ }\r
+ xmltooling::clone(m_children, ret->m_children);\r
+ return ret;\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectBuilder : public XMLObjectBuilder\r
+{\r
+public:\r
+ XMLObject* buildObject() const {\r
+ throw XMLObjectException("No default builder available.");\r
+ }\r
+\r
+ WildcardXMLObject* buildObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) const {\r
+ return new WildcardXMLObject(nsURI,localName,prefix);\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectMarshaller : public AbstractXMLObjectMarshaller\r
+{\r
+public:\r
+ WildcardXMLObjectMarshaller() : AbstractXMLObjectMarshaller() {}\r
+\r
+private:\r
+ void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+ const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+ for (map<QName,XMLCh*>::const_iterator i=wcXMLObject.m_attributeMap.begin(); i!=wcXMLObject.m_attributeMap.end(); i++) {\r
+ DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(i->first.getNamespaceURI(),i->first.getLocalPart());\r
+ if (i->first.hasPrefix())\r
+ attr->setPrefix(i->first.getPrefix());\r
+ attr->setNodeValue(i->second);\r
+ domElement->setAttributeNode(attr);\r
+ }\r
+ }\r
+\r
+ void marshallElementContent(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+ const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+ if(wcXMLObject.getTextContent()) {\r
+ domElement->appendChild(domElement->getOwnerDocument()->createTextNode(wcXMLObject.getTextContent()));\r
+ }\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller\r
+{\r
+public:\r
+ WildcardXMLObjectUnmarshaller() {}\r
+\r
+private:\r
+ XMLObject* buildXMLObject(const DOMElement* domElement) const {\r
+ const WildcardXMLObjectBuilder* builder =\r
+ dynamic_cast<const WildcardXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(domElement));\r
+ if (builder)\r
+ return builder->buildObject(domElement->getNamespaceURI(),domElement->getLocalName(),domElement->getPrefix());\r
+ throw UnmarshallingException("Failed to locate WildcardObjectBuilder for element.");\r
+ }\r
+\r
+ void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(parentXMLObject);\r
+\r
+ wcXMLObject.getXMLObjects().push_back(childXMLObject);\r
+ }\r
+\r
+ void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+ \r
+ wcXMLObject.setAttribute(\r
+ QName(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()),\r
+ attribute->getNodeValue()\r
+ );\r
+ }\r
+\r
+ void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+ \r
+ wcXMLObject.setTextContent(elementContent);\r
+ }\r
+\r
+};\r