Author: vgritsenko Date: Thu Apr 21 05:35:57 2005 New Revision: 164048 URL: http://svn.apache.org/viewcvs?rev=164048&view=rev Log: DOMStreamer: add missing Recyclable. DOMBuilder: add constructor taking factory.
Modified: cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMBuilder.java cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMStreamer.java Modified: cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMBuilder.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMBuilder.java?rev=164048&r1=164047&r2=164048&view=diff ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMBuilder.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMBuilder.java Thu Apr 21 05:35:57 2005 @@ -1,12 +1,12 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. - * + * Copyright 1999-2005 The Apache Software Foundation. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,29 +15,33 @@ */ package org.apache.cocoon.xml.dom; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.sax.SAXTransformerFactory; -import javax.xml.transform.sax.TransformerHandler; - import org.apache.avalon.framework.CascadingRuntimeException; + import org.apache.cocoon.xml.AbstractXMLPipe; + import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; + /** * The <code>DOMBuilder</code> is a utility class that will generate a W3C * DOM Document from SAX events. * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: DOMBuilder.java,v 1.4 2004/05/26 01:55:30 joerg Exp $ + * @version $Id$ */ -public class DOMBuilder -extends AbstractXMLPipe { +public class DOMBuilder extends AbstractXMLPipe { + + /** The default transformer factory shared by all instances */ + protected static final SAXTransformerFactory FACTORY = (SAXTransformerFactory) TransformerFactory.newInstance(); - /** The transformer factory shared by all instances */ - protected static final SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance(); + /** The transformer factory */ + protected SAXTransformerFactory factory; /** The listener */ protected Listener listener; @@ -52,58 +56,60 @@ * Construct a new instance of this DOMBuilder. */ public DOMBuilder() { - this( (Listener)null, (Node)null ); + this((Listener) null, (Node) null); } /** * Construct a new instance of this DOMBuilder. */ - public DOMBuilder( Listener listener ) { - this(listener, null); + public DOMBuilder(SAXTransformerFactory factory) { + this(factory, null, null); } /** * Construct a new instance of this DOMBuilder. */ - public DOMBuilder( Listener listener, Node parentNode ) { - super(); - this.listener = listener; - try { - TransformerHandler handler = factory.newTransformerHandler(); - this.setContentHandler(handler); - this.setLexicalHandler(handler); - this.parentNode = parentNode; - if (parentNode != null) { - this.result = new DOMResult( parentNode ); - } else { - this.result = new DOMResult(); - } - handler.setResult(this.result); - } catch (javax.xml.transform.TransformerException local) { - throw new CascadingRuntimeException("Fatal-Error: Unable to get transformer handler", local); - } + public DOMBuilder(Listener listener) { + this(listener, null); } /** - * Constructs a new instance that appends nodes to the given parent node.<br/> - * Note : you cannot use a <code>Listener<code> when appending to a + * Constructs a new instance that appends nodes to the given parent node. + * <br/> + * <strong>Note:</strong> You cannot use a <code>Listener<code> when appending to a * <code>Node</code>, because the notification occurs at <code>endDocument()</code> * which does not happen here. */ - public DOMBuilder( Node parentNode ) { - this( null, parentNode); + public DOMBuilder(Node parentNode) { + this(null, parentNode); } /** - * Recycling + * Construct a new instance of this DOMBuilder. */ - public void recycle() { - super.recycle(); + public DOMBuilder(Listener listener, Node parentNode) { + this((SAXTransformerFactory) null, listener, parentNode); + } + + /** + * Construct a new instance of this DOMBuilder. + */ + public DOMBuilder(SAXTransformerFactory factory, Listener listener, Node parentNode) { + super(); + this.factory = factory == null? FACTORY: factory; + this.listener = listener; + this.parentNode = parentNode; + setup(); + } + /** + * Setup this instance transformer and result objects. + */ + private void setup() { try { - TransformerHandler handler = factory.newTransformerHandler(); - this.setContentHandler(handler); - this.setLexicalHandler(handler); + TransformerHandler handler = this.factory.newTransformerHandler(); + setContentHandler(handler); + setLexicalHandler(handler); if (this.parentNode != null) { this.result = new DOMResult(this.parentNode); } else { @@ -116,37 +122,44 @@ } /** + * Recycle this builder, prepare for re-use. + */ + public void recycle() { + super.recycle(); + setup(); + } + + /** * Return the newly built Document. */ public Document getDocument() { - if ((this.result == null) || (this.result.getNode()==null)) { + if (this.result == null || this.result.getNode() == null) { return null; } else if (this.result.getNode().getNodeType() == Node.DOCUMENT_NODE) { - return ( (Document)this.result.getNode() ); + return (Document) this.result.getNode(); } else { - return ( this.result.getNode().getOwnerDocument() ); + return this.result.getNode().getOwnerDocument(); } } /** - * Receive notification of the beginning of a document. + * Receive notification of the end of a document. * * @exception SAXException If this method was not called appropriately. */ - public void endDocument() - throws SAXException { + public void endDocument() throws SAXException { super.endDocument(); - // Notify the listener - this.notifyListener(); + notifyListener(); } /** * Receive notification of a successfully completed DOM tree generation. */ - protected void notifyListener() - throws SAXException { - if ( this.listener != null ) this.listener.notify( this.getDocument() ); + protected void notifyListener() throws SAXException { + if (this.listener != null) { + this.listener.notify(getDocument()); + } } /** @@ -158,7 +171,6 @@ /** * Receive notification of a successfully completed DOM tree generation. */ - void notify(Document doc) - throws SAXException; + void notify(Document doc) throws SAXException; } } Modified: cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMStreamer.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMStreamer.java?rev=164048&r1=164047&r2=164048&view=diff ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMStreamer.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/xml/dom/DOMStreamer.java Thu Apr 21 05:35:57 2005 @@ -1,12 +1,12 @@ /* * Copyright 1999-2005 The Apache Software Foundation. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,23 +15,14 @@ */ package org.apache.cocoon.xml.dom; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.sax.SAXResult; +import org.apache.avalon.excalibur.pool.Recyclable; import org.apache.cocoon.xml.AbstractXMLProducer; import org.apache.cocoon.xml.EmbeddedXMLPipe; import org.apache.cocoon.xml.XMLConsumer; import org.apache.cocoon.xml.XMLProducer; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.StringUtils; import org.w3c.dom.Attr; import org.w3c.dom.Comment; import org.w3c.dom.Element; @@ -45,6 +36,16 @@ import org.xml.sax.ext.LexicalHandler; import org.xml.sax.helpers.AttributesImpl; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + /** * The <code>DOMStreamer</code> is a utility class that will generate SAX * events from a W3C DOM Document. @@ -61,12 +62,15 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @author <a href="mailto:[EMAIL PROTECTED]">Pierpaolo Fumagalli</a> * (Apache Software Foundation) - * @version CVS $Id$ + * @version $Id$ */ -public class DOMStreamer implements XMLProducer { +public class DOMStreamer implements XMLProducer, Recyclable { + + /** The transformer factory shared by all instances (only used by DefaultDOMStreamer) */ + private static final TransformerFactory FACTORY = TransformerFactory.newInstance(); /** Default value for normalizeNamespaces. */ - private final static boolean DEFAULT_NORMALIZE_NAMESPACES = true; + private static final boolean DEFAULT_NORMALIZE_NAMESPACES = true; /** Indicates whether namespace normalization should happen. */ protected boolean normalizeNamespaces = DEFAULT_NORMALIZE_NAMESPACES; @@ -77,9 +81,6 @@ /** DOMStreamer used when namespace normalization should not explicitely happen. */ protected DefaultDOMStreamer defaultDOMStreamer = new DefaultDOMStreamer(); - /** The transformer factory shared by all instances (only used by DefaultDOMStreamer) */ - protected final static TransformerFactory factory = TransformerFactory.newInstance(); - /** * Create a new <code>DOMStreamer</code> instance. */ @@ -90,40 +91,32 @@ /** * Create a new <code>DOMStreamer</code> instance. */ - public DOMStreamer(XMLConsumer consumer) { - this(consumer, consumer); + public DOMStreamer(ContentHandler content, LexicalHandler lexical) { + this(); + setContentHandler(content); + setLexicalHandler(lexical); } /** * Create a new <code>DOMStreamer</code> instance. */ - public DOMStreamer(ContentHandler content) { - this(content, null); - if (content instanceof LexicalHandler) { - defaultDOMStreamer.setLexicalHandler((LexicalHandler) content); - namespaceNormalizingDOMStreamer.setLexicalHandler((LexicalHandler) content); - } + public DOMStreamer(XMLConsumer consumer) { + this(consumer, consumer); } /** * Create a new <code>DOMStreamer</code> instance. */ - public DOMStreamer(ContentHandler content, LexicalHandler lexical) { - this(); - defaultDOMStreamer.setContentHandler(content); - defaultDOMStreamer.setLexicalHandler(lexical); - namespaceNormalizingDOMStreamer.setContentHandler(content); - namespaceNormalizingDOMStreamer.setLexicalHandler(lexical); + public DOMStreamer(ContentHandler content) { + this(content, content instanceof LexicalHandler ? (LexicalHandler) content : null); } /** * Set the <code>XMLConsumer</code> that will receive XML data. */ public void setConsumer(XMLConsumer consumer) { - defaultDOMStreamer.setContentHandler(consumer); - defaultDOMStreamer.setLexicalHandler(consumer); - namespaceNormalizingDOMStreamer.setContentHandler(consumer); - namespaceNormalizingDOMStreamer.setLexicalHandler(consumer); + setContentHandler(consumer); + setLexicalHandler(consumer); } /** @@ -192,10 +185,10 @@ * modify the DOM-tree itself. The currentElementInfo has a pointer to its parent * elementInfo. */ - protected NamespaceNormalizingDOMStreamer.ElementInfo currentElementInfo = null; + protected NamespaceNormalizingDOMStreamer.ElementInfo currentElementInfo; /** Counter used when generating new namespace prefixes. */ - protected int newPrefixCounter = 0; + protected int newPrefixCounter; public void recycle() { super.recycle(); @@ -214,7 +207,6 @@ * SAX listener. * * @param pos Node in the tree where to start traversal - * */ protected void stream(Node pos) throws SAXException { @@ -704,7 +696,7 @@ throws SAXException { if (this.transformer == null) { try { - this.transformer = factory.newTransformer(); + this.transformer = FACTORY.newTransformer(); } catch (TransformerConfigurationException e) { throw new SAXException(e); }