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();
}