You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2012/07/22 10:09:17 UTC

svn commit: r1364223 - in /webservices/axiom/branches/AXIOM-437/modules: axiom-api/src/main/java/org/apache/axiom/om/impl/builder/ axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/ axiom-testsuite/src/main/java/org/apache/axiom/t...

Author: veithen
Date: Sun Jul 22 08:09:16 2012
New Revision: 1364223

URL: http://svn.apache.org/viewvc?rev=1364223&view=rev
Log:
Reconstruct OMDocType nodes in SAX ContentHandler.

Modified:
    webservices/axiom/branches/AXIOM-437/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMBuilder.java
    webservices/axiom/branches/AXIOM-437/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMXMLParserWrapper.java
    webservices/axiom/branches/AXIOM-437/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/TestCreateOMBuilderFromSAXSource.java

Modified: webservices/axiom/branches/AXIOM-437/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/AXIOM-437/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMBuilder.java?rev=1364223&r1=1364222&r2=1364223&view=diff
==============================================================================
--- webservices/axiom/branches/AXIOM-437/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMBuilder.java (original)
+++ webservices/axiom/branches/AXIOM-437/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMBuilder.java Sun Jul 22 08:09:16 2012
@@ -35,6 +35,7 @@ import org.apache.axiom.om.impl.OMNodeEx
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
+import org.xml.sax.ext.DeclHandler;
 import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.helpers.DefaultHandler;
 
@@ -43,9 +44,34 @@ import java.util.List;
 
 import javax.xml.XMLConstants;
 
