You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2007/05/07 11:51:09 UTC

svn commit: r535824 - in /xerces/c/trunk: Projects/Win32/VC8/xerces-all/DOMNormalizerTest/ src/xercesc/parsers/ src/xercesc/xinclude/

Author: amassari
Date: Mon May  7 02:51:07 2007
New Revision: 535824

URL: http://svn.apache.org/viewvc?view=rev&rev=535824
Log:
XInclude reuses the entity resolver of the parser, if the user set it

Modified:
    xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj
    xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp
    xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp
    xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp
    xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp
    xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp

Modified: xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj
URL: http://svn.apache.org/viewvc/xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj (original)
+++ xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj Mon May  7 02:51:07 2007
@@ -3,7 +3,7 @@
 	ProjectType="Visual C++"
 	Version="8,00"
 	Name="DOMNormalizerTest"
-	ProjectGUID="{BE9C14B1-2301-4c62-85E2-B583D22AE29C}"
+	ProjectGUID="{BE9C14B1-2301-4C62-85E2-B583D22AE29C}"
 	>
 	<Platforms>
 		<Platform

Modified: xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp (original)
+++ xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp Mon May  7 02:51:07 2007
@@ -855,7 +855,7 @@
     {
     	XIncludeUtils xiu((XMLErrorReporter *) this);
 	    /* process the XInclude node, then update the fCurrentNode with the new content*/
-	    if(xiu.parseDOMNodeDoingXInclude(fCurrentNode, fDocument))
+	    if(xiu.parseDOMNodeDoingXInclude(fCurrentNode, fDocument, getScanner()->getEntityHandler()))
             fCurrentNode = fCurrentParent->getLastChild();
     }
 }

Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp Mon May  7 02:51:07 2007
@@ -32,7 +32,7 @@
 XERCES_CPP_NAMESPACE_BEGIN
 
 DOMDocument *
-XIncludeDOMDocumentProcessor::doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler){
+XIncludeDOMDocumentProcessor::doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler, XMLEntityHandler* entityResolver /*=NULL*/){
 	XIncludeUtils xiu(errorHandler);
 
 	DOMImplementation* impl = source->getImplementation();
@@ -59,7 +59,7 @@
 
 	    DOMNode *docNode = xincludedDocument->getDocumentElement();
 	    /* parse and include the document node */
-	    xiu.parseDOMNodeDoingXInclude(docNode, xincludedDocument);
+	    xiu.parseDOMNodeDoingXInclude(docNode, xincludedDocument, entityResolver);
 
     	xincludedDocument->normalizeDocument();
     }

Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp Mon May  7 02:51:07 2007
@@ -28,6 +28,8 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class XMLEntityHandler;
+
 /**
   * Class for representing and manipulating the XMLCh * href's used
   * by an xi:include element.
@@ -47,7 +49,7 @@
       * @return a newly created DOMDocument containing the parsed and actioned
 	  * xinclude elements.
       */
-	DOMDocument *doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler);
+	DOMDocument *doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler, XMLEntityHandler* entityResolver=NULL);
 };
 
 XERCES_CPP_NAMESPACE_END

Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp Mon May  7 02:51:07 2007
@@ -25,8 +25,13 @@
 #include <xercesc/util/TransService.hpp>
 #include <xercesc/util/XMLUri.hpp>
 #include <xercesc/util/XMLMsgLoader.hpp>
+#include <xercesc/util/XMLResourceIdentifier.hpp>
+#include <xercesc/util/BinInputStream.hpp>
+#include <xercesc/util/OutOfMemoryException.hpp>
 #include <xercesc/internal/XMLInternalErrorHandler.hpp>
 #include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/sax/InputSource.hpp>
+#include <xercesc/framework/URLInputSource.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -46,7 +51,7 @@
 //   all xinclude manipulation is done in place (i.e. source is manipulated).
 // ---------------------------------------------------------------------------
 bool 
