vgritsenko 2002/10/22 21:17:56 Modified: src/java/org/apache/cocoon/transformation ReadDOMSessionTransformer.java Log: Rework transformer to use xsp:expr. So now it's not about only DOM anymore... Revision Changes Path 1.9 +77 -79 xml-cocoon2/src/java/org/apache/cocoon/transformation/ReadDOMSessionTransformer.java Index: ReadDOMSessionTransformer.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/ReadDOMSessionTransformer.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ReadDOMSessionTransformer.java 10 Sep 2002 12:15:49 -0000 1.8 +++ ReadDOMSessionTransformer.java 23 Oct 2002 04:17:56 -0000 1.9 @@ -51,15 +51,12 @@ package org.apache.cocoon.transformation; import org.apache.avalon.framework.parameters.Parameters; -import org.apache.cocoon.Constants; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Session; import org.apache.cocoon.environment.SourceResolver; -import org.apache.cocoon.xml.EmbeddedXMLPipe; -import org.apache.cocoon.xml.dom.DOMStreamer; -import org.w3c.dom.Node; +import org.apache.cocoon.xml.XMLUtils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -68,120 +65,121 @@ /** - * With this transformer, a DOM-object that is stored in the session, can be inserted - * in the SAX stream at a given position. + * With this transformer, an object that is stored in the session, can be inserted + * in the SAX stream at a given position, using usual <xsp:expr> rules. + * Object can be DOM Node, XMLizable, or any other object supported by <xsp:expr>. * * Usage in sitemap: - * <map:transform type="readDOMsession"> - * <map:parameter name="dom-name" value="companyInfo"/> + * <pre> + * <map:transform type="read-session"> + * <map:parameter name="attribute-name" value="companyInfo"/> * <map:parameter name="trigger-element" value="company"/> * <map:parameter name="position" value="after"/> * </map:transform> + * </pre> * - * where: - * dom-name is the name of the DOM object in the session - * trigger-element is the element that we need to insert the SAX events - * postion is the actual place where the stream will be inserted, ie before, after or in + * Where: + * <ul> + * <li><b>attribute-name</b> is the name of the object in the session + * <li><b>trigger-element</b> is the element that we need to insert the SAX events + * <li><b>postion</b> is the actual place where the stream will be inserted, ie before, after or in * the trigger-element + * </ul> * * @author <a href="mailto:sven.beauprez@;the-ecorp.com">Sven Beauprez</a> + * @author <a href="mailto:vgritsenko@;apache.org">Vadim Gritsenko</a> * @version CVS $Id$ */ - public class ReadDOMSessionTransformer extends AbstractTransformer { - public static final String DOM_NAME = "dom-name"; + public static final String ATTRIBUTE_NAME = "attribute-name"; public static final String TRIGGER_ELEMENT = "trigger-element"; + /* position where the sax events from the dom should be insterted this can be: 'before', 'after' or 'in' */ public static final String POSITION = "position"; - Node node; - DOMStreamer streamer; Session session; - - String DOMName; + String attributeName; String trigger; String position; /** BEGIN SitemapComponent methods **/ - public void setup(SourceResolver resolver, Map objectModel, - String source, Parameters parameters) - throws ProcessingException, SAXException, IOException { - Request request = ObjectModelHelper.getRequest(objectModel); - session = request.getSession(false); - if (session != null) { - DOMName = parameters.getParameter(ReadDOMSessionTransformer.DOM_NAME,null); - trigger = parameters.getParameter(ReadDOMSessionTransformer.TRIGGER_ELEMENT,null); - position = parameters.getParameter(ReadDOMSessionTransformer.POSITION,"in"); - if (this.getLogger().isDebugEnabled()) { - getLogger().debug("ReadSessionTransformer: SessioID="+session.getId()); - getLogger().debug("ReadSessionTransformer: Session available, try to read from it"); - getLogger().debug("ReadSessionTransformer: " + ReadDOMSessionTransformer.DOM_NAME + "="+ - DOMName + " " + ReadDOMSessionTransformer.TRIGGER_ELEMENT + "=" + - trigger + " " + ReadDOMSessionTransformer.POSITION + "=" + - position); + public void setup(SourceResolver resolver, + Map objectModel, + String source, + Parameters parameters) + throws ProcessingException, SAXException, IOException { + Request request = ObjectModelHelper.getRequest(objectModel); + session = request.getSession(false); + if (session != null) { + if (getLogger().isDebugEnabled()) { + getLogger().debug("Session is available. ID=" + session.getId()); + } + this.attributeName = parameters.getParameter(ATTRIBUTE_NAME, null); + if (this.attributeName == null) { + // Try old syntax + this.attributeName = parameters.getParameter("dom-name", null); + } + + this.trigger = parameters.getParameter(TRIGGER_ELEMENT, null); + this.position = parameters.getParameter(POSITION, "in"); + if (getLogger().isDebugEnabled()) { + getLogger().debug(ATTRIBUTE_NAME + "=" + attributeName + ", " + + TRIGGER_ELEMENT + "=" + trigger + ", " + + POSITION + "=" + position); + } + } else { + getLogger().warn("No session object: Nothing to do."); } - } else { - getLogger().error("ReadSessionTransformer: no session object"); - } } /** END SitemapComponent methods **/ /** BEGIN SAX ContentHandler handlers **/ public void startElement(String uri, String name, String raw, Attributes attributes) - throws SAXException { - //start streaming after certain startelement is encountered - if (name.equalsIgnoreCase(trigger)) { - if (this.getLogger().isDebugEnabled()) { - getLogger().debug("ReadSessionTransformer: trigger encountered"); + throws SAXException { + // Start streaming after certain startelement is encountered + if (name.equalsIgnoreCase(trigger)) { + getLogger().debug("Trigger encountered"); + if ("before".equalsIgnoreCase(position)) { + stream(); + super.contentHandler.startElement(uri,name,raw,attributes); + } else if ("in".equalsIgnoreCase(position)) { + super.contentHandler.startElement(uri,name,raw,attributes); + stream(); + } else if ("after".equalsIgnoreCase(position)) { + super.contentHandler.startElement(uri,name,raw,attributes); + } + } else { + super.contentHandler.startElement(uri,name,raw,attributes); } - if (position.equalsIgnoreCase("before")) { - streamDOM(); - super.contentHandler.startElement(uri,name,raw,attributes); - } else if (position.equalsIgnoreCase("in")) { - super.contentHandler.startElement(uri,name,raw,attributes); - streamDOM(); - } else if (position.equalsIgnoreCase("after")) { - super.contentHandler.startElement(uri,name,raw,attributes); - } - } else { - super.contentHandler.startElement(uri,name,raw,attributes); - } } public void endElement(String uri,String name,String raw) - throws SAXException { - super.contentHandler.endElement(uri,name,raw); - if (name.equalsIgnoreCase(trigger)) { - if (position.equalsIgnoreCase("after")) { - streamDOM(); + throws SAXException { + super.contentHandler.endElement(uri,name,raw); + if (name.equalsIgnoreCase(trigger)) { + if ("after".equalsIgnoreCase(position)) { + stream(); + } } - } } /** END SAX ContentHandler handlers **/ /** own methods **/ - private void streamDOM() - throws SAXException { - if (DOMName!=null) { - node = (Node)session.getAttribute(DOMName); - } else { - getLogger().error("ReadSessionTransformer: no "+ ReadDOMSessionTransformer.DOM_NAME - +" parameter specified"); - } - if (node!=null) { - if (this.getLogger().isDebugEnabled()) { - getLogger().debug("ReadSessionTransformer: start streaming"); + private void stream() throws SAXException { + if (attributeName != null) { + Object node = session.getAttribute(attributeName); + if (node != null) { + getLogger().debug("Start streaming"); + XMLUtils.valueOf(super.xmlConsumer, node); + } else { + getLogger().error("No attribute " + attributeName + " in session"); + } + } else { + getLogger().error("No "+ ATTRIBUTE_NAME + " parameter specified"); } - EmbeddedXMLPipe pipe = new EmbeddedXMLPipe(super.contentHandler); - streamer = new DOMStreamer(pipe,super.lexicalHandler); - streamer.stream(node); - }else { - getLogger().error("ReadSessionTransformer: no Document in session"); - } } - }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]