/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.cocoon.transformation;
import org.apache.avalon.excalibur.pool.Recyclable;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.parser.Parser;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.dom.DOMBuilder;
import org.apache.cocoon.xml.dom.DOMStreamer;
import org.w3c.dom.Document;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;
import java.io.IOException;
import java.util.Map;
/**
* An Abstract DOM Transformer, for use when a transformer needs a DOM-based
* view of the document.
* Subclass this interface and implement <code>transform(Document doc)</code>.
* If you need a ComponentManager there is an instance variable
* <code>manager</code> for use.
*
* @author <a href="mailto:rossb@apache.org">Ross Burton</a>
* @author <a href="mailto:brobertson@mta.ca">Bruce G. Robertson</a>
* @version CVS $Revision $Date
*/
public abstract class AbstractDOMTransformer extends DOMBuilder
implements Transformer, DOMBuilder.Listener, Composable, Disposable,Recyclable {
/** The SAX entity resolver */
protected SourceResolver resolver;
/** The request object model */
protected Map objectModel;
/** The URI requested */
protected String source;
/** Parameters in the sitemap */
protected Parameters parameters;
/**
* A <code>ComponentManager</code> which is available for use.
*/
protected ComponentManager manager;
public AbstractDOMTransformer() {
super();
super.listener = this;
}
/**
* Set the component manager.
*/
public void compose(ComponentManager manager) {
this.manager = manager;
}
/**
* Recycle the component.
*/
public void recycle() {
this.resolver = null;
this.source = null;
this.objectModel = null;
this.parameters = null;
}
/**
* Set the <code>SourceResolver</code>, objectModel <code>Map</code>,
* the source and sitemap <code>Parameters</code> used to process the request.
*
* If you wish to process the parameters, override this method, call
* <code>super()</code> and then add your code.
*/
public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
throws ProcessingException, SAXException, IOException {
this.resolver = resolver;
this.objectModel = objectModel;
this.source = src;
this.parameters = par;
}
/**
* This method is called when the Document is finished.
* @param doc The DOM Document object representing this SAX stream
* @see org.apache.cocoon.xml.dom.DOMBuilder.Listener
*/
public void notify(Document doc) throws SAXException {
// Call the user's transform method
Document newdoc = transform(doc);
// Now we stream the DOM tree out
DOMStreamer s = new DOMStreamer(contentHandler, lexicalHandler);
s.stream(newdoc);
}
/**
* Transform the specified DOM, returning a new DOM to stream down the pipeline.
* @param doc The DOM Document representing the SAX stream
* @returns A DOM Document to stream down the pipeline
*/
protected abstract Document transform(Document doc) ;
/** The <code>ContentHandler</code> receiving SAX events. */
protected ContentHandler contentHandler;
/** The <code>LexicalHandler</code> receiving SAX events. */
protected LexicalHandler lexicalHandler;
/**
* Set the <code>XMLConsumer</code> that will receive XML data.
* <br>
* This method will simply call <code>setContentHandler(consumer)</code>
* and <code>setLexicalHandler(consumer)</code>.
*/
public void setConsumer(XMLConsumer consumer) {
this.contentHandler = consumer;
this.lexicalHandler = consumer;
}
/**
* Set the <code>ContentHandler</code> that will receive XML data.
* <br>
* Subclasses may retrieve this <code>ContentHandler</code> instance
* accessing the protected <code>super.contentHandler</code> field.
*/
public void setContentHandler(ContentHandler handler) {
this.contentHandler = handler;
}
/**
* Set the <code>LexicalHandler</code> that will receive XML data.
* <br>
* Subclasses may retrieve this <code>LexicalHandler</code> instance
* accessing the protected <code>super.lexicalHandler</code> field.
*
* @exception IllegalStateException If the <code>LexicalHandler</code> or
* the <code>XMLConsumer</code> were
* already set.
*/
public void setLexicalHandler(LexicalHandler handler) {
this.lexicalHandler = handler;
}
/**
* dispose
*/
public void dispose() {
}
}