-XIncludeUtils::parseDOMNodeDoingXInclude(DOMNode *sourceNode, DOMDocument *parsedDocument){
+XIncludeUtils::parseDOMNodeDoingXInclude(DOMNode *sourceNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){
 	int included = 0;
     if (sourceNode) {
 		/* create the list of child elements here, since it gets changed during the parse */
@@ -59,7 +64,7 @@
 			if (isXIIncludeDOMNode(sourceNode)){
 				/* once we do an include on the source element, it is unsafe to do the include
 				   on the children, since they will have been changed by the top level include */
-				bool success = doDOMNodeXInclude(sourceNode, parsedDocument);
+				bool success = doDOMNodeXInclude(sourceNode, parsedDocument, entityResolver);
 
 				//popFromCurrentInclusionHistoryStack(NULL);
 				/* return here as we do not want to fall through to the parsing of the children below
@@ -78,7 +83,7 @@
 		   need to walk the entire child list parsing for each. An xinclude in  a
 		   node does not affect a peer, so we can simply parse each child in turn */
 		for (unsigned int i = 0; i < children.size(); i++){
-			parseDOMNodeDoingXInclude(children.elementAt(i), parsedDocument);
+			parseDOMNodeDoingXInclude(children.elementAt(i), parsedDocument, entityResolver);
 		}
 	}
 	return (included)?true:false;
@@ -115,7 +120,7 @@
 //   it accordingly, acting on what it finds.
 // ---------------------------------------------------------------------------
 bool
-XIncludeUtils::doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument){
+XIncludeUtils::doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){
 	bool modifiedNode = false;
 	/* the relevant attributes to look for */
 	const XMLCh *href = NULL;
@@ -232,10 +237,10 @@
 	DOMDocument *includedDoc = NULL;
 	if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrXMLValue)){
 		/* including a XML element */
-		includedDoc = doXIncludeXMLFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), xincludeNode, parsedDocument);
+		includedDoc = doXIncludeXMLFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), xincludeNode, parsedDocument, entityResolver);
 	} else if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrTextValue)){
 		/* including a text value */
-		includedText = doXIncludeTEXTFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), encoding, parsedDocument);
+		includedText = doXIncludeTEXTFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), encoding, xincludeNode, parsedDocument, entityResolver);
 	} else {
 		/* invalid parse attribute value - fatal error according to the specification */
 		XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeInvalidParseVal,
@@ -282,7 +287,7 @@
                         }
                     }
                     DOMNode *newChild = includeParent->insertBefore(newNode, xincludeNode);
-					parseDOMNodeDoingXInclude(newChild, parsedDocument);
+					parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
 				}
 				includeParent->removeChild(xincludeNode);
 				modifiedNode = true;
@@ -369,7 +374,7 @@
                 }
                 DOMNode *newNode = parsedDocument->importNode(child, true);
                 DOMNode *newChild = includeParent->insertBefore(newNode, xincludeNode);
-                parseDOMNodeDoingXInclude(newChild, parsedDocument);
+                parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
             }
             includeParent->removeChild(xincludeNode);
             popFromCurrentInclusionHistoryStack(NULL);
@@ -387,7 +392,11 @@
 }
 
 DOMDocument *
