cziegeler 2002/11/20 06:53:22 Modified: src/java/org/apache/cocoon/components Tag: cocoon_2_0_3_branch CocoonComponentManager.java src/java/org/apache/cocoon/components/source Tag: cocoon_2_0_3_branch SitemapSource.java lib Tag: cocoon_2_0_3_branch jars.xml Added: src/java/org/apache/cocoon/components Tag: cocoon_2_0_3_branch EnvironmentStack.java lib/core Tag: cocoon_2_0_3_branch commons-collections-2.1.jar Removed: lib/core Tag: cocoon_2_0_3_branch commons-collections-1.0.jar Log: Removing the intermediate buffering for the cocoon protocol Revision Changes Path No revision No revision 1.13.2.5 +24 -18 xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java Index: CocoonComponentManager.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java,v retrieving revision 1.13.2.4 retrieving revision 1.13.2.5 diff -u -r1.13.2.4 -r1.13.2.5 --- CocoonComponentManager.java 20 Nov 2002 11:21:49 -0000 1.13.2.4 +++ CocoonComponentManager.java 20 Nov 2002 14:53:21 -0000 1.13.2.5 @@ -56,7 +56,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Stack; import org.apache.avalon.excalibur.component.ExcaliburComponentManager; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; @@ -123,9 +122,9 @@ Map objectModel, Processor processor) { if (environmentStack.get() == null) { - environmentStack.set(new Stack()); + environmentStack.set(new EnvironmentStack()); } - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); stack.push(new Object[] {env, processor}); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); @@ -139,7 +138,7 @@ * This hook must be called by the sitemap each time a sitemap is left */ public static void leaveEnvironment() { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if (null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.pop(); EnvironmentDescription desc = (EnvironmentDescription)((Environment)objects[0]).getObjectModel().get(PROCESS_KEY); @@ -178,9 +177,9 @@ * Return the current environment (for the cocoon: protocol) */ public static Environment getCurrentEnvironment() { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if (null != stack && !stack.empty()) { - return (Environment) ((Object[])stack.peek())[0]; + return (Environment) ((Object[])stack.getCurrent())[0]; } return null; } @@ -189,23 +188,30 @@ * Return the current processor (for the cocoon: protocol) */ public static Processor getCurrentProcessor() { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if (null != stack && !stack.empty()) { - return (Processor) ((Object[])stack.peek())[1]; + return (Processor) ((Object[])stack.getCurrent())[1]; } return null; } /** + * Return the current environment stack (for the cocoon: protocol) + */ + public static EnvironmentStack getCurrentEnvironmentStack() { + return (EnvironmentStack)environmentStack.get(); + } + + /** * Return an instance of a component based on a Role. The Role is usually the Interface's * Fully Qualified Name(FQN)--unless there are multiple Components for the same Role. In that * case, the Role's FQN is appended with "Selector", and we return a ComponentSelector. */ public Component lookup( final String role ) throws ComponentException { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if ( null != stack && !stack.empty()) { - final Object[] objects = (Object[])stack.peek(); + final Object[] objects = (Object[])stack.getCurrent(); final Map objectModel = ((Environment)objects[0]).getObjectModel(); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); if ( null != desc ) { @@ -221,7 +227,7 @@ if (stack == null || stack.empty()) { throw new ComponentException("ComponentManager has no Environment Stack."); } - final Object[] objects = (Object[]) stack.peek(); + final Object[] objects = (Object[]) stack.getCurrent(); final Map objectModel = ((Environment)objects[0]).getObjectModel(); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); if ( null != desc ) { @@ -266,9 +272,9 @@ final Component component, final ComponentManager manager) throws ProcessingException { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if ( null != stack && !stack.empty()) { - final Object[] objects = (Object[])stack.firstElement(); + final Object[] objects = (Object[])stack.get(0); final Map objectModel = ((Environment)objects[0]).getObjectModel(); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); if ( null != desc ) { @@ -285,9 +291,9 @@ public static void addComponentForAutomaticRelease(final ComponentManager manager, final Component component) throws ProcessingException { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if ( null != stack && !stack.empty()) { - final Object[] objects = (Object[])stack.firstElement(); + final Object[] objects = (Object[])stack.get(0); final Map objectModel = ((Environment)objects[0]).getObjectModel(); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); if ( null != desc ) { @@ -303,9 +309,9 @@ */ public static void removeFromAutomaticRelease(final Component component) throws ProcessingException { - final Stack stack = (Stack)environmentStack.get(); + final EnvironmentStack stack = (EnvironmentStack)environmentStack.get(); if ( null != stack && !stack.empty()) { - final Object[] objects = (Object[])stack.firstElement(); + final Object[] objects = (Object[])stack.get(0); final Map objectModel = ((Environment)objects[0]).getObjectModel(); EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY); if ( null != desc ) { No revision No revision 1.1.2.1 +87 -0 xml-cocoon2/src/java/org/apache/cocoon/components/Attic/EnvironmentStack.java No revision No revision 1.1.2.1 +0 -0 xml-cocoon2/lib/core/commons-collections-2.1.jar <<Binary file>> No revision No revision 1.9.2.5 +166 -25 xml-cocoon2/src/java/org/apache/cocoon/components/source/SitemapSource.java Index: SitemapSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/SitemapSource.java,v retrieving revision 1.9.2.4 retrieving revision 1.9.2.5 diff -u -r1.9.2.4 -r1.9.2.5 --- SitemapSource.java 20 Nov 2002 11:21:49 -0000 1.9.2.4 +++ SitemapSource.java 20 Nov 2002 14:53:22 -0000 1.9.2.5 @@ -56,11 +56,10 @@ import org.apache.cocoon.Processor; import org.apache.cocoon.caching.PipelineCacheKey; import org.apache.cocoon.components.CocoonComponentManager; +import org.apache.cocoon.components.EnvironmentStack; import org.apache.cocoon.components.pipeline.CacheableEventPipeline; import org.apache.cocoon.components.pipeline.EventPipeline; import org.apache.cocoon.components.pipeline.StreamPipeline; -import org.apache.cocoon.components.sax.XMLDeserializer; -import org.apache.cocoon.components.sax.XMLSerializer; import org.apache.cocoon.environment.Environment; import org.apache.cocoon.environment.ModifiableSource; import org.apache.cocoon.environment.Source; @@ -71,8 +70,10 @@ import org.apache.cocoon.xml.XMLConsumer; import org.apache.cocoon.xml.XMLProducer; import org.apache.log.Logger; +import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; +import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.ext.LexicalHandler; @@ -357,38 +358,30 @@ throw this.exception; } try { - XMLConsumer consumer; - if (contentHandler instanceof XMLConsumer) { - consumer = (XMLConsumer)contentHandler; - } else if (contentHandler instanceof LexicalHandler) { - consumer = new ContentHandlerWrapper(contentHandler, (LexicalHandler)contentHandler); - } else { - consumer = new ContentHandlerWrapper(contentHandler); - } if (this.redirectSource != null) { - this.redirectSource.toSAX(consumer); + this.redirectSource.toSAX(contentHandler); } else { - // We have to buffer the result in order to get + XMLConsumer consumer; + if (contentHandler instanceof XMLConsumer) { + consumer = (XMLConsumer)contentHandler; + } else if (contentHandler instanceof LexicalHandler) { + consumer = new ContentHandlerWrapper(contentHandler, (LexicalHandler)contentHandler); + } else { + consumer = new ContentHandlerWrapper(contentHandler); + } + // We have to add an environment changer // clean environment stack handling. - XMLSerializer xmls = (XMLSerializer) this.manager.lookup(XMLSerializer.ROLE); - Object fragment; + EnvironmentStack envStack = CocoonComponentManager.getCurrentEnvironmentStack(); + int currentOffset = envStack.getOffset(); try { CocoonComponentManager.enterEnvironment(this.environment, this.environment.getObjectModel(), this.pipelineProcessor); - ((XMLProducer)eventPipeline).setConsumer(xmls); + ((XMLProducer)eventPipeline).setConsumer(new EnvironmentChanger(consumer, envStack)); eventPipeline.process(this.environment); - fragment = xmls.getSAXFragment(); } finally { - this.manager.release(xmls); CocoonComponentManager.leaveEnvironment(); - } - XMLDeserializer xmld = (XMLDeserializer) this.manager.lookup(XMLDeserializer.ROLE); - try { - xmld.setConsumer(consumer); - xmld.deserialize(fragment); - } finally { - this.manager.release(xmld); + envStack.resetOffset(currentOffset); } } } catch (ComponentException cme) { @@ -425,3 +418,151 @@ reset(); } } + + +/** + * This class is an {@link XMLConsumer} that changes the current environment. + * When a pipeline calls an internal pipeline, two environments are + * established: one for the calling pipeline and one for the internal pipeline. + * Now, if SAX events are send from the internal pipeline, they are + * received by some component of the calling pipeline, so inbetween we + * have to change the environment forth and back. + */ +final class EnvironmentChanger +implements XMLConsumer { + + final XMLConsumer consumer; + final EnvironmentStack stack; + + EnvironmentChanger(XMLConsumer consumer, EnvironmentStack es) { + this.consumer = consumer; + this.stack = es; + } + + public void setDocumentLocator(Locator locator) { + this.stack.incOffset(); + this.consumer.setDocumentLocator(locator); + this.stack.decOffset(); + } + + public void startDocument() + throws SAXException { + this.stack.incOffset(); + this.consumer.startDocument(); + this.stack.decOffset(); + } + + public void endDocument() + throws SAXException { + this.stack.incOffset(); + this.consumer.endDocument(); + this.stack.decOffset(); + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + this.stack.incOffset(); + this.consumer.startPrefixMapping(prefix, uri); + this.stack.decOffset(); + } + + public void endPrefixMapping(String prefix) + throws SAXException { + this.stack.incOffset(); + this.consumer.endPrefixMapping(prefix); + this.stack.decOffset(); + } + + public void startElement(String uri, String loc, String raw, Attributes a) + throws SAXException { + this.stack.incOffset(); + this.consumer.startElement(uri, loc, raw, a); + this.stack.decOffset(); + } + + + public void endElement(String uri, String loc, String raw) + throws SAXException { + this.stack.incOffset(); + this.consumer.endElement(uri, loc, raw); + this.stack.decOffset(); + } + + public void characters(char c[], int start, int len) + throws SAXException { + this.stack.incOffset(); + this.consumer.characters(c, start, len); + this.stack.decOffset(); + } + + public void ignorableWhitespace(char c[], int start, int len) + throws SAXException { + this.stack.incOffset(); + this.consumer.ignorableWhitespace(c, start, len); + this.stack.decOffset(); + } + + public void processingInstruction(String target, String data) + throws SAXException { + this.stack.incOffset(); + this.consumer.processingInstruction(target, data); + this.stack.decOffset(); + } + + public void skippedEntity(String name) + throws SAXException { + this.stack.incOffset(); + this.consumer.skippedEntity(name); + this.stack.decOffset(); + } + + public void startDTD(String name, String publicId, String systemId) + throws SAXException { + this.stack.incOffset(); + this.consumer.startDTD(name, publicId, systemId); + this.stack.decOffset(); + } + + public void endDTD() + throws SAXException { + this.stack.incOffset(); + this.consumer.endDTD(); + this.stack.decOffset(); + } + + public void startEntity(String name) + throws SAXException { + this.stack.incOffset(); + this.consumer.startEntity(name); + this.stack.decOffset(); + } + + public void endEntity(String name) + throws SAXException { + this.stack.incOffset(); + this.consumer.endEntity(name); + this.stack.decOffset(); + } + + public void startCDATA() + throws SAXException { + this.stack.incOffset(); + this.consumer.startCDATA(); + this.stack.decOffset(); + } + + public void endCDATA() + throws SAXException { + this.stack.incOffset(); + this.consumer.endCDATA(); + this.stack.decOffset(); + } + + public void comment(char ch[], int start, int len) + throws SAXException { + this.stack.incOffset(); + this.consumer.comment(ch, start, len); + this.stack.decOffset(); + } +} + No revision No revision 1.11.2.15 +1 -1 xml-cocoon2/lib/jars.xml Index: jars.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/lib/jars.xml,v retrieving revision 1.11.2.14 retrieving revision 1.11.2.15 diff -u -r1.11.2.14 -r1.11.2.15 --- jars.xml 20 Nov 2002 12:35:18 -0000 1.11.2.14 +++ jars.xml 20 Nov 2002 14:53:22 -0000 1.11.2.15 @@ -36,7 +36,7 @@ <title>Jakarta Commons Collections</title> <description>Common implementations of collection classes.</description> <used-by>Cocoon</used-by> - <lib>core/commons-collections-1.0.jar</lib> + <lib>core/commons-collections-2.1.jar</lib> <homepage>http://jakarta.apache.org/commons/collections.html</homepage> </file> <file>
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]