[mapguide-commits] r5015 -
sandbox/rfc102/MgDev/Server/src/Services/Resource
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Fri Jul 9 10:01:39 EDT 2010
Author: rohitr
Date: 2010-07-09 14:01:39 +0000 (Fri, 09 Jul 2010)
New Revision: 5015
Added:
sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp
sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h
Modified:
sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp
sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp
sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp
sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp
sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h
sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp
Log:
Changes for upgrade to xerces 3.1.0. Additional information in Ticket #1399
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -69,7 +69,8 @@
if (MgRepositoryType::Session == repositoryType)
{
- m_dbEnv.set_flags(DB_LOG_INMEMORY, 1);
+ //this has to be changed since the underlying function has changed
+ m_dbEnv.log_set_config(DB_LOG_IN_MEMORY, 1);
environmentFlags |= DB_PRIVATE;
}
else
@@ -96,7 +97,7 @@
pageSize = MG_SESS_DBXML_PAGE_SIZE;
}
- m_xmlMan = XmlManager(&m_dbEnv, DBXML_ALLOW_EXTERNAL_ACCESS);
+ m_xmlMan = XmlManager(m_dbEnv.get_DB_ENV(), DBXML_ALLOW_EXTERNAL_ACCESS);
m_xmlMan.setDefaultPageSize(pageSize);
m_xmlMan.setDefaultContainerType(XmlContainer::WholedocContainer);
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -431,7 +431,7 @@
assert(NULL != m_dbTxn);
m_xmlTxn.reset(new XmlTransaction(
- environment->GetXmlManager().createTransaction(m_dbTxn)));
+ environment->GetXmlManager().createTransaction(m_dbTxn->get_DB_TXN())));
assert(NULL != m_xmlTxn.get());
}
else
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -388,7 +388,9 @@
if (!resource.IsRuntimeResource())
{
- DOMDocument* domDoc = xmlDoc.getContentAsDOM();
+ //bad programming but I want it to work, the first time. :)
+ DbXml::XmlValue temp_xmlValue(xmlDoc);
+ DOMDocument* domDoc = getContentAsDOM(temp_xmlValue);
assert(NULL != domDoc);
MgXmlUtil xmlUtil(domDoc, false);
DOMElement* rootNode = xmlUtil.GetRootNode();
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -1475,7 +1475,6 @@
XmlQueryExpression& selectGroupPermissions)
{
XmlManager& xmlMan = m_container.getManager();
- queryContext.setReturnType(XmlQueryContext::DeadValues);
string xpathInheritedFlags = "/*/Security/Inherited/text()";
selectInheritedFlags = IsTransacted() ?
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h 2010-07-09 14:01:39 UTC (rev 5015)
@@ -21,12 +21,14 @@
#include "MapGuideCommon.h"
#include "System/XmlDefs.h"
#include "System/XmlUtil.h"
+#include "xercesDomTranslator.hpp"
#include <assert.h>
#include <map>
#include <vector>
#include <dbxml/DbXml.hpp>
#include <dwfcore/ZipFileDescriptor.h>
+#include <db_cxx.h>
using namespace DbXml;
@@ -59,25 +61,6 @@
mgException = new MgDbXmlException(methodName, __LINE__, __WFILE__, NULL, L"MgFormatInnerExceptionMessage", &arguments); \
(static_cast<MgThirdPartyException*>(mgException.p))->SetErrorCode(e.getDbErrno()); \
} \
- catch (DbException& e) \
- { \
- MgStringCollection arguments; \
- STRING message; \
- \
- if (DB_LOCK_DEADLOCK == e.get_errno()) \
- { \
- message = MgUtil::GetResourceMessage( \
- MgResources::ResourceService, L"MgRepositoryBusy"); \
- } \
- else \
- { \
- MgUtil::MultiByteToWideChar(string(e.what()), message); \
- } \
- \
- arguments.Add(message); \
- mgException = new MgDbException(methodName, __LINE__, __WFILE__, NULL, L"MgFormatInnerExceptionMessage", &arguments); \
- (static_cast<MgThirdPartyException*>(mgException.p))->SetErrorCode(e.get_errno()); \
- } \
catch (DWFException& e) \
{ \
MgStringCollection arguments; \
Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp 2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -292,7 +292,6 @@
string docQuery = "/Group/Users/User/Name/text()";
XmlQueryContext docContext = xmlMan.createQueryContext();
- docContext.setReturnType(XmlQueryContext::DeadValues);
// Execute the XQuery.
@@ -395,7 +394,7 @@
string docQuery = "/Role/Users/User/Name/text()";
XmlQueryContext docContext = xmlMan.createQueryContext();
- docContext.setReturnType(XmlQueryContext::DeadValues);
+
// Execute the XQuery.
@@ -889,8 +888,7 @@
string docQuery = "/Role/Groups/Group/Name/text()";
XmlQueryContext docContext = xmlMan.createQueryContext();
- docContext.setReturnType(XmlQueryContext::DeadValues);
-
+
// Execute the XQuery.
XmlResults nodeResults = IsTransacted() ?
@@ -2026,8 +2024,8 @@
XmlValue docValue(xmlDoc);
// Set up an XQuery.
-
- string query = "/Group/Users/User[Name=\"";
+ // node and nodes are interchangeable
+ string query = "delete nodes /Group/Users/User[Name=\"";
query += MgUtil::WideCharToMultiByte(userId);
query += "\"]";
@@ -2035,22 +2033,15 @@
XmlManager& xmlMan = m_container.getManager();
XmlQueryContext queryContext = xmlMan.createQueryContext();
- XmlUpdateContext updateContext = xmlMan.createUpdateContext();
- XmlModify xmlMod = xmlMan.createModify();
-
if (IsTransacted())
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+ xmlMan.query(GetXmlTxn(), query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
}
else
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+ xmlMan.query(query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(docValue, queryContext, updateContext);
}
MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveUserFromGroup")
@@ -2143,7 +2134,7 @@
// Set up an XQuery.
- string query = "/Role/Users/User[Name=\"";
+ string query = "delete nodes /Role/Users/User[Name=\"";
query += MgUtil::WideCharToMultiByte(userId);
query += "\"]";
@@ -2151,22 +2142,16 @@
XmlManager& xmlMan = m_container.getManager();
XmlQueryContext queryContext = xmlMan.createQueryContext();
- XmlUpdateContext updateContext = xmlMan.createUpdateContext();
- XmlModify xmlMod = xmlMan.createModify();
-
+
if (IsTransacted())
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+ xmlMan.query(GetXmlTxn(), query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
}
else
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+ xmlMan.query(query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(docValue, queryContext, updateContext);
}
MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveUserFromRole")
@@ -2259,7 +2244,7 @@
// Set up an XQuery.
- string query = "/Role/Groups/Group[Name=\"";
+ string query = "delete nodes /Role/Groups/Group[Name=\"";
query += MgUtil::WideCharToMultiByte(groupId);
query += "\"]";
@@ -2267,22 +2252,16 @@
XmlManager& xmlMan = m_container.getManager();
XmlQueryContext queryContext = xmlMan.createQueryContext();
- XmlUpdateContext updateContext = xmlMan.createUpdateContext();
- XmlModify xmlMod = xmlMan.createModify();
-
+
if (IsTransacted())
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+ xmlMan.query(GetXmlTxn(), query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
}
else
{
- XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+ xmlMan.query(query, queryContext);
- xmlMod.addRemoveStep(xmlSelect);
- xmlMod.execute(docValue, queryContext, updateContext);
}
MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveGroupFromRole")
@@ -2358,8 +2337,7 @@
XmlManager& xmlMan = m_container.getManager();
XmlQueryContext docContext = xmlMan.createQueryContext();
- docContext.setReturnType(XmlQueryContext::DeadValues);
-
+
string xpathUserPassword = "/User/Password/text()";
XmlQueryExpression selectUserPassword = IsTransacted() ?
xmlMan.prepare(GetXmlTxn(), xpathUserPassword, docContext) :
Added: sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp (rev 0)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp 2010-07-09 14:01:39 UTC (rev 5015)
@@ -0,0 +1,250 @@
+/*
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2004,2009 Oracle. All rights reserved.
+ *
+ */
+// Heavily derived from the example given in dbxml/examples/dbcxx/xerces/
+//Modified to work with mapguide.
+//Stopgap arrangement till I write a cleaner class.
+// Implementation of sample code that uses Berkeley DB XML XmlEventReader
+// and XmlEventWriter interfaces to translate documents to and
+// from Xerces-C DOM documents.
+
+
+#include "xercesDomTranslator.hpp"
+#include <xercesc/dom/DOMImplementation.hpp>
+#include <xercesc/dom/DOM.hpp>
+#include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/util/XMLException.hpp>
+#include <xercesc/util/XMLUni.hpp>
+#include <xercesc/framework/MemBufFormatTarget.hpp>
+#include <iostream>
+
+#if defined(XERCES_HAS_CPP_NAMESPACE)
+XERCES_CPP_NAMESPACE_USE
+#endif
+
+using namespace DbXml;
+
+#define localAssert(expr, msg) if (!(expr)) throw(msg)
+
+//
+// toXMLCh and fromXMLCh are utility classes to transcode
+// to/from Xerces-C DOM (these could easily be replaced
+// by better/more efficient code). They are necessary because
+// Xerces-C uses XMLCh (usually UTF-16) and BDB XML uses UTF-8
+// in its event interfaces.
+//
+class toXMLCh
+{
+public:
+ toXMLCh(const unsigned char *str) {
+ if (str)
+ str_ = XMLString::transcode((const char *)str);
+ else
+ str_ = 0;
+ }
+ toXMLCh(const char *str) {
+ if (str)
+ str_ = XMLString::transcode(str);
+ else
+ str_ = 0;
+ }
+ ~toXMLCh() { XMLString::release(&str_); }
+ const XMLCh *str() const { return str_; }
+private:
+ XMLCh *str_;
+
+};
+
+class fromXMLCh
+{
+public:
+ fromXMLCh(const XMLCh *str) {
+ if (str && *str)
+ str_ = XMLString::transcode(str);
+ else
+ str_ = 0;
+ }
+ ~fromXMLCh() { XMLString::release(&str_); }
+ const unsigned char *str() const {
+ return (const unsigned char *)str_;
+ }
+ operator const unsigned char *() {
+ return str();
+ }
+private:
+ char *str_;
+
+};
+
+//
+// Public API implementation
+//
+XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *
+getContentAsDOM(const XmlValue &value)
+{
+ XmlEventReader &reader = value.asEventReader();
+ DOMEventWriter domWriter;
+ XmlEventReaderToWriter r2w(reader, domWriter,
+ false, false);
+ r2w.start();
+ reader.close();
+ return domWriter.getDocument();
+}
+
+//
+// Internals of implementation from here down
+//
+
+//
+// EventReaderToDOM Implementation. This class knows how to
+// construct Xerces-C DOM objects from BDB XML events
+//
+DOMEventWriter::DOMEventWriter()
+ : doc_(0), currentParent_(0), currentNode_(0)
+{
+ DOMImplementation *domImpl = DOMImplementation::getImplementation();
+ doc_ = domImpl->createDocument();
+ currentParent_ = doc_;
+ currentNode_ = doc_;
+}
+
+void DOMEventWriter::close()
+{
+ delete this;
+}
+
+void DOMEventWriter::writeAttribute(const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri,
+ const unsigned char *value,
+ bool isSpecified)
+{
+ localAssert((doc_ && currentParent_), "state");
+ DOMAttr *attr = doc_->createAttributeNS(
+ toXMLCh(uri).str(), toXMLCh(localName).str());
+ if (prefix)
+ attr->setPrefix(toXMLCh(prefix).str());
+ attr->setValue(toXMLCh(value).str());
+ currentNode_ = attr;
+ currentParent_->getAttributes()->setNamedItemNS(attr);
+}
+
+// text, comments, CDATA, ignorable whitespace
+// length does not include trailing null
+void DOMEventWriter::writeText(
+ DbXml::XmlEventReader::XmlEventType type,
+ const unsigned char *text,
+ size_t length)
+{
+ // TBD -- maybe use length...
+ toXMLCh x(text);
+ if(currentNode_ && currentNode_->getNodeType() == DOMNode::TEXT_NODE
+ && type == XmlEventReader::Characters) {
+ ((DOMText *)currentNode_)->appendData(x.str()); // coalesce
+ } else {
+ DOMNode *node = 0;
+ switch (type) {
+ case XmlEventReader::Characters:
+ case XmlEventReader::Whitespace:
+ node = doc_->createTextNode(x.str());
+ break;
+ case XmlEventReader::CDATA:
+ node = doc_->createCDATASection(x.str());
+ break;
+ case XmlEventReader::Comment:
+ node = doc_->createComment(x.str());
+ break;
+ default:
+ localAssert(false, "unknown text type");
+ };
+ localAssert(currentParent_, "state");
+ currentParent_->appendChild(node);
+ currentNode_ = node;
+ }
+}
+
+// processing Instruction
+void DOMEventWriter::writeProcessingInstruction(
+ const unsigned char *target,
+ const unsigned char *data)
+{
+ toXMLCh t(target);
+ toXMLCh d(data);
+ DOMProcessingInstruction *pi = doc_->createProcessingInstruction(
+ t.str(), d.str());
+ localAssert(currentParent_, "state");
+ currentParent_->appendChild(pi);
+ currentNode_ = pi;
+}
+
+// elements
+void DOMEventWriter::writeStartElement(
+ const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri,
+ int numAttributes,
+ bool isEmpty)
+{
+ toXMLCh lname(localName);
+ toXMLCh u(uri);
+
+ DOMElement *elem = doc_->createElementNS(u.str(), lname.str());
+ if(prefix != 0)
+ elem->setPrefix(toXMLCh(prefix).str());
+ if (currentParent_)
+ currentParent_->appendChild(elem);
+ currentParent_ = elem;
+ currentNode_ = elem;
+ // empty elements don't get end element events
+ if (isEmpty)
+ writeEndElement(localName, prefix, uri);
+}
+
+void DOMEventWriter::writeEndElement(
+ const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri)
+{
+ currentNode_ = currentParent_;
+ currentParent_ = currentNode_->getParentNode();
+}
+
+// DTD
+void DOMEventWriter::writeDTD(
+ const unsigned char *dtd, size_t length)
+{
+ localAssert(false, "cannot write DTD");
+}
+
+// XML decl and start document
+void DOMEventWriter::writeStartDocument(
+ const unsigned char *version,
+ const unsigned char *encoding,
+ const unsigned char *standalone)
+{
+ // no-op -- allocate document node in ctor
+ localAssert(doc_, "state");
+}
+
+void DOMEventWriter::writeEndDocument()
+{
+ currentNode_ = currentParent_;
+ currentParent_ = currentParent_->getParentNode();
+}
+
+// note the start of entity expansion
+void DOMEventWriter::writeStartEntity(
+ const unsigned char *name,
+ bool expandedInfoFollows)
+{
+}
+
+// note the end of entity expansion
+void DOMEventWriter::writeEndEntity(
+ const unsigned char *name)
+{
+}
+
Added: sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h (rev 0)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h 2010-07-09 14:01:39 UTC (rev 5015)
@@ -0,0 +1,94 @@
+/*
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2004,2009 Oracle. All rights reserved.
+ *
+ */
+// Heavily derived from the example given in dbxml/examples/dbcxx/xerces/
+// Modified to work with mapguide.
+// Stopgap arrangement till I write a cleaner class.
+// Implementation of sample code that uses Berkeley DB XML XmlEventReader
+// and XmlEventWriter interfaces to translate documents to and
+// from Xerces-C DOM documents.
+
+
+
+#include <dbxml/DbXml.hpp>
+#include <xercesc/dom/DOMDocument.hpp>
+
+
+//
+// Implementation classes from here down
+//
+
+//
+// This class implements XmlEventWriter in order to push (write)
+// BDB XML events (obtained via XmlEventReader) to a Xerces-C
+// DOMDocument.
+//
+class DOMEventWriter : public DbXml::XmlEventWriter
+{
+public:
+ DOMEventWriter();
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *getDocument() {
+ return doc_;
+ }
+ virtual void close();
+
+ // attributes (including namespaces)
+ virtual void writeAttribute(const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri,
+ const unsigned char *value,
+ bool isSpecified);
+
+ // text, comments, CDATA, ignorable whitespace
+ // length does not include trailing null
+ virtual void writeText(DbXml::XmlEventReader::XmlEventType type,
+ const unsigned char *text,
+ size_t length);
+
+ // processing Instruction
+ virtual void writeProcessingInstruction(const unsigned char *target,
+ const unsigned char *data);
+
+ // elements
+ virtual void writeStartElement(const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri,
+ int numAttributes,
+ bool isEmpty);
+ virtual void writeEndElement(const unsigned char *localName,
+ const unsigned char *prefix,
+ const unsigned char *uri);
+
+ // DTD
+ virtual void writeDTD(const unsigned char *dtd, size_t length);
+
+ // XML decl and start document
+ virtual void writeStartDocument(const unsigned char *version,
+ const unsigned char *encoding,
+ const unsigned char *standalone);
+ virtual void writeEndDocument();
+
+ // note the start of entity expansion
+ virtual void writeStartEntity(const unsigned char *name,
+ bool expandedInfoFollows);
+
+ // note the end of entity expansion
+ virtual void writeEndEntity(const unsigned char *name);
+
+private:
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc_;
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *currentParent_;
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *currentNode_;
+};
+
+
+using namespace DbXml;
+//
+// The public API to get/put content using Xerces-C DOM
+//
+XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *getContentAsDOM(
+ const DbXml::XmlValue &value);
+
More information about the mapguide-commits
mailing list