Hi, I had some problems using a custom DocumentFactory (extending the DOMDocumentFactory) and DOM4J. The problem was that DOM4J wasn't realy using my DocumentFactory, but the default factory (in this case the DOMDocumentFactory) or didn't use a factory at all! I have fixed this with the 2 following patches (one for DOMElement and one for DOMDocument, both in the org.dom4j.dom package). I have also included these patches as attachment.
Index: DOMElement.java =================================================================== RCS file: /cvsroot/dom4j/dom4j/src/java/org/dom4j/dom/DOMElement.java,v retrieving revision 1.13 diff -u -w -r1.13 DOMElement.java --- DOMElement.java 2001/08/14 13:21:10 1.13 +++ DOMElement.java 2001/12/20 23:06:36 @@ -299,7 +299,9 @@ // Implementation methods //------------------------------------------------------------------------- protected DocumentFactory getDocumentFactory() { - return DOCUMENT_FACTORY; + DocumentFactory factory = getQName().getDocumentFactory(); + return ( factory != null ) ? factory : DOCUMENT_FACTORY; + } protected Attribute attribute(org.w3c.dom.Attr attr) { Index: DOMDocument.java =================================================================== RCS file: /cvsroot/dom4j/dom4j/src/java/org/dom4j/dom/DOMDocument.java,v retrieving revision 1.6 diff -u -w -r1.6 DOMDocument.java --- DOMDocument.java 2001/06/20 18:59:23 1.6 +++ DOMDocument.java 2001/12/20 23:13:08 @@ -35,7 +36,7 @@ public class DOMDocument extends DefaultDocument implements org.w3c.dom.Document { /** The <code>DocumentFactory</code> instance used by default */ - private static final DocumentFactory DOCUMENT_FACTORY = DOMDocumentFactory.getInstance(); + private static final DOMDocumentFactory DOCUMENT_FACTORY = (DOMDocumentFactory) DOMDocumentFactory.getInstance(); public DOMDocument() { @@ -192,7 +193,12 @@ } public org.w3c.dom.DOMImplementation getImplementation() { - return DOMDocumentFactory.singleton; + if (getDocumentFactory() instanceof org.w3c.dom.DOMImplementation) { + return (org.w3c.dom.DOMImplementation) getDocumentFactory(); + } else { + return DOCUMENT_FACTORY; + } + } public org.w3c.dom.Element getDocumentElement() { @@ -200,7 +206,7 @@ } public org.w3c.dom.Element createElement(String tagName) throws DOMException { - return new DOMElement(tagName); + return (org.w3c.dom.Element) getDocumentFactory().createElement(tagName); } public org.w3c.dom.DocumentFragment createDocumentFragment() { @@ -209,29 +215,30 @@ } public org.w3c.dom.Text createTextNode(String data) { - return new DOMText(data); + return (org.w3c.dom.Text) getDocumentFactory().createText(data); } public org.w3c.dom.Comment createComment(String data) { - return new DOMComment(data); + return (org.w3c.dom.Comment) getDocumentFactory().createComment(data); } public org.w3c.dom.CDATASection createCDATASection(String data) throws DOMException { - return new DOMCDATA(data); + return (org.w3c.dom.CDATASection) getDocumentFactory().createCDATA(data); } public org.w3c.dom.ProcessingInstruction createProcessingInstruction( String target, String data ) throws DOMException { - return new DOMProcessingInstruction(target, data); + return (org.w3c.dom.ProcessingInstruction) getDocumentFactory().createProcessingInstruction(target, data); } public org.w3c.dom.Attr createAttribute(String name) throws DOMException { - return new DOMAttribute( DOCUMENT_FACTORY.createQName(name) ); + QName qname = getDocumentFactory().createQName(name); + return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null, qname, null); } public org.w3c.dom.EntityReference createEntityReference(String name) throws DOMException { - return new DOMEntityReference(name); + return (org.w3c.dom.EntityReference) ((DOMDocumentFactory) getDocumentFactory()).createEntity(name); } public org.w3c.dom.Node importNode( @@ -244,15 +251,15 @@ public org.w3c.dom.Element createElementNS( String namespaceURI, String qualifiedName ) throws DOMException { - QName qname = DOCUMENT_FACTORY.createQName( qualifiedName, namespaceURI ); - return new DOMElement( qname ); + QName qname = getDocumentFactory().createQName( qualifiedName, namespaceURI ); + return (org.w3c.dom.Element) getDocumentFactory().createElement(qname); } public org.w3c.dom.Attr createAttributeNS( String namespaceURI, String qualifiedName ) throws DOMException { - QName qname = DOCUMENT_FACTORY.createQName( qualifiedName, namespaceURI ); - return new DOMAttribute( qname ); + QName qname = getDocumentFactory().createQName( qualifiedName, namespaceURI ); + return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null, qname, null); } @@ -261,13 +268,15 @@ } - // Implementation methods //------------------------------------------------------------------------- protected DocumentFactory getDocumentFactory() { + if (super.getDocumentFactory() == null) { return DOCUMENT_FACTORY; + } else { + return super.getDocumentFactory(); } - + } } Regards, Maarten
Index: DOMElement.java =================================================================== RCS file: /cvsroot/dom4j/dom4j/src/java/org/dom4j/dom/DOMElement.java,v retrieving revision 1.13 diff -u -w -r1.13 DOMElement.java --- DOMElement.java 2001/08/14 13:21:10 1.13 +++ DOMElement.java 2001/12/20 23:06:36 @@ -299,7 +299,9 @@ // Implementation methods //------------------------------------------------------------------------- protected DocumentFactory getDocumentFactory() { - return DOCUMENT_FACTORY; + DocumentFactory factory = getQName().getDocumentFactory(); + return ( factory != null ) ? factory : DOCUMENT_FACTORY; + } protected Attribute attribute(org.w3c.dom.Attr attr) { Index: DOMDocument.java =================================================================== RCS file: /cvsroot/dom4j/dom4j/src/java/org/dom4j/dom/DOMDocument.java,v retrieving revision 1.6 diff -u -w -r1.6 DOMDocument.java --- DOMDocument.java 2001/06/20 18:59:23 1.6 +++ DOMDocument.java 2001/12/20 23:13:08 @@ -35,7 +36,7 @@ public class DOMDocument extends DefaultDocument implements org.w3c.dom.Document { /** The <code>DocumentFactory</code> instance used by default */ - private static final DocumentFactory DOCUMENT_FACTORY = DOMDocumentFactory.getInstance(); + private static final DOMDocumentFactory DOCUMENT_FACTORY = (DOMDocumentFactory) +DOMDocumentFactory.getInstance(); public DOMDocument() { @@ -192,7 +193,12 @@ } public org.w3c.dom.DOMImplementation getImplementation() { - return DOMDocumentFactory.singleton; + if (getDocumentFactory() instanceof org.w3c.dom.DOMImplementation) { + return (org.w3c.dom.DOMImplementation) getDocumentFactory(); + } else { + return DOCUMENT_FACTORY; + } + } public org.w3c.dom.Element getDocumentElement() { @@ -200,7 +206,7 @@ } public org.w3c.dom.Element createElement(String tagName) throws DOMException { - return new DOMElement(tagName); + return (org.w3c.dom.Element) getDocumentFactory().createElement(tagName); } public org.w3c.dom.DocumentFragment createDocumentFragment() { @@ -209,29 +215,30 @@ } public org.w3c.dom.Text createTextNode(String data) { - return new DOMText(data); + return (org.w3c.dom.Text) getDocumentFactory().createText(data); } public org.w3c.dom.Comment createComment(String data) { - return new DOMComment(data); + return (org.w3c.dom.Comment) getDocumentFactory().createComment(data); } public org.w3c.dom.CDATASection createCDATASection(String data) throws DOMException { - return new DOMCDATA(data); + return (org.w3c.dom.CDATASection) getDocumentFactory().createCDATA(data); } public org.w3c.dom.ProcessingInstruction createProcessingInstruction( String target, String data ) throws DOMException { - return new DOMProcessingInstruction(target, data); + return (org.w3c.dom.ProcessingInstruction) +getDocumentFactory().createProcessingInstruction(target, data); } public org.w3c.dom.Attr createAttribute(String name) throws DOMException { - return new DOMAttribute( DOCUMENT_FACTORY.createQName(name) ); + QName qname = getDocumentFactory().createQName(name); + return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null, qname, +null); } public org.w3c.dom.EntityReference createEntityReference(String name) throws DOMException { - return new DOMEntityReference(name); + return (org.w3c.dom.EntityReference) ((DOMDocumentFactory) +getDocumentFactory()).createEntity(name); } public org.w3c.dom.Node importNode( @@ -244,15 +251,15 @@ public org.w3c.dom.Element createElementNS( String namespaceURI, String qualifiedName ) throws DOMException { - QName qname = DOCUMENT_FACTORY.createQName( qualifiedName, namespaceURI ); - return new DOMElement( qname ); + QName qname = getDocumentFactory().createQName( qualifiedName, namespaceURI ); + return (org.w3c.dom.Element) getDocumentFactory().createElement(qname); } public org.w3c.dom.Attr createAttributeNS( String namespaceURI, String qualifiedName ) throws DOMException { - QName qname = DOCUMENT_FACTORY.createQName( qualifiedName, namespaceURI ); - return new DOMAttribute( qname ); + QName qname = getDocumentFactory().createQName( qualifiedName, namespaceURI ); + return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null, qname, +null); } @@ -261,13 +268,15 @@ } - // Implementation methods //------------------------------------------------------------------------- protected DocumentFactory getDocumentFactory() { + if (super.getDocumentFactory() == null) { return DOCUMENT_FACTORY; + } else { + return super.getDocumentFactory(); } - + } }