cziegeler 02/01/07 04:34:13
Modified: src/java/org/apache/cocoon Cocoon.java
src/java/org/apache/cocoon/sitemap AbstractSitemap.java
Handler.java
src/scratchpad/src/org/apache/cocoon/components
CocoonComponentManager.java
RequestLifecycleComponent.java
Added: src/java/org/apache/cocoon/components
CocoonComponentManager.java
RequestLifecycleComponent.java
Log:
Finished RequestLifecycleComponent handling
Revision Changes Path
1.2 +2 -2 xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java
Index: Cocoon.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Cocoon.java 3 Jan 2002 12:31:06 -0000 1.1
+++ Cocoon.java 7 Jan 2002 12:34:12 -0000 1.2
@@ -55,8 +55,8 @@
package org.apache.cocoon;
-import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
+import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.excalibur.logger.LogKitManageable;
import org.apache.avalon.excalibur.logger.LogKitManager;
import org.apache.avalon.framework.activity.Disposable;
@@ -104,7 +104,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Pierpaolo Fumagalli</a> (Apache
Software Foundation, Exoffice Technologies)
* @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Leo Sutic</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:06 $
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:12 $
*/
public class Cocoon
extends AbstractLoggable
1.1
xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java
Index: CocoonComponentManager.java
===================================================================
/*
* 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.components;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
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;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.Source;
import org.apache.cocoon.environment.SourceResolver;
import org.xml.sax.SAXException;
/**
* Cocoon Component Manager.
* This manager extends the <code>ExcaliburComponentManager</code>
* by a special lifecycle handling for a RequestLifecycleComponent.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/01/07 12:34:12 $
*/
public final class CocoonComponentManager
extends ExcaliburComponentManager
{
/** The environment information */
private static InheritableThreadLocal environmentStack = new
InheritableThreadLocal();
/** Create the ComponentManager */
public CocoonComponentManager()
{
super( null, Thread.currentThread().getContextClassLoader() );
}
/** Create the ComponentManager with a Classloader */
public CocoonComponentManager( final ClassLoader loader )
{
super( null, loader );
}
/** Create the ComponentManager with a Classloader and parent ComponentManager */
public CocoonComponentManager( final ComponentManager manager, final ClassLoader
loader )
{
super(manager, loader);
}
/** Create the ComponentManager with a parent ComponentManager */
public CocoonComponentManager(final ComponentManager manager)
{
super(manager);
}
/**
* This hook must be called by the sitemap each time a sitemap is entered
*/
public static void enterEnvironment(SourceResolver resolver, Map objectModel) {
if (environmentStack.get() == null) {
environmentStack.set(new Stack());
}
final Stack stack = (Stack)environmentStack.get();
stack.push(new Object[] {resolver, objectModel, new HashMap(5)});
}
/**
* This hook must be called by the sitemap each time a sitemap is left
*/
public static void leaveEnvironment() {
final Stack stack = (Stack)environmentStack.get();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.pop();
final Map components = (Map)objects[2];
final Iterator iter = components.values().iterator();
while (iter.hasNext() == true) {
final Object[] o = (Object[])iter.next();
final Component component = (Component)o[0];
((ComponentManager)o[1]).release( component );
}
}
}
/**
* 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();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.peek();
final Map components = (Map)objects[2];
final Object[] o = (Object[])components.get(role);
if ( null != o ) {
final Component component = (Component) o[0];
if ( null != component ) {
return component;
}
}
}
final Component component = super.lookup( role );
if ( null != component && component instanceof RequestLifecycleComponent) {
if ( stack == null || stack.empty() ) {
throw new ComponentException("ComponentManager has no Environment
Stack.");
}
final Object[] objects = (Object[]) stack.peek();
final Map components = (Map)objects[2];
try {
((RequestLifecycleComponent) component).setup(
(SourceResolver)objects[0],
(Map)objects[1]);
} catch (Exception local) {
throw new ComponentException("Exception during setup of
RequestLifecycleComponent with role '"+role+"'", local);
}
components.put( role, new Object[] {component, this});
}
return component;
}
/**
* Release a Component. This implementation makes sure it has a handle on the
propper
* ComponentHandler, and let's the ComponentHandler take care of the actual work.
*/
public void release( final Component component )
{
if( null == component )
{
return;
}
if ( component instanceof RequestLifecycleComponent) {
return;
}
super.release( component);
}
}
1.1
xml-cocoon2/src/java/org/apache/cocoon/components/RequestLifecycleComponent.java
Index: RequestLifecycleComponent.java
===================================================================
/*****************************************************************************
* 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.components;
import org.apache.avalon.framework.component.Component;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.SourceResolver;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.Map;
/**
* Objects implementing this marker interface have a lifecycle of one
* request. This means if one request is looking up several times
* an object implementing this interface, it's always the same object.
* In addition, the first time this object is looked up during a request,
* the setup() method is called
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/01/07 12:34:12 $
*/
public interface RequestLifecycleComponent extends Component {
/**
* Set the <code>SourceResolver</code>, objectModel <code>Map</code>,
* used to process the request.
*/
void setup(SourceResolver resolver, Map objectModel)
throws ProcessingException, SAXException, IOException;
}
1.2 +9 -9
xml-cocoon2/src/java/org/apache/cocoon/sitemap/AbstractSitemap.java
Index: AbstractSitemap.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/AbstractSitemap.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractSitemap.java 3 Jan 2002 12:31:20 -0000 1.1
+++ AbstractSitemap.java 7 Jan 2002 12:34:13 -0000 1.2
@@ -8,7 +8,6 @@
package org.apache.cocoon.sitemap;
-import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
import org.apache.avalon.excalibur.component.RoleManager;
import org.apache.avalon.excalibur.logger.LogKitManager;
import org.apache.avalon.framework.activity.Disposable;
@@ -22,6 +21,7 @@
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.Constants;
import org.apache.cocoon.acting.Action;
+import org.apache.cocoon.components.CocoonComponentManager;
import org.apache.cocoon.components.classloader.RepositoryClassLoader;
import org.apache.cocoon.components.pipeline.EventPipeline;
import org.apache.cocoon.components.pipeline.StreamPipeline;
@@ -48,7 +48,7 @@
* Base class for generated <code>Sitemap</code> classes
*
* @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:20 $
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $
*/
public abstract class AbstractSitemap extends AbstractLoggable implements Sitemap,
Disposable, ThreadSafe {
private Context context;
@@ -58,7 +58,7 @@
private static Configuration defaultConfig;
/** The component manager instance */
- protected ExcaliburComponentManager manager;
+ protected CocoonComponentManager manager;
/** The sitemap manager instance */
protected Manager sitemapManager;
@@ -96,7 +96,7 @@
* <code>Composable</code>.
*/
public void compose(ComponentManager manager) throws ComponentException {
- this.manager = new ExcaliburComponentManager(manager);
+ this.manager = new CocoonComponentManager(manager);
this.manager.setLogger(getLogger());
this.manager.contextualize(this.context);
this.manager.setRoleManager(AbstractSitemap.roleManager);
@@ -323,7 +323,7 @@
}
}
- /**
+ /**
* Dumps all sitemap parameters to log
*/
protected void dumpParameters(List list) {
@@ -414,16 +414,16 @@
manager.release((Component)this.selectors);
}
}
-
+
/**
Reset the response if possible. This allows error handlers to have
a higher chance to produce clean output if the pipeline that raised
the error has already output some data.
-
+
@param objectModel the object model
@return true if the response was successfully reset
*/
-
+
protected boolean tryResetResponse(Map objectModel)
{
try {
@@ -440,7 +440,7 @@
// Log the error, but don't transmit it
getLogger().warn("Problem resetting response", e);
}
-
+
getLogger().debug("Response wasn't reset");
return false;
}
1.2 +8 -3 xml-cocoon2/src/java/org/apache/cocoon/sitemap/Handler.java
Index: Handler.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/Handler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Handler.java 3 Jan 2002 12:31:20 -0000 1.1
+++ Handler.java 7 Jan 2002 12:34:13 -0000 1.2
@@ -19,6 +19,7 @@
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Processor;
+import org.apache.cocoon.components.CocoonComponentManager;
import org.apache.cocoon.components.language.generator.CompiledComponent;
import org.apache.cocoon.components.language.generator.ProgramGenerator;
import org.apache.cocoon.components.pipeline.EventPipeline;
@@ -41,7 +42,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:20 $
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $
*/
public class Handler extends AbstractLoggable
implements Runnable, Contextualizable, Composable, Processor, Disposable,
SourceResolver {
@@ -74,7 +75,7 @@
// FIXME : ugly hack to pass delay information from the main sitemap
configuration
// (the way to pass it cleanly from SitemapManager isn't obvious).
private static long sitemapCheckDelay = 10000L; // default is 10 secs.
-
+
static void setSitemapCheckDelay(long delay) {
sitemapCheckDelay = delay;
}
@@ -83,7 +84,7 @@
this.check_reload = check_reload;
this.sourceFileName = sourceFileName;
}
-
+
/**
* Contextualizable
*/
@@ -166,10 +167,12 @@
public boolean process(Environment environment) throws Exception {
checkSanity();
SourceHandler oldSourceHandler = environment.getSourceHandler();
+ CocoonComponentManager.enterEnvironment(environment,
environment.getObjectModel());
try {
environment.setSourceHandler(this.sourceHandler);
return sitemap.process(environment);
} finally {
+ CocoonComponentManager.leaveEnvironment();
environment.setSourceHandler(oldSourceHandler);
}
}
@@ -178,10 +181,12 @@
EventPipeline eventPipeline) throws Exception {
checkSanity();
SourceHandler oldSourceHandler = environment.getSourceHandler();
+ CocoonComponentManager.enterEnvironment(environment,
environment.getObjectModel());
try {
environment.setSourceHandler(this.sourceHandler);
return sitemap.process(environment, pipeline, eventPipeline);
} finally {
+ CocoonComponentManager.leaveEnvironment();
environment.setSourceHandler(oldSourceHandler);
}
}
1.2 +73 -38
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/CocoonComponentManager.java
Index: CocoonComponentManager.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/CocoonComponentManager.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- CocoonComponentManager.java 3 Jan 2002 12:31:36 -0000 1.1
+++ CocoonComponentManager.java 7 Jan 2002 12:34:13 -0000 1.2
@@ -7,115 +7,150 @@
*/
package org.apache.cocoon.components;
+import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
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;
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.Source;
import org.apache.cocoon.environment.SourceResolver;
+import org.xml.sax.SAXException;
+
/**
* Cocoon Component Manager.
* This manager extends the <code>ExcaliburComponentManager</code>
- * by a special lifecycle handling for RequestLifecycleComponent.
+ * by a special lifecycle handling for a RequestLifecycleComponent.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:36 $
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $
*/
public final class CocoonComponentManager
extends ExcaliburComponentManager
+implements SourceResolver
{
-
/** The environment information */
- private InheritableThreadLocal environmentStack = new InheritableThreadLocal();
+ private static InheritableThreadLocal environmentStack = new
InheritableThreadLocal();
+
+ /** The parent manager */
+ private ComponentManager parentManager;
/** Create the ComponentManager */
public CocoonComponentManager()
{
- super();
+ super( null, Thread.currentThread().getContextClassLoader() );
}
/** Create the ComponentManager with a Classloader */
public CocoonComponentManager( final ClassLoader loader )
{
- super(loader);
+ super( null, loader );
}
/** Create the ComponentManager with a Classloader and parent ComponentManager
*/
public CocoonComponentManager( final ComponentManager manager, final
ClassLoader loader )
{
- super(manager, loader);
+ super(manager instanceof CocoonComponentManager ?
((CocoonComponentManager)manager).getParentManager() : manager, loader);
+ this.parentManager = manager instanceof CocoonComponentManager ?
((CocoonComponentManager)manager).getParentManager() : manager;
}
/** Create the ComponentManager with a parent ComponentManager */
public CocoonComponentManager(final ComponentManager manager)
{
- super(manager);
+ super(manager instanceof CocoonComponentManager ?
((CocoonComponentManager)manager).getParentManager() : manager);
+ this.parentManager = manager instanceof CocoonComponentManager ?
((CocoonComponentManager)manager).getParentManager() : manager;
}
- public void enterEnvironment(SourceResolver resolver, Map objectModel) {
- System.out.println("Entering environment");
- if (this.environmentStack.get() == null) {
- this.environmentStack.set(new Stack());
+ /**
+ * This hook must be called by the sitemap each time a sitemap is entered
+ */
+ public static void enterEnvironment(SourceResolver resolver, Map objectModel) {
+ System.out.println("Entering environment"+ " - " +
Thread.currentThread().getName());
+ if (environmentStack.get() == null) {
+ environmentStack.set(new Stack());
}
- final Stack stack = (Stack)this.environmentStack.get();
+ final Stack stack = (Stack)environmentStack.get();
stack.push(new Object[] {resolver, objectModel, new HashMap(5)});
}
- public void leaveEnvironment() {
- System.out.println("Leaving environment");
- final Stack stack = (Stack)this.environmentStack.get();
- if (stack != null) {
+ /**
+ * This hook must be called by the sitemap each time a sitemap is left
+ */
+ public static void leaveEnvironment() {
+ System.out.println("Leaving environment"+ " - " +
Thread.currentThread().getName());
+ final Stack stack = (Stack)environmentStack.get();
+ if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.pop();
final Map components = (Map)objects[2];
final Iterator iter = components.values().iterator();
while (iter.hasNext() == true) {
- final Component component = (Component)iter.next();
+ final Object[] o = (Object[])iter.next();
+ final Component component = (Component)o[0];
System.out.println("RELEASING COMPONENT: " + component);
- super.release( component );
+ ((ComponentManager)o[1]).release( component );
}
+ } else {
+ System.out.println("*** UNBALANCED LEAVE ENVIRONMENT ***");
}
}
/**
+ * Resolve the source.
+ * @param systemID This is either a system identifier
+ * (<code>java.net.URL</code> or a local file.
+ */
+ public Source resolve(String systemID)
+ throws ProcessingException, SAXException, IOException {
+ System.out.println("Resolving source:" + systemID);
+ return null;
+ }
+
+
+ ComponentManager getParentManager() {
+ System.out.println("Getting parent!");
+ return this.parentManager;
+ }
+
+ /**
* 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)this.environmentStack.get();
- if ( stack != null ) {
- final Object[] objects = (Object[])stack.pop();
+ System.out.println("Looking up: " + role + " - " +
Thread.currentThread().getName());
+ final Stack stack = (Stack)environmentStack.get();
+ if ( null != stack && !stack.empty()) {
+ final Object[] objects = (Object[])stack.peek();
final Map components = (Map)objects[2];
- if ( components != null ) {
- final Component component = (Component) components.get(role);
- if ( component != null) {
- System.out.println("Looked up RequestLifecycleComponent again:
" + role);
- return component;
- }
+ final Object[] o = (Object[])components.get(role);
+ final Component component = (Component) o[0];
+ if ( component != null) {
+ System.out.println("Looked up RequestLifecycleComponent again: " +
role);
+ return component;
}
}
final Component component = super.lookup( role );
- if ( component != null && component instanceof RequestLifecycleComponent) {
- if ( stack == null) {
- throw new ComponentException("ComponentManager has no Environment
Stack");
+ if ( null != component && component instanceof RequestLifecycleComponent) {
+ if ( stack == null || stack.empty() ) {
+ System.out.println("No env");
+ return component;
+ //throw new ComponentException("ComponentManager has no Environment
Stack");
}
- final Object[] objects = (Object[]) stack.pop();
+ final Object[] objects = (Object[]) stack.peek();
final Map components = (Map)objects[2];
- if ( components == null ) {
- throw new ComponentException("ComponentManager has no Environment
Stack");
- }
- components.put( role, component);
try {
- ((RequestLifecycleComponent)
component).setup((SourceResolver)objects[0], (Map)objects[1]);
+ ((RequestLifecycleComponent) component).setup(this);
} catch (Exception local) {
throw new ComponentException("Exception during setup of
RequestLifecycleComponent with role '"+role+"'", local);
}
+ components.put( role, new Object[] {component, this});
System.out.println("New RequestModelComponent :" + component);
}
return component;
1.2 +2 -2
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/RequestLifecycleComponent.java
Index: RequestLifecycleComponent.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/RequestLifecycleComponent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RequestLifecycleComponent.java 3 Jan 2002 12:31:36 -0000 1.1
+++ RequestLifecycleComponent.java 7 Jan 2002 12:34:13 -0000 1.2
@@ -24,7 +24,7 @@
* the setup() method is called
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:36 $
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $
*/
public interface RequestLifecycleComponent extends Component {
@@ -32,6 +32,6 @@
* Set the <code>SourceResolver</code>, objectModel <code>Map</code>,
* used to process the request.
*/
- void setup(SourceResolver resolver, Map objectModel)
+ void setup(SourceResolver resolver)
throws ProcessingException, SAXException, IOException;
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]