-public class SAXOMBuilder extends DefaultHandler implements LexicalHandler, OMXMLParserWrapper {
+public class SAXOMBuilder extends DefaultHandler implements LexicalHandler, DeclHandler, OMXMLParserWrapper {
     private OMDocument document;
     
+    /**
+     * Stores the root name if there is a DTD.
+     */
+    private String dtdName;
+    
+    /**
+     * Stores the public ID if there is a DTD.
+     */
+    private String dtdPublicId;
+    
+    /**
+     * Stores the system ID if there is a DTD.
+     */
+    private String dtdSystemId;
+    
+    /**
+     * Stores the internal subset if there is a DTD.
+     */
+    private StringBuilder internalSubset;
+    
+    /**
+     * Flag indicating that the parser is processing the external subset.
+     */
+    private boolean inExternalSubset;
+    
     OMElement root = null;
 
     OMNode lastNode = null;
@@ -95,10 +121,101 @@ public class SAXOMBuilder extends Defaul
     }
 
     public void startDTD(String name, String publicId, String systemId) throws SAXException {
-//        addNode(factory.createOMDocType(getContainer(), ""));
+        dtdName = name;
+        dtdPublicId = publicId;
+        dtdSystemId = systemId;
+        internalSubset = new StringBuilder();
+    }
+
+    public void elementDecl(String name, String model) throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!ELEMENT ");
+            internalSubset.append(name);
+            internalSubset.append(' ');
+            internalSubset.append(model);
+            internalSubset.append(">\n");
+        }
+    }
+
+    public void attributeDecl(String eName, String aName, String type, String mode, String value)
+            throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!ATTLIST ");
+            internalSubset.append(eName);
+            internalSubset.append(' ');
+            internalSubset.append(aName);
+            internalSubset.append(' ');
+            internalSubset.append(type);
+            if (value != null) {
+                internalSubset.append(' ');
+                internalSubset.append(value);
+            }
+            internalSubset.append(">\n");
+        }
+    }
+
+    public void externalEntityDecl(String name, String publicId, String systemId) throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!ENTITY ");            
+            internalSubset.append(name);
+            if (publicId != null) {
+                internalSubset.append(" PUBLIC \"");
+                internalSubset.append(publicId);
+            } else {
+                internalSubset.append(" SYSTEM \"");
+                internalSubset.append(systemId);
+            }
+            internalSubset.append("\">\n");
+        }
+    }
+
+    public void internalEntityDecl(String name, String value) throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!ENTITY ");
+            internalSubset.append(name);
+            internalSubset.append(" \"");
+            internalSubset.append(value);
+            internalSubset.append("\">\n");
+        }
+    }
+
+    public void notationDecl(String name, String publicId, String systemId) throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!NOTATION ");            
+            internalSubset.append(name);
+            if (publicId != null) {
+                internalSubset.append(" PUBLIC \"");
+                internalSubset.append(publicId);
+            } else {
+                internalSubset.append(" SYSTEM \"");
+                internalSubset.append(systemId);
+            }
+            internalSubset.append("\">\n");
+        }
+    }
+
+    public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
+            throws SAXException {
+        if (!inExternalSubset) {
+            internalSubset.append("<!ENTITY ");
+            internalSubset.append(name);
+            if (publicId != null) {
+                internalSubset.append(" PUBLIC \"");
+                internalSubset.append(publicId);
+            } else {
+                internalSubset.append(" SYSTEM \"");
+                internalSubset.append(systemId);
+            }
+            internalSubset.append("\" NDATA ");
+            internalSubset.append(notationName);
+            internalSubset.append(">\n");
+        }
     }
 
     public void endDTD() throws SAXException {
+        addNode(factory.createOMDocType(getContainer(), dtdName, dtdPublicId, dtdSystemId,
+                internalSubset.length() == 0 ? null : internalSubset.toString(), true));
+        internalSubset = null;
     }
 
     protected OMElement createNextElement(String localName) throws OMException {
@@ -235,9 +352,15 @@ public class SAXOMBuilder extends Defaul
     }
 
     public void startEntity(String name) throws SAXException {
+        if (name.equals("[dtd]")) {
+            inExternalSubset = true;
+        }
     }
 
     public void endEntity(String name) throws SAXException {
+        if (name.equals("[dtd]")) {
+            inExternalSubset = false;
+        }
     }
 
     public OMDocument getDocument() {

Modified: webservices/axiom/branches/AXIOM-437/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMXMLParserWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/AXIOM-437/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMXMLParserWrapper.java?rev=1364223&r1=1364222&r2=1364223&view=diff
==============================================================================
--- webservices/axiom/branches/AXIOM-437/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMXMLParserWrapper.java (original)
+++ webservices/axiom/branches/AXIOM-437/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMXMLParserWrapper.java Sun Jul 22 08:09:16 2012
@@ -56,12 +56,18 @@ public class SAXOMXMLParserWrapper imple
             SAXOMBuilder builder = new SAXOMBuilder(factory);
             XMLReader reader = source.getXMLReader();
             reader.setContentHandler(builder);
+            reader.setDTDHandler(builder);
             try {
                 reader.setProperty("http://xml.org/sax/properties/lexical-handler", builder);
             } catch (SAXException ex) {
                 // Ignore
             }
             try {
+                reader.setProperty("http://xml.org/sax/properties/declaration-handler", builder);
+            } catch (SAXException ex) {
+                // Ignore
+            }
+            try {
                 reader.parse(source.getInputSource());
             } catch (IOException ex) {
                 throw new OMException(ex);

Modified: webservices/axiom/branches/AXIOM-437/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/TestCreateOMBuilderFromSAXSource.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/AXIOM-437/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/TestCreateOMBuilderFromSAXSource.java?rev=1364223&r1=1364222&r2=1364223&view=diff
==============================================================================
--- webservices/axiom/branches/AXIOM-437/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/TestCreateOMBuilderFromSAXSource.java (original)
+++ webservices/axiom/branches/AXIOM-437/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/TestCreateOMBuilderFromSAXSource.java Sun Jul 22 08:09:16 2012
@@ -26,7 +26,6 @@ import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.sax.SAXSource;
 
-import org.apache.axiom.om.AbstractTestCase;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMXMLBuilderFactory;
 import org.apache.axiom.om.OMXMLParserWrapper;
@@ -53,8 +52,8 @@ public class TestCreateOMBuilderFromSAXS
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             builder.getDocument().serialize(baos);
             XMLAssert.assertXMLIdentical(XMLUnit.compareXML(
-                    AbstractTestCase.toDocumentWithoutDTD(getFileAsStream()),
-                    AbstractTestCase.toDocumentWithoutDTD(new ByteArrayInputStream(baos.toByteArray()))), true);
+                    new InputSource(getFileAsStream()),
+                    new InputSource(new ByteArrayInputStream(baos.toByteArray()))), true);
         } finally {
             in.close();
         }