You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2002/08/04 06:11:53 UTC
cvs commit: xml-cocoon2/src/java/org/apache/cocoon/sitemap Handler.java
vgritsenko 2002/08/03 21:11:53
Modified: . Tag: cocoon_2_0_3_branch changes.xml
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 CocoonSourceFactory.java
SitemapSource.java
src/java/org/apache/cocoon/components/treeprocessor Tag:
cocoon_2_0_3_branch TreeProcessor.java
src/java/org/apache/cocoon/environment Tag:
cocoon_2_0_3_branch AbstractEnvironment.java
Environment.java
src/java/org/apache/cocoon/environment/wrapper Tag:
cocoon_2_0_3_branch EnvironmentWrapper.java
src/java/org/apache/cocoon/sitemap Tag: cocoon_2_0_3_branch
Handler.java
Log:
Fixed bug in cocoon pseudo protocol involving aggregation of aggregated
resources spanning several sitemaps.
Fix partially backported from 2.1
Revision Changes Path
No revision
No revision
1.138.2.43 +9 -4 xml-cocoon2/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/changes.xml,v
retrieving revision 1.138.2.42
retrieving revision 1.138.2.43
diff -u -r1.138.2.42 -r1.138.2.43
--- changes.xml 3 Aug 2002 16:44:13 -0000 1.138.2.42
+++ changes.xml 4 Aug 2002 04:11:51 -0000 1.138.2.43
@@ -39,6 +39,10 @@
</devs>
<release version="@version@" date="@date@">
+ <action dev="VG" type="fix" fixes-bug="9288">
+ Fixed bug in cocoon pseudo protocol involving aggregation of aggregated
+ resources spanning several sitemaps.
+ </action>
<action dev="VG" type="fix">
Conect to the XML:DB once, from the XMLDBSourceFactory.
</action>
@@ -91,7 +95,7 @@
When building Cocoon it is required to set the targetted JVM (either 1.3 (means 1.3 or lower) or 1.4.
</action>
<action dev="VG" type="fix" fixes-bug="10311" due-to="Joachim Piketz" due-to-email="pik@uniquare.com">
- Fix NullPointerException in Notifier.
+ Fixed NullPointerException in Notifier.
</action>
<action dev="CH" type="update">
Multiple results seem not to be supported by some DBMSs (i.e. Oracle and
@@ -109,10 +113,11 @@
returning an error.
</action>
<action dev="VG" type="fix" fixes-bug="8658" due-to="Michael Melhem" due-to-email="michaelm@fztig938.bank.dresdner.net">
- Fix sitemap compilation error when matchers are used within view or resource.
+ Fixed sitemap compilation error when matchers are used within view or
+ resource.
</action>
<action dev="VG" type="fix" fixes-bug="8509" due-to="Michael Melhem" due-to-email="michaelm@fztig938.bank.dresdner.net">
- Fix sitemap compilation error when actions are used within view.
+ Fixed sitemap compilation error when actions are used within view.
</action>
<action dev="VG" type="fix" fixes-bug="3782">
TraxTransformer and XSLTProcessor components now correctly handle
No revision
No revision
1.13.2.3 +31 -7 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.2
retrieving revision 1.13.2.3
diff -u -r1.13.2.2 -r1.13.2.3
--- CocoonComponentManager.java 7 Jun 2002 10:22:42 -0000 1.13.2.2
+++ CocoonComponentManager.java 4 Aug 2002 04:11:52 -0000 1.13.2.3
@@ -61,6 +61,7 @@
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Recomposable;
import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.Processor;
import org.apache.cocoon.environment.Environment;
import java.net.MalformedURLException;
@@ -110,19 +111,21 @@
/**
* This hook must be called by the sitemap each time a sitemap is entered
*/
- public static void enterEnvironment(Environment env, Map objectModel) {
+ public static void enterEnvironment(Environment env,
+ Map objectModel,
+ Processor processor) {
if (environmentStack.get() == null) {
environmentStack.set(new Stack());
}
final Stack stack = (Stack)environmentStack.get();
- if ( !stack.empty() ) {
+ if (!stack.empty() ) {
final Object[] objects = (Object[])stack.peek();
if ( objects[1] == objectModel ) {
- stack.push(new Object[] {env, objectModel, objects[2], TWO});
+ stack.push(new Object[] {env, objectModel, objects[2], TWO, processor});
return;
}
}
- stack.push(new Object[] {env, objectModel, new HashMap(5), ONE});
+ stack.push(new Object[] {env, objectModel, new HashMap(5), ONE, processor});
}
/**
@@ -130,7 +133,7 @@
*/
public static void leaveEnvironment() {
final Stack stack = (Stack)environmentStack.get();
- if ( null != stack && !stack.empty()) {
+ if (null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.pop();
if (objects[3] == ONE) {
final Map components = (Map)objects[2];
@@ -145,6 +148,28 @@
}
/**
+ * Return the current environment object (for the cocoon: protocol)
+ */
+ public static Environment getCurrentEnvironment() {
+ final Stack stack = (Stack)environmentStack.get();
+ if (null != stack && !stack.empty()) {
+ return (Environment) ((Object[])stack.peek())[0];
+ }
+ return null;
+ }
+
+ /**
+ * Return the current processor object (for the cocoon: protocol)
+ */
+ public static Processor getCurrentProcessor() {
+ final Stack stack = (Stack)environmentStack.get();
+ if (null != stack && !stack.empty()) {
+ return (Processor) ((Object[])stack.peek())[4];
+ }
+ return null;
+ }
+
+ /**
* 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.
@@ -209,5 +234,4 @@
protected void releaseRLComponent( final Component component ) {
super.release( component );
}
-
}
No revision
No revision
1.4.2.1 +3 -10 xml-cocoon2/src/java/org/apache/cocoon/components/source/CocoonSourceFactory.java
Index: CocoonSourceFactory.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/CocoonSourceFactory.java,v
retrieving revision 1.4
retrieving revision 1.4.2.1
diff -u -r1.4 -r1.4.2.1
--- CocoonSourceFactory.java 22 Feb 2002 07:00:13 -0000 1.4
+++ CocoonSourceFactory.java 4 Aug 2002 04:11:52 -0000 1.4.2.1
@@ -56,6 +56,7 @@
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.Source;
import org.apache.cocoon.Processor;
+import org.apache.cocoon.components.CocoonComponentManager;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -74,15 +75,11 @@
extends AbstractLoggable
implements SourceFactory {
- /** The processor */
- private Processor processor;
-
/** The component manager */
private ComponentManager manager;
public CocoonSourceFactory(Processor processor,
ComponentManager manager) {
- this.processor = processor;
this.manager = manager;
}
@@ -91,11 +88,7 @@
*/
public Source getSource(Environment environment, String location)
throws ProcessingException, IOException, MalformedURLException {
- if (environment == null)
- throw new ProcessingException("CocoonSourceFactory: environment is required.");
- return new SitemapSource(environment,
- this.manager,
- this.processor,
+ return new SitemapSource(this.manager,
location,
this.getLogger());
}
1.9.2.3 +31 -19 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.2
retrieving revision 1.9.2.3
diff -u -r1.9.2.2 -r1.9.2.3
--- SitemapSource.java 19 Apr 2002 23:48:41 -0000 1.9.2.2
+++ SitemapSource.java 4 Aug 2002 04:11:52 -0000 1.9.2.3
@@ -52,8 +52,6 @@
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.ComponentSelector;
-import org.apache.cocoon.Constants;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Processor;
import org.apache.cocoon.caching.PipelineCacheKey;
@@ -63,10 +61,8 @@
import org.apache.cocoon.components.pipeline.StreamPipeline;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ModifiableSource;
-import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.Source;
import org.apache.cocoon.environment.wrapper.EnvironmentWrapper;
-import org.apache.cocoon.serialization.Serializer;
import org.apache.cocoon.util.HashUtil;
import org.apache.cocoon.xml.AbstractXMLConsumer;
import org.apache.cocoon.xml.ContentHandlerWrapper;
@@ -82,8 +78,8 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.util.Map;
+import java.net.MalformedURLException;
/**
* Description of a source which is defined by a pipeline.
@@ -111,6 +107,8 @@
/** The processor */
private Processor processor;
+ private Processor pipelineProcessor;
+
/** The environment */
private EnvironmentWrapper environment;
@@ -135,13 +133,16 @@
/**
* Construct a new object
*/
- public SitemapSource(Environment env,
- ComponentManager manager,
- Processor sitemap,
+ public SitemapSource(ComponentManager manager,
String uri,
Logger logger)
throws IOException, ProcessingException {
+ Environment env = CocoonComponentManager.getCurrentEnvironment();
+ if (env == null) {
+ throw new MalformedURLException("The cocoon protocol can not be used outside an environment.");
+ }
+
this.manager = manager;
this.setLogger(logger);
boolean rawMode = false;
@@ -159,18 +160,18 @@
// does the uri point to this sitemap or to the root sitemap?
if (uri.startsWith("//", position)) {
position += 2;
- Processor processor = null;
try {
- processor = (Processor)this.manager.lookup(Processor.ROLE);
+ this.processor = (Processor)this.manager.lookup(Processor.ROLE);
} catch (ComponentException e) {
throw new ProcessingException("Cannot get Processor instance", e);
}
this.prefix = ""; // start at the root
- this.processor = processor;
} else if (uri.startsWith("/", position)) {
position ++;
this.prefix = null;
- this.processor = sitemap;
+ // BUG#9288: Get proper processor, passed either by processor
+ // or other cocoon source
+ this.processor = CocoonComponentManager.getCurrentProcessor();
} else {
throw new ProcessingException("Malformed cocoon URI.");
}
@@ -240,7 +241,6 @@
this.environment.setOutputStream(os);
this.pipeline.process(this.environment);
return new ByteArrayInputStream(os.toByteArray());
-
} catch (ProcessingException e) {
throw e;
} catch (Exception e) {
@@ -276,11 +276,19 @@
this.environment.setURI(this.prefix, this.uri);
this.processor.process(this.environment, pipeline, eventPipeline);
- this.environment.changeToLastContext();
- String redirectURL = this.environment.getRedirectURL();
+ // BUG#9288: Get processor which was used to build this pipeline
+ this.pipelineProcessor = this.environment.changeToLastContext();
+ String redirectURL = this.environment.getRedirectURL();
+ try {
+ // BUG#9288: Set proper processor before setting up the pipeline
+ // (will be needed if pipeline has CocoonSource, see <init>)
+ CocoonComponentManager.enterEnvironment(this.environment,
+ this.environment.getObjectModel(),
+ this.pipelineProcessor);
if (redirectURL == null) {
if (this.eventPipeline.getGenerator() != null &&
- this.eventPipeline instanceof CacheableEventPipeline) {
+ this.eventPipeline instanceof CacheableEventPipeline)
+ {
CacheableEventPipeline cep = (CacheableEventPipeline)this.eventPipeline;
PipelineCacheKey pck = cep.generateKey(this.environment);
Map validity = null;
@@ -294,13 +302,16 @@
}
}
}
- } else {
+ } else {
if (redirectURL.indexOf(":") == -1) {
redirectURL = "cocoon:/" + redirectURL;
}
this.redirectSource = this.environment.resolve(redirectURL);
this.lastModificationDate = this.redirectSource.getLastModified();
}
+ } finally {
+ CocoonComponentManager.leaveEnvironment();
+ }
} catch (ProcessingException e) {
reset();
this.exception = e;
@@ -348,7 +359,8 @@
} else {
try {
CocoonComponentManager.enterEnvironment(this.environment,
- this.environment.getObjectModel());
+ this.environment.getObjectModel(),
+ this.pipelineProcessor);
((XMLProducer)eventPipeline).setConsumer(consumer);
eventPipeline.process(this.environment);
} finally {
No revision
No revision
1.4.2.3 +9 -5 xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
Index: TreeProcessor.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java,v
retrieving revision 1.4.2.2
retrieving revision 1.4.2.3
diff -u -r1.4.2.2 -r1.4.2.3
--- TreeProcessor.java 9 Jun 2002 00:23:26 -0000 1.4.2.2
+++ TreeProcessor.java 4 Aug 2002 04:11:52 -0000 1.4.2.3
@@ -299,11 +299,13 @@
public boolean process(Environment environment, StreamPipeline pipeline, EventPipeline eventPipeline)
throws Exception {
InvokeContext context = new InvokeContext(pipeline, eventPipeline);
-
context.setLogger(getLogger());
SourceHandler oldSourceHandler = environment.getSourceHandler();
- CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel());
+ CocoonComponentManager.enterEnvironment(environment,
+ environment.getObjectModel(),
+ this);
+ environment.setComponentManager(this.manager);
try {
environment.setSourceHandler(this.sourceHandler);
return process(environment, context);
@@ -318,8 +320,10 @@
throws Exception {
SourceHandler oldSourceHandler = environment.getSourceHandler();
- CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel());
-
+ CocoonComponentManager.enterEnvironment(environment,
+ environment.getObjectModel(),
+ this);
+ environment.setComponentManager(this.manager);
try {
environment.setSourceHandler(this.sourceHandler);
if (this.rootNode == null || this.source.getLastModified() > this.lastModified) {
No revision
No revision
1.12.2.5 +21 -1 xml-cocoon2/src/java/org/apache/cocoon/environment/AbstractEnvironment.java
Index: AbstractEnvironment.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/AbstractEnvironment.java,v
retrieving revision 1.12.2.4
retrieving revision 1.12.2.5
diff -u -r1.12.2.4 -r1.12.2.5
--- AbstractEnvironment.java 15 Jul 2002 14:42:49 -0000 1.12.2.4
+++ AbstractEnvironment.java 4 Aug 2002 04:11:52 -0000 1.12.2.5
@@ -52,6 +52,7 @@
import org.apache.avalon.excalibur.collections.IteratorEnumeration;
import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.source.SourceHandler;
@@ -100,6 +101,25 @@
/** The attributes */
private Map attributes = new HashMap();
+
+ /** The current manager */
+ protected ComponentManager manager = null;
+
+ /**
+ * The sitemap processor sets up new managers per sitemap. Get the
+ * "current" one for this environment.
+ */
+ public ComponentManager getComponentManager(){
+ return this.manager;
+ }
+
+ /**
+ * The sitemap sets up new managers per sitemap. Set the
+ * "current" one for this environment.
+ */
+ public void setComponentManager(ComponentManager manager){
+ this.manager = manager;
+ }
/**
* Constructs the abstract environment
1.6.2.3 +8 -1 xml-cocoon2/src/java/org/apache/cocoon/environment/Environment.java
Index: Environment.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/Environment.java,v
retrieving revision 1.6.2.2
retrieving revision 1.6.2.3
diff -u -r1.6.2.2 -r1.6.2.3
--- Environment.java 15 Jul 2002 14:42:49 -0000 1.6.2.2
+++ Environment.java 4 Aug 2002 04:11:52 -0000 1.6.2.3
@@ -50,6 +50,8 @@
*/
package org.apache.cocoon.environment;
+import org.apache.avalon.framework.component.ComponentManager;
+
import org.apache.cocoon.components.source.SourceHandler;
import java.io.IOException;
@@ -163,6 +165,11 @@
* environment is not able to test it
*/
boolean isResponseModified(long lastModified);
+
+ /**
+ * Set the <code>ComponentManager</code> for the current request.
+ */
+ void setComponentManager(ComponentManager manager);
/**
* Mark the response as not modified.
No revision
No revision
1.11.2.2 +29 -9 xml-cocoon2/src/java/org/apache/cocoon/environment/wrapper/EnvironmentWrapper.java
Index: EnvironmentWrapper.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/wrapper/EnvironmentWrapper.java,v
retrieving revision 1.11.2.1
retrieving revision 1.11.2.2
diff -u -r1.11.2.1 -r1.11.2.2
--- EnvironmentWrapper.java 21 Apr 2002 17:36:05 -0000 1.11.2.1
+++ EnvironmentWrapper.java 4 Aug 2002 04:11:53 -0000 1.11.2.2
@@ -50,10 +50,15 @@
*/
package org.apache.cocoon.environment.wrapper;
+import org.apache.avalon.framework.component.ComponentManager;
+
import org.apache.cocoon.environment.AbstractEnvironment;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.Processor;
+import org.apache.cocoon.components.CocoonComponentManager;
+
import org.apache.log.Logger;
import java.io.IOException;
@@ -99,6 +104,9 @@
/** The stream to output to */
private OutputStream outputStream;
+ /** The processor used */
+ private Processor processor;
+
/**
* Constructs an EnvironmentWrapper object from a Request
* and Response objects
@@ -144,7 +152,6 @@
this,
rawMode);
this.objectModel.put(ObjectModelHelper.REQUEST_OBJECT, this.request);
-
this.objectModel.put("Internal-Request", "true");
}
@@ -167,12 +174,23 @@
*/
public void globalRedirect(boolean sessionmode, String newURL)
throws IOException {
- if (environment instanceof EnvironmentWrapper) {
- ((EnvironmentWrapper)environment).globalRedirect(sessionmode, newURL);
- }
- else {
- environment.redirect(sessionmode,newURL);
- }
+ if (environment instanceof EnvironmentWrapper) {
+ ((EnvironmentWrapper)environment).globalRedirect(sessionmode, newURL);
+ } else {
+ environment.redirect(sessionmode,newURL);
+ }
+ }
+
+ /**
+ * The sitemap processor sets up new managers per sitemap. Set the
+ * "current" one for this environment.
+ */
+ public void setComponentManager(ComponentManager manager) {
+ super.setComponentManager( manager );
+ // HACK: As processing enters sitemap, capture current processor.
+ // If pipeline is successfully assembled, this will contain proper processor.
+ // Used by cocoon protocol.
+ this.processor = CocoonComponentManager.getCurrentProcessor();
}
/**
@@ -266,11 +284,13 @@
/**
* Change the current context to the last one set by changeContext()
+ * and return last processor.
*/
- public void changeToLastContext() {
+ public Processor changeToLastContext() {
this.setContext(this.lastContext);
this.setURIPrefix(this.lastPrefix);
this.uris = this.lastURI;
+ return this.processor;
}
/**
No revision
No revision
1.14.2.2 +13 -5 xml-cocoon2/src/java/org/apache/cocoon/sitemap/Attic/Handler.java
Index: Handler.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/Attic/Handler.java,v
retrieving revision 1.14.2.1
retrieving revision 1.14.2.2
diff -u -r1.14.2.1 -r1.14.2.2
--- Handler.java 7 Jun 2002 09:34:24 -0000 1.14.2.1
+++ Handler.java 4 Aug 2002 04:11:53 -0000 1.14.2.2
@@ -218,7 +218,10 @@
public boolean process(Environment environment) throws Exception {
checkSanity();
SourceHandler oldSourceHandler = environment.getSourceHandler();
- CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel());
+ CocoonComponentManager.enterEnvironment(environment,
+ environment.getObjectModel(),
+ this);
+ environment.setComponentManager(this.manager);
try {
environment.setSourceHandler(this.sourceHandler);
return sitemap.process(environment);
@@ -228,11 +231,16 @@
}
}
- public boolean process(Environment environment, StreamPipeline pipeline,
- EventPipeline eventPipeline) throws Exception {
+ public boolean process(Environment environment,
+ StreamPipeline pipeline,
+ EventPipeline eventPipeline) throws Exception
+ {
checkSanity();
SourceHandler oldSourceHandler = environment.getSourceHandler();
- CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel());
+ CocoonComponentManager.enterEnvironment(environment,
+ environment.getObjectModel(),
+ this);
+ environment.setComponentManager(this.manager);
try {
environment.setSourceHandler(this.sourceHandler);
return sitemap.process(environment, pipeline, eventPipeline);
----------------------------------------------------------------------
In case of troubles, e-mail: webmaster@xml.apache.org
To unsubscribe, e-mail: cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org