[Mobies-commit] [commit] r3642 - UDM/trunk/src/UdmDom
endre at redhat1.isis.vanderbilt.edu
endre at redhat1.isis.vanderbilt.edu
Fri Feb 18 14:04:25 CST 2011
Author: endre
Date: Fri Feb 18 14:04:25 2011
New Revision: 3642
Log:
Support for version 3.0 of xerces-c++
- use a custom MySerializer to save a document; MySerializer uses a
DOMWriter on version 2.x and a DOMLSSerializer on version 3.x
- setIdAttribute requires an additional parameter, use a macro to set it
Modified:
UDM/trunk/src/UdmDom/UdmDom.cpp
Modified: UDM/trunk/src/UdmDom/UdmDom.cpp
==============================================================================
--- UDM/trunk/src/UdmDom/UdmDom.cpp Fri Feb 18 14:01:50 2011 (r3641)
+++ UDM/trunk/src/UdmDom/UdmDom.cpp Fri Feb 18 14:04:25 2011 (r3642)
@@ -224,6 +224,12 @@
XERCES_CPP_NAMESPACE_USE
+#if _XERCES_VERSION < 30000
+#define SET_ID_ATTR(dom_element, attr) dom_element->setIdAttribute(attr)
+#else
+#define SET_ID_ATTR(dom_element, attr) dom_element->setIdAttribute(attr, true)
+#endif
+
#define UDM_DOM_URI_PREFIX "http://www.isis.vanderbilt.edu/2004/schemas/"
static const XMLCh gXML__id[] =
@@ -832,7 +838,7 @@
//assign it
dom_element->setAttribute(gXML__id, buf);
- dom_element->setIdAttribute(gXML__id);
+ SET_ID_ATTR(dom_element, gXML__id);
a = dom_element->getAttribute(gXML__id);
@@ -884,7 +890,7 @@
id = reinterpret_cast<uniqueId_type>(p);
XMLString::binToText(id, buf + 2, 18, 16);
dom_element->setAttribute(gXML__id, buf);
- dom_element->setIdAttribute(gXML__id);
+ SET_ID_ATTR(dom_element, gXML__id);
}
};
};
@@ -3438,34 +3444,86 @@
delete *parser;
}
- static DOMWriter* createDOMWriterForDocument(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument &doc)
+ class MySerializer {
+#if _XERCES_VERSION < 30000
+ DOMWriter *serializer;
+#else
+ DOMLSSerializer *serializer;
+#endif
+ public:
+ MySerializer(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc);
+ ~MySerializer();
+
+ void serializeTo(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc, XMLFormatTarget *target) const;
+ };
+
+#if _XERCES_VERSION < 30000
+
+ MySerializer::MySerializer(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc)
{
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(X("LS"));
- DOMWriter *writer = ((DOMImplementationLS*)impl)->createDOMWriter();
+ serializer = ((DOMImplementationLS*)impl)->createDOMWriter();
- const XMLCh *doc_encoding = doc.getEncoding();
+ const XMLCh *doc_encoding = doc->getEncoding();
if (doc_encoding)
- writer->setEncoding(doc_encoding);
+ serializer->setEncoding(doc_encoding);
else
- writer->setEncoding(gXML_UTF_8);
+ serializer->setEncoding(gXML_UTF_8);
+
+ if (serializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
+ serializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
- if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
- writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
+ serializer->setErrorHandler(new MobiesDOMErrorHandler());
+ }
- writer->setErrorHandler(new MobiesDOMErrorHandler());
+ MySerializer::~MySerializer()
+ {
+ DOMErrorHandler *err_handler = serializer->getErrorHandler();
+ delete err_handler;
- return writer;
+ delete serializer;
}
- static void releaseDOMWriter(DOMWriter **writer)
+ void MySerializer::serializeTo(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc, XMLFormatTarget *target) const
{
- DOMErrorHandler *err_handler = (*writer)->getErrorHandler();
+ serializer->writeNode(target, *doc);
+ }
+
+#else //_XERCES_VERSION < 30000
+
+ MySerializer::MySerializer(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc)
+ {
+ DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(X("LS"));
+ serializer = ((DOMImplementationLS*)impl)->createLSSerializer();
+
+ DOMConfiguration *conf = serializer->getDomConfig();
+ if (conf->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true))
+ conf->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
+
+ conf->setParameter(XMLUni::fgDOMErrorHandler, new MobiesDOMErrorHandler());
+ }
+
+ MySerializer::~MySerializer()
+ {
+ DOMErrorHandler *err_handler = (DOMErrorHandler*) serializer->getDomConfig()->getParameter(XMLUni::fgDOMErrorHandler);
delete err_handler;
- delete *writer;
- *writer = NULL;
+ serializer->release();
+ }
+
+ void MySerializer::serializeTo(const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc, XMLFormatTarget *target) const
+ {
+ DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(X("LS"));
+ DOMLSOutput *output = ((DOMImplementationLS*)impl)->createLSOutput();
+ output->setByteStream(target);
+ output->setEncoding(gXML_UTF_8);
+
+ serializer->write(doc, output);
+ output->release();
}
+#endif //_XERCES_VERSION < 30000
+
void DomDataNetwork::AddToMetaClassesCache(const set< ::Uml::Class> &meta_classes)
{
@@ -3566,7 +3624,7 @@
if (!EmptyVal(a))
{
// attribute "id" is of type ID
- dd->setIdAttribute(gXML__id);
+ SET_ID_ATTR(dd, gXML__id);
//convert to long
long id = GetLongID(a);
@@ -4096,7 +4154,7 @@
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc = de->getOwnerDocument();
ASSERT( doc != NULL);
- DOMWriter *writer = createDOMWriterForDocument(*doc);
+ MySerializer serializer(doc);
if (str_based)
{
@@ -4104,19 +4162,19 @@
// XXX: this needs rethinking, we're putting bytes
// into a string of characters
- MemBufFormatTarget *out = new MemBufFormatTarget();
- writer->writeNode(out, *doc);
- str = string((const char *) out->getRawBuffer(), out->getLen());
- delete out;
+ MemBufFormatTarget *mem_target = new MemBufFormatTarget();
+ serializer.serializeTo(doc, mem_target);
+ str = string((const char *) mem_target->getRawBuffer(), mem_target->getLen());
+
+ delete mem_target;
}
else
{
- XMLFormatTarget *out = new LocalFileFormatTarget(X(savesystemname));
- writer->writeNode(out, *doc);
- delete out;
+ XMLFormatTarget *file_target = new LocalFileFormatTarget(X(savesystemname));
+ serializer.serializeTo(doc, file_target);
+ delete file_target;
}
- releaseDOMWriter(&writer);
if (parser->getDocument() == NULL) {
delete doc;
@@ -4135,13 +4193,10 @@
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc = de->getOwnerDocument();
ASSERT( doc != NULL);
- DOMWriter *writer = createDOMWriterForDocument(*doc);
- XMLFormatTarget *out = new LocalFileFormatTarget(X(systemname));
-
- writer->writeNode(out, *doc);
-
- releaseDOMWriter(&writer);
- delete out;
+ MySerializer serializer(doc);
+ XMLFormatTarget *file_target = new LocalFileFormatTarget(X(systemname));
+ serializer.serializeTo(doc, file_target);
+ delete file_target;
CATCH_XML_EXCEPTION("DomDataNetwork::SaveAs()")
};
More information about the Mobies-commit
mailing list