-XIncludeUtils::doXIncludeXMLFileDOM(const XMLCh *href, const XMLCh *relativeHref, DOMNode *includeNode, DOMDocument *parsedDocument){
+XIncludeUtils::doXIncludeXMLFileDOM(const XMLCh *href, 
+                                    const XMLCh *relativeHref, 
+                                    DOMNode *includeNode, 
+                                    DOMDocument *parsedDocument, 
+                                    XMLEntityHandler* entityResolver){
     if (XIncludeUtils::isInCurrentInclusionHistoryStack(href)){
          /* including something back up the current history */
          XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCircularInclusionLoop,
@@ -414,7 +423,21 @@
 
     DOMDocument *includedNode = NULL;
     try {
-        parser.parse(href);
+        InputSource* is=NULL;
+        Janitor<InputSource> janIS(is);
+        if(entityResolver) {
+            XMLResourceIdentifier resIdentifier(XMLResourceIdentifier::ExternalEntity,
+                                                relativeHref,
+                                                NULL,
+                                                NULL,
+                                                includeNode->getBaseURI());
+            is=entityResolver->resolveEntity(&resIdentifier);
+            janIS.reset(is);
+        }
+        if(janIS.get()!=NULL)
+            parser.parse(*janIS.get());
+        else
+            parser.parse(href);
         /* need to be able to release the parser but keep the document */
         if (!xierrhandler.getSawError() && !xierrhandler.getSawFatal())
             includedNode = parser.adoptDocument();
@@ -465,69 +488,77 @@
 }                                                                                                                                                                                                                                                      
 
 DOMText * 
-XIncludeUtils::doXIncludeTEXTFileDOM(const XMLCh *href, const XMLCh *relativeHref, const XMLCh *encoding, DOMDocument *parsedDocument){
+XIncludeUtils::doXIncludeTEXTFileDOM(const XMLCh *href, 
+                                     const XMLCh *relativeHref, 
+                                     const XMLCh *encoding, 
+                            		 DOMNode *includeNode,
+                                     DOMDocument *parsedDocument, 
+                                     XMLEntityHandler* entityResolver){
 	if (encoding == NULL)
 		/* "UTF-8" is stipulated default by spec */
 		encoding = XMLUni::fgUTF8EncodingString;
 
 	XMLTransService::Codes failReason;
 	XMLTranscoder* transcoder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(encoding, failReason, 16*1024);
+    Janitor<XMLTranscoder> janTranscoder(transcoder);
 	if (failReason){
 		XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile, href, href);
 		return NULL;
     }
 
-    DOMText *ret = NULL;
-
 	//addDocumentURIToCurrentInclusionHistoryStack(href);
 
-	int pathLen = XMLString::stringLen(href);
-	/*(XMLString::stringLen(baseURI) + 9)*sizeof(XMLCh)
-	  I am guessing 9 == "file:///" + 1 (nullTerm?) */
-	XMLCh *fixedFullTargetPath = (XMLCh *)XMLPlatformUtils::fgMemoryManager->allocate((pathLen + 9) * sizeof(XMLCh));
-	if (fixedFullTargetPath == NULL){
-		delete transcoder;
-		return NULL;
-	}
-	XMLString::fixURI(href, fixedFullTargetPath);
-
-	/* openFile doesn't like the protocol prefix, probably a better way of doing this. */
-	const XMLCh *fileRefMinusProtocol = XIncludeLocation::findEndOfProtocol(fixedFullTargetPath);
-	FileHandle fh = XMLPlatformUtils::openFile(fileRefMinusProtocol);
-	if (fh == NULL){
-		delete transcoder;
-		XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
-			href, href);
-		return NULL;
-	} 
-	/* TODO - is this really the easiest way to read in the file and pass it out to DocHandler? */
-	XMLFilePos fileLen = XMLPlatformUtils::fileSize(fh);
-	XMLByte *buffer = (XMLByte *) XMLPlatformUtils::fgMemoryManager->allocate(fileLen * sizeof(XMLByte));
-	XMLCh *xmlChars = (XMLCh *) XMLPlatformUtils::fgMemoryManager->allocate((fileLen + 1) * sizeof(XMLCh));
-	unsigned char *charSizes = (unsigned char *)XMLPlatformUtils::fgMemoryManager->allocate(fileLen * sizeof(unsigned char));
-	if (buffer != NULL && xmlChars != NULL && charSizes != NULL){
-		XMLSize_t sizeRead = XMLPlatformUtils::readFileBuffer(fh, fileLen, buffer);
-		XMLPlatformUtils::closeFile(fh);
-
-        unsigned int processedFromSource = 0;
-		int charsInBuffer = transcoder->transcodeFrom(buffer, sizeRead, xmlChars , fileLen, processedFromSource, charSizes);
-		xmlChars[fileLen] = chNull;
-		/* TODO check for and consume / act on byte order mark if present -
-		   possibly done under the covers actually */
-
-		/* report or record the xmlChars */
-		ret = parsedDocument->createTextNode(xmlChars);
-	}
-    else {
-    	/* memory manager should have thrown an exception */
-        ret = NULL;
-    }
-	delete transcoder;
-	XMLPlatformUtils::fgMemoryManager->deallocate(buffer);
-	XMLPlatformUtils::fgMemoryManager->deallocate(fixedFullTargetPath);
-	XMLPlatformUtils::fgMemoryManager->deallocate(xmlChars);
-	XMLPlatformUtils::fgMemoryManager->deallocate(charSizes);
-    return ret;
+    InputSource* is=NULL;
+    Janitor<InputSource> janIS(is);
+    if(entityResolver) {
+        XMLResourceIdentifier resIdentifier(XMLResourceIdentifier::ExternalEntity,
+                                            relativeHref,
+                                            NULL,
+                                            NULL,
+                                            includeNode->getBaseURI());
+        is=entityResolver->resolveEntity(&resIdentifier);
+        janIS.reset(is);
+    }
+    if(janIS.get()==NULL)
+        janIS.reset(new URLInputSource(href));
+    if(janIS.get()==NULL) {
+	    XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
+		    href, href);
+        return NULL;
+    }
+    BinInputStream* stream=janIS.get()->makeStream();
+    if(stream==NULL) {
+	    XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
+		    href, href);
+        return NULL;
+    }
+    Janitor<BinInputStream> janStream(stream);
+    const int maxToRead=16*1024;
+    XMLByte* buffer=(XMLByte*)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead * sizeof(XMLByte));
+    if(buffer==NULL)
+        throw OutOfMemoryException();
+    ArrayJanitor<XMLByte> janBuffer(buffer, XMLPlatformUtils::fgMemoryManager);
+    XMLCh* xmlChars=(XMLCh*)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead*2*sizeof(XMLCh));
+    if(xmlChars==NULL)
+        throw OutOfMemoryException();
+    ArrayJanitor<XMLCh> janUniBuffer(xmlChars, XMLPlatformUtils::fgMemoryManager);
+    unsigned char *charSizes = (unsigned char *)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead * sizeof(unsigned char));
+    if(charSizes==NULL)
+        throw OutOfMemoryException();
+    ArrayJanitor<unsigned char> janCharSizes(charSizes, XMLPlatformUtils::fgMemoryManager);
+
+    unsigned int nRead, nOffset=0;
+    XMLBuffer repository;
+    while((nRead=stream->readBytes(buffer+nOffset, maxToRead-nOffset))>0){
+        unsigned int bytesEaten=0;
+	    unsigned int nCount = transcoder->transcodeFrom(buffer, nRead, xmlChars, maxToRead*2, bytesEaten, charSizes);
+        repository.append(xmlChars, nCount);
+        if(bytesEaten<nRead) {
+            nOffset=nRead-bytesEaten;
+            memmove(buffer, buffer+bytesEaten, nRead-bytesEaten);
+        }
+    }
+    return parsedDocument->createTextNode(repository.getRawBuffer());
 }
 
 /*static*/ bool 

Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp Mon May  7 02:51:07 2007
@@ -33,6 +33,8 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class XMLEntityHandler;
+
 typedef struct XIncludeHistoryNode{
 	XMLCh *URI;
 	struct XIncludeHistoryNode *next;
@@ -67,7 +69,7 @@
       * @return true if the XInclude processing was successful, false if not. Note that an
 	  * XInclude that fails resulting in a successful fallback action would return true.
       */
-	bool doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument);
+	bool doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver);
 
 	 /** Parse an XInclude xml file into a DOMDocument node.
 	  *
@@ -81,7 +83,8 @@
 	DOMDocument *doXIncludeXMLFileDOM(const XMLCh *href, 
 		const XMLCh *relativeHref,
 		DOMNode *xincludeNode,
-		DOMDocument *parsedDocument);
+		DOMDocument *parsedDocument, 
+		XMLEntityHandler* entityResolver);
 
 	 /** Parse an XInclude text file into a DOMText node.
 	  *
@@ -96,7 +99,9 @@
 	DOMText *doXIncludeTEXTFileDOM(const XMLCh *href, 
 		const XMLCh *relativeHref,
 		const XMLCh *encoding,  
-		DOMDocument *parsedDocument);
+		DOMNode *xincludeNode,
+		DOMDocument *parsedDocument, 
+		XMLEntityHandler* entityResolver);
 
 	 /** Detect whether the supplied details are correct for an xi:include element
 	  *
@@ -144,7 +149,7 @@
 	  *
       * @return true if XInclude behaviour was successfully performed on source, false if not.
       */
-	bool parseDOMNodeDoingXInclude(DOMNode *source, DOMDocument *parsedDocument);
+	bool parseDOMNodeDoingXInclude(DOMNode *source, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver);
 
 	 /** Parse the supplied URI and escape all characters as specified by
 	  * the XINclusions specification.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org