You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2004/07/16 14:36:46 UTC
cvs commit: cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables PreparedVariableResolverTestCase.java
sylvain 2004/07/16 05:36:46
Modified: src/java/org/apache/cocoon cocoon.roles
src/java/org/apache/cocoon/components/treeprocessor
AbstractProcessingNodeBuilder.java
DefaultTreeBuilder.java ProcessorComponentInfo.java
SimpleSelectorProcessingNode.java TreeBuilder.java
TreeProcessor.java sitemap-language.xml
src/java/org/apache/cocoon/components/treeprocessor/sitemap
ActTypeNode.java ComponentsSelector.java
MatchNode.java PreparableMatchNode.java
SelectNode.java SelectNodeBuilder.java
SerializeNodeBuilder.java SitemapLanguage.java
SwitchSelectNode.java
src/blocks/profiler/java/org/apache/cocoon/components/profiler
ProfilingCachingProcessingPipeline.java
ProfilingNonCachingProcessingPipeline.java
src/blocks/scratchpad/java/org/apache/cocoon/components/pipeline/impl
ExpiresCachingProcessingPipeline.java
src/test/org/apache/cocoon/components/treeprocessor/variables
PreparedVariableResolverTestCase.java
Log:
Refactoring of the sitemap engine to decouple it as much as possible of the container implementation. TreeBuilder is now a regular component declared in cocoon.roles, and several implementations can exist for different versions of the sitemap language.
Revision Changes Path
1.17 +52 -0 cocoon-2.1/src/java/org/apache/cocoon/cocoon.roles
Index: cocoon.roles
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/cocoon.roles,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- cocoon.roles 25 May 2004 07:28:24 -0000 1.16
+++ cocoon.roles 16 Jul 2004 12:36:44 -0000 1.17
@@ -95,10 +95,62 @@
shorthand="store-janitor"
default-class="org.apache.excalibur.store.impl.StoreJanitorImpl"/>
+ <!--=========================================================================
+ Sitemap engine
+ =========================================================================-->
+
+ <!-- the sitemap engine -->
<role name="org.apache.cocoon.Processor"
shorthand="sitemap"
default-class="org.apache.cocoon.components.treeprocessor.TreeProcessor"/>
+
+ <!-- the tree builder for the sitemap language (additional implementations can be added here
+ or in cocoon.xconf for other implementations)
+
+ The shorthand attribute is actually of no use, but the rolemanager requires it -->
+ <role name="org.apache.cocoon.components.treeprocessor.TreeBuilder/sitemap-1.0"
+ shorthand="treebuilder-1.0-should-actually-never-be-used"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.SitemapLanguage"/>
+
+ <!-- the various elements of map:components -->
+ <role name="org.apache.cocoon.components.pipeline.ProcessingPipelineSelector"
+ shorthand="pipes"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.acting.ActionSelector"
+ shorthand="actions"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.selection.SelectorSelector"
+ shorthand="selectors"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.matching.MatcherSelector"
+ shorthand="matchers"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.generation.GeneratorSelector"
+ shorthand="generators"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.transformation.TransformerSelector"
+ shorthand="transformers"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.serialization.SerializerSelector"
+ shorthand="serializers"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.reading.ReaderSelector"
+ shorthand="readers"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
+
+ <role name="org.apache.cocoon.components.notification.NotifyingBuilder"
+ shorthand="notifying-builder"
+ default-class="org.apache.cocoon.components.notification.DefaultNotifyingBuilder"/>
+ <!--=========================================================================-->
+
<role name="org.apache.cocoon.components.classloader.ClassLoaderManager"
shorthand="classloader"
default-class="org.apache.cocoon.components.classloader.ClassLoaderManagerImpl"/>
1.7 +2 -6 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/AbstractProcessingNodeBuilder.java
Index: AbstractProcessingNodeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/AbstractProcessingNodeBuilder.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- AbstractProcessingNodeBuilder.java 15 Jul 2004 12:49:50 -0000 1.6
+++ AbstractProcessingNodeBuilder.java 16 Jul 2004 12:36:45 -0000 1.7
@@ -35,15 +35,11 @@
public abstract class AbstractProcessingNodeBuilder extends AbstractLogEnabled
- implements ProcessingNodeBuilder /*, Serviceable*/ {
+ implements ProcessingNodeBuilder {
protected TreeBuilder treeBuilder;
protected ServiceManager manager;
-
-// public void service(ServiceManager manager) throws ServiceException {
-// this.manager = manager;
-// }
/* (non-Javadoc)
* @see org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder#setBuilder(org.apache.cocoon.components.treeprocessor.TreeBuilder)
1.14 +78 -149 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java
Index: DefaultTreeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- DefaultTreeBuilder.java 15 Jul 2004 12:49:50 -0000 1.13
+++ DefaultTreeBuilder.java 16 Jul 2004 12:36:45 -0000 1.14
@@ -21,7 +21,6 @@
import java.util.List;
import java.util.Map;
-import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.excalibur.component.ExcaliburComponentSelector;
import org.apache.avalon.excalibur.component.RoleManageable;
import org.apache.avalon.excalibur.component.RoleManager;
@@ -29,11 +28,9 @@
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.component.WrapperComponentManager;
-import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.configuration.DefaultConfiguration;
-import org.apache.avalon.framework.configuration.NamespacedSAXConfigurationHandler;
+import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
@@ -43,7 +40,6 @@
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.WrapperServiceSelector;
-import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.ExtendedComponentSelector;
import org.apache.cocoon.components.LifecycleHelper;
import org.apache.cocoon.components.source.SourceUtil;
@@ -51,6 +47,7 @@
import org.apache.cocoon.sitemap.PatternException;
import org.apache.cocoon.sitemap.SitemapParameters;
import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceResolver;
/**
*
@@ -59,8 +56,8 @@
*/
public class DefaultTreeBuilder
extends AbstractLogEnabled
- implements TreeBuilder, Configurable, Contextualizable, Serviceable,
- RoleManageable, Recyclable, Disposable {
+ implements TreeBuilder, Contextualizable, Serviceable,
+ RoleManageable, Initializable, Recyclable, Disposable {
protected Map attributes = new HashMap();
@@ -84,7 +81,6 @@
*/
protected RoleManager ownRoleManager;
- protected Configuration configuration;
// -------------------------------------
/**
@@ -97,11 +93,6 @@
*/
protected ServiceManager processorManager;
- /**
- * Role manager result created by {@link #createRoleManager()}.
- */
- protected RoleManager processorRoleManager;
-
/** Selector for ProcessingNodeBuilders */
protected ServiceSelector builderSelector;
@@ -138,6 +129,60 @@
public void service(ServiceManager manager) throws ServiceException {
this.ownManager = manager;
}
+
+ /**
+ * Get the location of the treebuilder config file. Can be overridden for other versions.
+ * @return
+ */
+ protected String getBuilderConfigURL() {
+ return "resource://org/apache/cocoon/components/treeprocessor/sitemap-language.xml";
+ }
+
+ public void initialize() throws Exception {
+ // Load the builder config file
+ SourceResolver resolver = (SourceResolver)this.ownManager.lookup(SourceResolver.ROLE);
+ String url = getBuilderConfigURL();
+ Configuration config;
+ try {
+ Source src = resolver.resolveURI(url);
+ try {
+ SAXConfigurationHandler handler = new SAXConfigurationHandler();
+ SourceUtil.toSAX(this.ownManager, src, null, handler);
+ config = handler.getConfiguration();
+ } finally {
+ resolver.release(src);
+ }
+ } catch(Exception e) {
+ throw new ConfigurationException("Could not load TreeBuilder configuration from " + url, e);
+ } finally {
+ this.ownManager.release(resolver);
+ }
+
+ // Create the NodeBuilder selector.
+ ExcaliburComponentSelector selector = new ExtendedComponentSelector() {
+ protected String getComponentInstanceName() {
+ return "node";
+ }
+
+ protected String getClassAttributeName() {
+ return "builder";
+ }
+ };
+
+ // Automagically initialize the selector
+ LifecycleHelper.setupComponent(selector,
+ getLogger(),
+ this.context,
+ this.ownManager,
+ new WrapperComponentManager(this.ownManager),
+ this.ownRoleManager,
+ config.getChild("nodes", false),
+ true
+ );
+
+ this.builderSelector = new WrapperServiceSelector("BuilderSelector", selector);
+
+ }
public void setParentProcessorManager(ServiceManager manager) {
this.parentProcessorManager = manager;
@@ -151,13 +196,6 @@
}
/* (non-Javadoc)
- * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
- */
- public void configure(Configuration config) throws ConfigurationException {
- this.configuration = config;
- }
-
- /* (non-Javadoc)
* @see org.apache.cocoon.components.treeprocessor.TreeBuilder#setAttribute(java.lang.String, java.lang.Object)
*/
public void setAttribute(String name, Object value) {
@@ -172,31 +210,6 @@
}
/**
- * Create a role manager that will be used by all <code>RoleManageable</code>
- * components. The default here is to create a role manager with the contents of
- * the <roles> element of the configuration.
- * <p>
- * Subclasses can redefine this method to create roles from other sources than
- * the one used here.
- *
- * @return the role manager
- */
- protected RoleManager createRoleManager() throws Exception
- {
- RoleManager roles = new DefaultRoleManager(this.ownRoleManager);
-
- LifecycleHelper.setupComponent(roles,
- getLogger(),
- this.context,
- this.ownManager,
- this.ownRoleManager,
- this.configuration.getChild("roles")
- );
-
- return roles;
- }
-
- /**
* Create a component manager that will be used for all <code>Composable</code>
* <code>ProcessingNodeBuilder</code>s and <code>ProcessingNode</code>s.
* <p>
@@ -213,69 +226,6 @@
return this.ownManager;
}
- /**
- * Create a <code>ComponentSelector</code> for <code>ProcessingNodeBuilder</code>s.
- * It creates a selector with the contents of the "node" element of the configuration.
- *
- * @return a selector for node builders
- */
- protected ServiceSelector createBuilderSelector(String sitemapVersion)
- throws Exception {
-
- // Create the NodeBuilder selector.
- ExcaliburComponentSelector selector = new ExtendedComponentSelector() {
- protected String getComponentInstanceName() {
- return "node";
- }
-
- protected String getClassAttributeName() {
- return "builder";
- }
- };
-
- // Merge configuration for tree builder from
- // <nodes> and <nodes-{sitemapVersion}>
- final Configuration base = this.configuration.getChild("nodes");
- final Configuration layer = this.configuration.getChild("nodes-" + sitemapVersion);
- if ( layer != null ) {
- final DefaultConfiguration merged =
- new DefaultConfiguration( base.getName(),
- "Merged [layer: " + layer.getLocation()
- + ", base: " + base.getLocation() + "]" );
- merged.addAllChildren(base);
- final Configuration[] lc = layer.getChildren();
- for( int i = 0; i < lc.length; i++ ) {
- final String nodeName = lc[i].getAttribute("name");
- final Configuration[] bc = base.getChildren();
- boolean found = false;
- int m = 0;
- while ( m < bc.length && ! found ) {
- if ( nodeName.equals(bc[m].getAttribute("name")) ) {
- found = true;
- } else {
- m++;
- }
- }
- if ( found ) {
- merged.removeChild( bc[m] );
- }
- merged.addChild( lc[i] );
- }
- }
- // Automagically initialize the selector
- LifecycleHelper.setupComponent(selector,
- getLogger(),
- this.context,
- this.ownManager,
- new WrapperComponentManager(this.ownManager),
- this.ownRoleManager,
- base,
- true
- );
-
- return new WrapperServiceSelector("BuilderSelector", selector);
- }
-
/* (non-Javadoc)
* @see org.apache.cocoon.components.treeprocessor.TreeBuilder#setProcessor(org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor)
*/
@@ -372,40 +322,13 @@
return this.namespace;
}
- public ProcessingNode build(Source source)
- throws Exception {
-
- try {
- // Build a namespace-aware configuration object
- NamespacedSAXConfigurationHandler handler = new NamespacedSAXConfigurationHandler();
- SourceUtil.toSAX( source, handler );
- Configuration treeConfig = handler.getConfiguration();
-
- this.namespace = treeConfig.getNamespace();
-
- // get the namespace version
- final int pos = this.namespace.lastIndexOf('/');
- if ( pos == -1 ) {
- throw new ProcessingException("Namespace " + this.namespace + " does not have a version number.");
- }
- if ( !this.namespace.substring(0, pos).equals("http://apache.org/cocoon/sitemap") ) {
- throw new ProcessingException("Namespace " + this.namespace + " is not a valid sitemap namespace.");
- }
- return build(treeConfig, this.namespace.substring(pos+1));
- } catch (ProcessingException e) {
- throw e;
- } catch(Exception e) {
- throw new ProcessingException("Failed to load sitemap from " +
- source.getURI(), e);
- }
- }
-
/**
* Build a processing tree from a <code>Configuration</code>.
*/
- protected ProcessingNode build(Configuration tree, String sitemapVersion) throws Exception {
-
- this.processorRoleManager = createRoleManager();
+ public ProcessingNode build(Configuration tree) throws Exception {
+
+ // The namespace use in the whole sitemap is the one of the root element
+ this.namespace = tree.getNamespace();
this.processorManager = createServiceManager(tree);
@@ -413,12 +336,10 @@
this.lifecycle = new LifecycleHelper(getLogger(),
this.context,
this.processorManager,
- this.processorRoleManager,
+ this.ownRoleManager,
null // configuration
);
- this.builderSelector = createBuilderSelector(sitemapVersion);
-
// Calls to getRegisteredNode() are forbidden
this.canGetNode = false;
@@ -565,19 +486,27 @@
}
public void recycle() {
+
+ // Reset all data created during the build
+ this.attributes.clear();
+ this.canGetNode = false;
+ this.disposableNodes = new ArrayList(); // Must not be cleared as it's used for processor disposal
+ this.initializableNodes.clear();
+ this.lifecycle = null; // Created in build()
+ this.linkedBuilders.clear();
+ this.namespace = null; // Set in build()
+ this.parentProcessorManager = null; // Set in setParentProcessorManager()
+ this.processor = null; // Set in setProcessor()
+ this.processorManager = null; // Set in build()
+ this.registeredNodes.clear();
+
this.lifecycle = null; // Created in build()
this.initializableNodes.clear();
this.linkedBuilders.clear();
this.canGetNode = false;
this.registeredNodes.clear();
- // Don't clear disposableNodes as they're used by the Processor
- this.disposableNodes = new ArrayList();
VariableResolverFactory.setDisposableCollector(null);
-
- this.processor = null;
- this.processorManager = null;
- this.processorRoleManager = null;
}
public void dispose() {
1.2 +1 -15 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java
Index: ProcessorComponentInfo.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ProcessorComponentInfo.java 15 Jul 2004 12:49:50 -0000 1.1
+++ ProcessorComponentInfo.java 16 Jul 2004 12:36:45 -0000 1.2
@@ -42,12 +42,6 @@
/** Lock that prevents further modification */
private boolean locked = false;
-// /**
-// * Does this processor have mount instructions? If yes, we must keep this data to
-// * build child processors, else we can discard it.
-// */
-// private boolean hasMount;
-
/**
* Component-related data (see methods below for key names). We use a single Map
* to reduce memory usage, as each kind of data has a limited number of entries.
@@ -66,14 +60,6 @@
public ServiceManager getServiceManager() {
return this.manager;
}
-
-// public void foundMountInstruction() {
-// this.hasMount = true;
-// }
-//
-// public boolean hasMountInstruction() {
-// return this.hasMount;
-// }
/** Store some data, creating the storage map if needed */
private void setData(String key, Object value) {
1.6 +27 -37 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/SimpleSelectorProcessingNode.java
Index: SimpleSelectorProcessingNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/SimpleSelectorProcessingNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SimpleSelectorProcessingNode.java 15 Jul 2004 12:49:50 -0000 1.5
+++ SimpleSelectorProcessingNode.java 16 Jul 2004 12:36:45 -0000 1.6
@@ -23,6 +23,7 @@
import org.apache.avalon.framework.thread.ThreadSafe;
/**
+ * Base class for processing nodes that are based on a component in a Selector (act, match, select, etc).
*
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
* @version CVS $Id$
@@ -37,7 +38,7 @@
private ServiceManager manager;
/** Selector where to get components from */
- protected ServiceSelector selector;
+ private ServiceSelector selector;
/** The underlying component, if it's threadsafe. Null otherwise */
private Object threadSafeComponent;
@@ -60,44 +61,33 @@
}
}
- protected boolean hasThreadSafeComponent() {
- return this.threadSafeComponent != null;
+ /**
+ * Get the component to be used by this node. That component may be cached for faster
+ * execution if it's ThreadSafe. In any case, a call to {@link #releaseComponent(Object)} must
+ * be done to release the component if needed.
+ *
+ * @return the component to use
+ * @throws ServiceException if component lookup fails
+ */
+ protected Object getComponent() throws ServiceException {
+ if (this.threadSafeComponent != null) {
+ return this.threadSafeComponent;
+ } else {
+ return this.selector.select(this.componentName);
+ }
}
- protected Object getThreadSafeComponent() {
- return this.threadSafeComponent;
+ /**
+ * Release the component used by this node (does nothing if it's the cached
+ * ThreadSafe component)
+ *
+ * @param obj the component
+ */
+ protected void releaseComponent(Object obj) {
+ if (obj != this.threadSafeComponent) {
+ this.selector.release(obj);
+ }
}
-
-// public void setSelector(ServiceSelector selector) {
-// this.selector = selector;
-// }
-
-// /**
-// * Tests if the component designated by this node using the selector and component name
-// * is <code>ThreadSafe</code>, and return it if true.
-// * <p>
-// * Note : this method must be called <i>after</i> <code>setSelector()</code>.
-// */
-// protected Object getThreadSafeComponent() throws ServiceException {
-// return getThreadSafeComponent(this.componentName);
-// }
-//
-// /**
-// * Tests if the component designated by this node using the selector and component name
-// * is <code>ThreadSafe</code>, and return it if true.
-// * <p>
-// * Note : this method must be called <i>after</i> <code>setSelector()</code>.
-// * @throws ServiceException
-// */
-// protected Object getThreadSafeComponent(String name) throws ServiceException {
-// Object component = this.selector.select(name);
-// if (component instanceof ThreadSafe) {
-// return component;
-// } else {
-// this.selector.release(component);
-// return null;
-// }
-// }
public void dispose() {
this.selector.release(this.threadSafeComponent);
1.8 +5 -4 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
Index: TreeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- TreeBuilder.java 15 Jul 2004 12:49:50 -0000 1.7
+++ TreeBuilder.java 16 Jul 2004 12:36:45 -0000 1.8
@@ -21,7 +21,6 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.excalibur.source.Source;
/**
*
@@ -30,6 +29,8 @@
*/
public interface TreeBuilder extends Component {
+
+ final static String ROLE = TreeBuilder.class.getName();
void setProcessor(ConcreteTreeProcessor processor);
@@ -57,9 +58,9 @@
String getNamespace();
/**
- * Build a processing tree from a <code>Source</code>.
+ * Build a processing tree from a <code>Configuration</code> object holding the sitemap program.
*/
- ProcessingNode build(Source source) throws Exception;
+ ProcessingNode build(Configuration config) throws Exception;
/**
* Return the list of <code>ProcessingNodes</code> part of this tree that are
1.40 +68 -56 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
Index: TreeProcessor.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- TreeProcessor.java 15 Jul 2004 12:49:50 -0000 1.39
+++ TreeProcessor.java 16 Jul 2004 12:36:45 -0000 1.40
@@ -19,12 +19,12 @@
import org.apache.avalon.excalibur.component.RoleManageable;
import org.apache.avalon.excalibur.component.RoleManager;
-import org.apache.avalon.excalibur.pool.Recyclable;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.NamespacedSAXConfigurationHandler;
import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
import org.apache.avalon.framework.container.ContainerUtil;
import org.apache.avalon.framework.context.Context;
@@ -37,13 +37,13 @@
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.Processor;
import org.apache.cocoon.components.ContextHelper;
-import org.apache.cocoon.components.LifecycleHelper;
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.components.source.impl.DelayedRefreshSourceWrapper;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.internal.EnvironmentHelper;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
+import org.apache.regexp.RE;
/**
* Interpreted tree-traversal implementation of a pipeline assembly language.
@@ -78,9 +78,6 @@
/** The root role manager */
protected RoleManager rootRoleManager;
- /** Sitemap TreeBuilder */
- protected TreeBuilder treeBuilder;
-
/** Last modification time */
protected long lastModified = 0;
@@ -90,12 +87,9 @@
/** Delay for <code>sourceLastModified</code>. */
protected long lastModifiedDelay;
- /** The current language configuration */
- protected Configuration currentLanguage;
-
/** The file to process */
protected String fileName;
-
+
/** Check for reload? */
protected boolean checkReload;
@@ -146,7 +140,6 @@
ContainerUtil.enableLogging(this.environmentHelper, this.getLogger());
ContainerUtil.service(this.environmentHelper, this.parentServiceManager);
this.environmentHelper.changeContext(sitemapSource, prefix);
- this.createTreeBuilder();
}
/**
@@ -225,31 +218,6 @@
throw new ConfigurationException(msg, e);
}
- this.createTreeBuilder();
- }
-
- /**
- * Create a new tree builder for this sitemap
- */
- protected void createTreeBuilder()
- throws ConfigurationException {
- // Create a builder for the sitemap language
- try {
- this.treeBuilder = (TreeBuilder)Thread.currentThread()
- .getContextClassLoader()
- .loadClass("org.apache.cocoon.components.treeprocessor.sitemap.SitemapLanguage").newInstance();
-
- LifecycleHelper.setupComponent(this.treeBuilder,
- getLogger(),
- this.context,
- this.parentServiceManager,
- this.rootRoleManager,
- this.treeBuilderConfiguration);
- } catch(ConfigurationException ce) {
- throw ce;
- } catch(Exception e) {
- throw new ConfigurationException("Could not setup sitemap builder.", e);
- }
}
/**
@@ -331,7 +299,41 @@
public EnvironmentHelper getEnvironmentHelper() {
return this.environmentHelper;
}
+
+ /**
+ * Get the tree builder role from the sitemap program (as a configuration object).
+ * This method should report very any problem very clearly, as it is the entry point of any
+ * Cocoon application.
+ *
+ * @param sitemapProgram the sitemap
+ * @return the treebuilder role
+ * @throws ConfigurationException if a suitable role could not be found
+ */
+ private TreeBuilder getTreeBuilder(Configuration sitemapProgram) throws ConfigurationException {
+
+ String ns = sitemapProgram.getNamespace();
+
+ RE re = new RE("http://apache.org/cocoon/sitemap/(\\d\\.\\d)");
+
+ if (!re.match(ns)) {
+ throw new ConfigurationException("Unknown sitemap namespace (" + ns + ") at " +
+ this.source.getURI());
+ }
+
+ String version = re.getParen(1);
+ String result = TreeBuilder.ROLE + "/sitemap-" + version;
+
+ try {
+ return (TreeBuilder)this.parentServiceManager.lookup(result);
+ } catch(Exception ex) {
+ throw new ConfigurationException("This version of Cocoon does not handle sitemap version " +
+ version + " at " + this.source.getURI(), ex);
+ }
+ }
+ /**
+ * Sets up the concrete processor, building or rebuilding it if necessary.
+ */
private void setupConcreteProcessor(Environment env) throws Exception {
// first, check for sitemap changes
if (this.concreteProcessor == null ||
@@ -340,6 +342,10 @@
}
}
+ /**
+ * Build the concrete processor (i.e. loads the sitemap). Should be called
+ * only by setupProcessor();
+ */
private synchronized void buildConcreteProcessor(Environment env) throws Exception {
// Now that we entered the synchronized area, recheck what's already
@@ -350,12 +356,9 @@
}
long startTime = System.currentTimeMillis();
-
- // Get a builder
- ConcreteTreeProcessor newProcessor = new ConcreteTreeProcessor(this);
long newLastModified;
- this.setupLogger(newProcessor);
-
+ ConcreteTreeProcessor newProcessor;
+
// We have to do a call to enterProcessor() here as during building
// of the tree, components (e.g. actions) are already instantiated
// (ThreadSafe ones mostly).
@@ -363,34 +366,46 @@
// current service manager they must get this one - which is currently
// in the process of initialization.
EnvironmentHelper.enterProcessor(this, this.parentServiceManager, env);
+
try {
- if (this.treeBuilder instanceof Recyclable) {
- ((Recyclable)this.treeBuilder).recycle();
- }
- this.treeBuilder.setProcessor(newProcessor);
- this.treeBuilder.setParentProcessorManager(this.parentServiceManager);
+ // Load the sitemap file
if (this.fileName == null) {
this.fileName = "sitemap.xmap";
}
-
if (this.source == null) {
this.source = new DelayedRefreshSourceWrapper(this.resolver.resolveURI(this.fileName),
lastModifiedDelay);
}
-
+
+ // Build a namespace-aware configuration object
+ NamespacedSAXConfigurationHandler handler = new NamespacedSAXConfigurationHandler();
+ SourceUtil.toSAX(this.source, handler );
+ Configuration sitemapProgram = handler.getConfiguration();
newLastModified = this.source.getLastModified();
-
- ProcessingNode root = this.treeBuilder.build(this.source);
-
- newProcessor.setProcessorData(root, this.treeBuilder.getDisposableNodes());
+ newProcessor = new ConcreteTreeProcessor(this);
+ this.setupLogger(newProcessor);
+
+ // Get the treebuilder that can handle this version of the sitemap.
+ TreeBuilder treeBuilder = getTreeBuilder(sitemapProgram);
+
+ try {
+ treeBuilder.setProcessor(newProcessor);
+ treeBuilder.setParentProcessorManager(this.parentServiceManager);
+
+ ProcessingNode root = treeBuilder.build(sitemapProgram);
+ newProcessor.setProcessorData(root, treeBuilder.getDisposableNodes());
+
+ } finally {
+ this.parentServiceManager.release(treeBuilder);
+ }
} finally {
EnvironmentHelper.leaveProcessor();
}
if (getLogger().isDebugEnabled()) {
- double time = (this.lastModified - startTime) / 1000.0;
+ double time = (System.currentTimeMillis() - startTime) / 1000.0;
getLogger().debug("TreeProcessor built in " + time + " secs from " + source.getURI());
}
@@ -414,9 +429,6 @@
// are none when a TreeProcessor is disposed.
ContainerUtil.dispose(this.concreteProcessor);
this.concreteProcessor = null;
-
- ContainerUtil.dispose(this.treeBuilder);
- this.treeBuilder = null;
if (this.parentServiceManager != null) {
if (this.source != null) {
1.2 +2 -84 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap-language.xml
Index: sitemap-language.xml
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap-language.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sitemap-language.xml 9 Jun 2004 09:41:15 -0000 1.1
+++ sitemap-language.xml 16 Jul 2004 12:36:45 -0000 1.2
@@ -16,19 +16,7 @@
-->
<!DOCTYPE sitemap-language [
- <!ELEMENT sitemap-language (parameter, roles, nodes)>
- <!ELEMENT roles (role+)>
- <!ELEMENT role (hint*)>
- <!ATTLIST role
- name CDATA #REQUIRED
- shorthand CDATA #REQUIRED
- default-class CDATA #REQUIRED
- >
- <!ELEMENT hint EMPTY>
- <!ATTLIST hint
- shorthand CDATA #REQUIRED
- class CDATA #REQUIRED
- >
+ <!ELEMENT sitemap-language (nodes)>
<!ELEMENT nodes (node+)>
<!ELEMENT node (allowed-children*, ignored-children*, forbidden-children*)>
<!ATTLIST node
@@ -42,77 +30,7 @@
<sitemap-language>
- <!-- New roles available to components created within a sitemap (i.e. in <map:components>) -->
- <roles>
- <role name="org.apache.cocoon.acting.ActionSelector"
- shorthand="actions"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
-
- <role name="org.apache.cocoon.selection.SelectorSelector"
- shorthand="selectors"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
-
- <role name="org.apache.cocoon.components.pipeline.ProcessingPipelineSelector"
- shorthand="pipes"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
-
- <role name="org.apache.cocoon.matching.MatcherSelector"
- shorthand="matchers"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector">
-
- <!-- since <map:components> is a regular xconf, we can define shorthand for
- well-known implementations.
-
- The hint below allows the following to be written in <map:matchers> :
- <regexp-uri-matcher name="regexp"/>
- in place of :
- <map:matcher name="regexp" src="org.apache.cocoon.matching.RegexpURIMatcher"/>
- -->
- <hint shorthand="regexp-uri-matcher"
- class="org.apache.cocoon.matching.RegexpURIMatcher"/>
-
- <hint shorthand="wildcard-uri-matcher"
- class="org.apache.cocoon.matching.WildcardURIMatcher"/>
-
- </role>
-
- <role name="org.apache.cocoon.generation.GeneratorSelector"
- shorthand="generators"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector">
-
- <hint shorthand="file-generator"
- class="org.apache.cocoon.generation.FileGenerator"/>
-
- </role>
-
- <role name="org.apache.cocoon.transformation.TransformerSelector"
- shorthand="transformers"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector">
-
- <hint shorthand="XSLT-transformer"
- class="org.apache.cocoon.transformation.TraxTransformer"/>
-
- <hint shorthand="cinclude-transformer"
- class="org.apache.cocoon.transformation.CIncludeTransformer"/>
-
- </role>
-
- <role name="org.apache.cocoon.serialization.SerializerSelector"
- shorthand="serializers"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
-
- <role name="org.apache.cocoon.reading.ReaderSelector"
- shorthand="readers"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.ComponentsSelector"/>
-
- <role name="org.apache.cocoon.components.notification.NotifyingBuilder"
- shorthand="notifying-builder"
- default-class="org.apache.cocoon.components.notification.DefaultNotifyingBuilder"/>
-
- </roles>
-
- <!-- node definitions for the sitemap language
- that apply to all version -->
+ <!-- node definitions for the sitemap language -->
<nodes>
<!-- A node has the following attributes :
- name : the node name, given as a local name in the language namespace (no prefix)
1.11 +7 -18 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java
Index: ActTypeNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ActTypeNode.java 15 Jul 2004 12:49:50 -0000 1.10
+++ ActTypeNode.java 16 Jul 2004 12:36:45 -0000 1.11
@@ -98,28 +98,17 @@
}
}
- // If action is ThreadSafe, avoid select() and try/catch block (faster !)
- if (this.hasThreadSafeComponent()) {
- actionResult = this.executor.invokeAction(this,
+ Action action = (Action)getComponent();
+ try {
+ actionResult = this.executor.invokeAction(this,
objectModel,
- (Action)this.getThreadSafeComponent(),
+ action,
redirector,
resolver,
resolvedSource,
resolvedParams);
- } else {
- Action action = (Action)this.selector.select(this.componentName);
- try {
- actionResult = this.executor.invokeAction(this,
- objectModel,
- action,
- redirector,
- resolver,
- resolvedSource,
- resolvedParams);
- } finally {
- this.selector.release(action);
- }
+ } finally {
+ releaseComponent(action);
}
if (redirector.hasRedirected()) {
1.13 +1 -5 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ComponentsSelector.java
Index: ComponentsSelector.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ComponentsSelector.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ComponentsSelector.java 15 Jul 2004 12:49:50 -0000 1.12
+++ ComponentsSelector.java 16 Jul 2004 12:36:45 -0000 1.13
@@ -15,11 +15,8 @@
*/
package org.apache.cocoon.components.treeprocessor.sitemap;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
-import java.util.StringTokenizer;
import org.apache.avalon.framework.CascadingRuntimeException;
import org.apache.avalon.framework.component.ComponentException;
@@ -28,7 +25,6 @@
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.components.ExtendedComponentSelector;
-import org.apache.cocoon.components.container.ComponentLocatorImpl;
import org.apache.cocoon.components.pipeline.ProcessingPipeline;
import org.apache.cocoon.generation.Generator;
import org.apache.cocoon.matching.Matcher;
1.6 +9 -19 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNode.java
Index: MatchNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MatchNode.java 15 Jul 2004 12:49:50 -0000 1.5
+++ MatchNode.java 16 Jul 2004 12:36:45 -0000 1.6
@@ -66,25 +66,15 @@
Map result = null;
- if (this.hasThreadSafeComponent()) {
- // Avoid select() and try/catch block (faster !)
+ Matcher matcher = (Matcher)getComponent();
+ try {
result = this.executor.invokeMatcher(this,
- objectModel,
- (Matcher)this.getThreadSafeComponent(),
- resolvedPattern,
- resolvedParams);
- } else {
- // Get matcher from selector
- Matcher matcher = (Matcher)this.selector.select(this.componentName);
- try {
- result = this.executor.invokeMatcher(this,
- objectModel,
- matcher,
- resolvedPattern,
- resolvedParams);
- } finally {
- this.selector.release(matcher);
- }
+ objectModel,
+ matcher,
+ resolvedPattern,
+ resolvedParams);
+ } finally {
+ releaseComponent(matcher);
}
if (result != null) {
1.9 +9 -16 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PreparableMatchNode.java
Index: PreparableMatchNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PreparableMatchNode.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- PreparableMatchNode.java 15 Jul 2004 12:49:50 -0000 1.8
+++ PreparableMatchNode.java 16 Jul 2004 12:36:45 -0000 1.9
@@ -66,7 +66,7 @@
public void initialize() throws Exception {
// Prepare the pattern
- PreparableMatcher matcher = (PreparableMatcher)selector.select(componentName);
+ PreparableMatcher matcher = (PreparableMatcher)getComponent();
try {
this.preparedPattern = matcher.preparePattern(this.pattern);
@@ -74,7 +74,7 @@
String msg = "Invalid pattern '" + this.pattern + "' for matcher at " + this.getLocation();
throw new ConfigurationException(msg, pe);
} finally {
- selector.release(matcher);
+ releaseComponent(matcher);
}
}
@@ -94,19 +94,12 @@
Map result = null;
- if (this.getThreadSafeComponent() != null) {
- // Avoid select() and try/catch block (faster !)
- result = ((PreparableMatcher)this.getThreadSafeComponent()).preparedMatch(preparedPattern, objectModel, resolvedParams);
-
- } else {
- // Get matcher from selector
- PreparableMatcher matcher = (PreparableMatcher)this.selector.select(this.componentName);
- try {
- result = matcher.preparedMatch(preparedPattern, objectModel, resolvedParams);
-
- } finally {
- this.selector.release(matcher);
- }
+ PreparableMatcher matcher = (PreparableMatcher)getComponent();
+ try {
+ result = matcher.preparedMatch(preparedPattern, objectModel, resolvedParams);
+
+ } finally {
+ releaseComponent(matcher);
}
if (result != null) {
1.6 +6 -26 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNode.java
Index: SelectNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SelectNode.java 15 Jul 2004 12:49:50 -0000 1.5
+++ SelectNode.java 16 Jul 2004 12:36:45 -0000 1.6
@@ -74,12 +74,12 @@
final Map objectModel = env.getObjectModel();
final Parameters resolvedParams = VariableResolver.buildParameters(this.parameters, context, objectModel);
- // If selector is ThreadSafe, avoid select() and try/catch block (faster !)
- if (this.getThreadSafeComponent() != null) {
+ final Selector selector = (Selector)getComponent();
+ try {
for (int i = 0; i < this.whenTests.length; i++) {
if ( this.executor.invokeSelector(this, objectModel,
- (Selector)this.getThreadSafeComponent(),
+ selector,
whenTests[i].resolve(context, objectModel),
resolvedParams)) {
return invokeNodes(this.whenNodes[i], env, context);
@@ -91,28 +91,8 @@
}
return false;
-
- } else {
- final Selector selector = (Selector)this.selector.select(this.componentName);
- try {
-
- for (int i = 0; i < this.whenTests.length; i++) {
- if ( this.executor.invokeSelector(this, objectModel,
- selector,
- whenTests[i].resolve(context, objectModel),
- resolvedParams)) {
- return invokeNodes(this.whenNodes[i], env, context);
- }
- }
-
- if (this.otherwhiseNodes != null) {
- return invokeNodes(this.otherwhiseNodes, env, context);
- }
-
- return false;
- } finally {
- this.selector.release(selector);
- }
+ } finally {
+ releaseComponent(selector);
}
}
}
1.4 +4 -5 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNodeBuilder.java
Index: SelectNodeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNodeBuilder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SelectNodeBuilder.java 15 Jul 2004 12:49:50 -0000 1.3
+++ SelectNodeBuilder.java 16 Jul 2004 12:36:45 -0000 1.4
@@ -15,6 +15,9 @@
*/
package org.apache.cocoon.components.treeprocessor.sitemap;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.service.ServiceSelector;
@@ -22,12 +25,8 @@
import org.apache.cocoon.components.treeprocessor.ProcessingNode;
import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
-import org.apache.cocoon.matching.Matcher;
import org.apache.cocoon.selection.Selector;
import org.apache.cocoon.selection.SwitchSelector;
-
-import java.util.ArrayList;
-import java.util.List;
/**
*
1.5 +4 -6 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SerializeNodeBuilder.java
Index: SerializeNodeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SerializeNodeBuilder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SerializeNodeBuilder.java 15 Jul 2004 12:49:50 -0000 1.4
+++ SerializeNodeBuilder.java 16 Jul 2004 12:36:45 -0000 1.5
@@ -15,17 +15,15 @@
*/
package org.apache.cocoon.components.treeprocessor.sitemap;
+import java.util.Collection;
+import java.util.Map;
+
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.cocoon.components.treeprocessor.AbstractProcessingNodeBuilder;
import org.apache.cocoon.components.treeprocessor.LinkedProcessingNodeBuilder;
import org.apache.cocoon.components.treeprocessor.ProcessingNode;
import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
-
-import org.apache.cocoon.reading.Reader;
import org.apache.cocoon.serialization.Serializer;
-
-import java.util.Collection;
-import java.util.Map;
/**
*
1.14 +7 -13 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
Index: SitemapLanguage.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- SitemapLanguage.java 15 Jul 2004 12:49:50 -0000 1.13
+++ SitemapLanguage.java 16 Jul 2004 12:36:45 -0000 1.14
@@ -79,21 +79,15 @@
config = new DefaultConfiguration("", "");
}
- CocoonComponentManager newManager = new CocoonComponentManager(new WrapperComponentManager(this.parentProcessorManager));
+ final LoggerManager loggerManager = (LoggerManager) this.parentProcessorManager.lookup(LoggerManager.ROLE);
+ CocoonComponentManager newManager = new CocoonComponentManager(new WrapperComponentManager(this.parentProcessorManager));
+
+ // Go through the component lifecycle
newManager.enableLogging(getLogger());
-
- final LoggerManager loggerManager = (LoggerManager) this.parentProcessorManager.lookup(LoggerManager.ROLE);
newManager.setLoggerManager(loggerManager);
-
- if (null != this.context ) {
- newManager.contextualize(this.context);
- }
-
- if (null != this.processorRoleManager) {
- newManager.setRoleManager(this.processorRoleManager);
- }
-
+ newManager.contextualize(this.context);
+ newManager.setRoleManager(this.ownRoleManager);
newManager.configure(config);
newManager.initialize();
1.8 +12 -37 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SwitchSelectNode.java
Index: SwitchSelectNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SwitchSelectNode.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SwitchSelectNode.java 15 Jul 2004 12:49:50 -0000 1.7
+++ SwitchSelectNode.java 16 Jul 2004 12:36:45 -0000 1.8
@@ -72,19 +72,18 @@
final Map objectModel = env.getObjectModel();
Parameters resolvedParams = VariableResolver.buildParameters(this.parameters, context, objectModel);
- // If selector is ThreadSafe, avoid select() and try/catch block (faster !)
- if (this.hasThreadSafeComponent()) {
-
- SwitchSelector switchSelector = (SwitchSelector)this.getThreadSafeComponent();
- Object ctx = switchSelector.getSelectorContext(objectModel, resolvedParams);
+ SwitchSelector switchSelector = (SwitchSelector)getComponent();
+ Object ctx = switchSelector.getSelectorContext(objectModel, resolvedParams);
+
+ try {
for (int i = 0; i < this.whenTests.length; i++) {
if (this.executor.invokeSwitchSelector(this,
- objectModel,
- switchSelector,
- whenTests[i].resolve(context, objectModel),
- resolvedParams,
- ctx)) {
+ objectModel,
+ switchSelector,
+ whenTests[i].resolve(context, objectModel),
+ resolvedParams,
+ ctx)) {
return invokeNodes(this.whenNodes[i], env, context);
}
}
@@ -94,32 +93,8 @@
}
return false;
-
- } else {
- SwitchSelector switchSelector = (SwitchSelector)this.selector.select(this.componentName);
-
- Object ctx = switchSelector.getSelectorContext(objectModel, resolvedParams);
-
- try {
- for (int i = 0; i < this.whenTests.length; i++) {
- if (this.executor.invokeSwitchSelector(this,
- objectModel,
- switchSelector,
- whenTests[i].resolve(context, objectModel),
- resolvedParams,
- ctx)) {
- return invokeNodes(this.whenNodes[i], env, context);
- }
- }
-
- if (this.otherwhiseNodes != null) {
- return invokeNodes(this.otherwhiseNodes, env, context);
- }
-
- return false;
- } finally {
- this.selector.release(selector);
- }
+ } finally {
+ releaseComponent(switchSelector);
}
}
}
1.9 +19 -21 cocoon-2.1/src/blocks/profiler/java/org/apache/cocoon/components/profiler/ProfilingCachingProcessingPipeline.java
Index: ProfilingCachingProcessingPipeline.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/profiler/java/org/apache/cocoon/components/profiler/ProfilingCachingProcessingPipeline.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ProfilingCachingProcessingPipeline.java 25 May 2004 07:28:24 -0000 1.8
+++ ProfilingCachingProcessingPipeline.java 16 Jul 2004 12:36:45 -0000 1.9
@@ -18,9 +18,9 @@
import java.io.IOException;
import java.util.Iterator;
-import org.apache.avalon.framework.component.ComponentException;
-import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.pipeline.impl.CachingProcessingPipeline;
import org.apache.cocoon.environment.Environment;
@@ -50,9 +50,9 @@
*
* @param manager
*/
- public void compose(ComponentManager manager) throws ComponentException {
+ public void service(ServiceManager manager) throws ServiceException {
- super.compose(manager);
+ super.service(manager);
this.profiler = (Profiler) manager.lookup(Profiler.ROLE);
}
@@ -211,24 +211,22 @@
}
this.data.setSetupTime(index++, System.currentTimeMillis()-time);
- String mimeType = this.serializer.getMimeType();
-
- if (mimeType!=null) {
- // we have a mimeType from the component itself
- environment.setContentType(mimeType);
- } else if (serializerMimeType!=null) {
- // there was a mimeType specified in the sitemap pipeline
+ // Set the mime-type
+ // the behaviour has changed from 2.1.x to 2.2 according to bug #10277
+ if (serializerMimeType != null) {
+ // there was a serializer defined in the sitemap
environment.setContentType(serializerMimeType);
- } else if (this.sitemapSerializerMimeType!=null) {
- // use the mimeType specified in the sitemap component declaration
- environment.setContentType(this.sitemapSerializerMimeType);
} else {
- // No mimeType available
- String message = "Unable to determine MIME type for "+
- environment.getURIPrefix()+"/"+
- environment.getURI();
-
- throw new ProcessingException(message);
+ // ask to the component itself
+ String mimeType = this.serializer.getMimeType();
+ if (mimeType != null) {
+ environment.setContentType (mimeType);
+ } else {
+ // No mimeType available
+ String message = "Unable to determine MIME type for " +
+ environment.getURIPrefix() + "/" + environment.getURI();
+ throw new ProcessingException(message);
+ }
}
} catch (SAXException e) {
throw new ProcessingException("Could not setup pipeline.", e);
1.9 +19 -21 cocoon-2.1/src/blocks/profiler/java/org/apache/cocoon/components/profiler/ProfilingNonCachingProcessingPipeline.java
Index: ProfilingNonCachingProcessingPipeline.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/profiler/java/org/apache/cocoon/components/profiler/ProfilingNonCachingProcessingPipeline.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ProfilingNonCachingProcessingPipeline.java 25 May 2004 07:28:24 -0000 1.8
+++ ProfilingNonCachingProcessingPipeline.java 16 Jul 2004 12:36:45 -0000 1.9
@@ -19,9 +19,9 @@
import java.util.Iterator;
import org.apache.avalon.framework.activity.Disposable;
-import org.apache.avalon.framework.component.ComponentException;
-import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline;
import org.apache.cocoon.environment.Environment;
@@ -55,9 +55,9 @@
*
* @param manager
*/
- public void compose(ComponentManager manager) throws ComponentException {
+ public void service(ServiceManager manager) throws ServiceException {
- super.compose(manager);
+ super.service(manager);
this.profiler = (Profiler) manager.lookup(Profiler.ROLE);
}
@@ -215,24 +215,22 @@
}
this.data.setSetupTime(index++, System.currentTimeMillis()-time);
- String mimeType = this.serializer.getMimeType();
-
- if (mimeType!=null) {
- // we have a mimeType from the component itself
- environment.setContentType(mimeType);
- } else if (serializerMimeType!=null) {
- // there was a mimeType specified in the sitemap pipeline
+ // Set the mime-type
+ // the behaviour has changed from 2.1.x to 2.2 according to bug #10277
+ if (serializerMimeType != null) {
+ // there was a serializer defined in the sitemap
environment.setContentType(serializerMimeType);
- } else if (this.sitemapSerializerMimeType!=null) {
- // use the mimeType specified in the sitemap component declaration
- environment.setContentType(this.sitemapSerializerMimeType);
} else {
- // No mimeType available
- String message = "Unable to determine MIME type for "+
- environment.getURIPrefix()+"/"+
- environment.getURI();
-
- throw new ProcessingException(message);
+ // ask to the component itself
+ String mimeType = this.serializer.getMimeType();
+ if (mimeType != null) {
+ environment.setContentType (mimeType);
+ } else {
+ // No mimeType available
+ String message = "Unable to determine MIME type for " +
+ environment.getURIPrefix() + "/" + environment.getURI();
+ throw new ProcessingException(message);
+ }
}
} catch (SAXException e) {
throw new ProcessingException("Could not setup pipeline.", e);
1.6 +4 -4 cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/pipeline/impl/ExpiresCachingProcessingPipeline.java
Index: ExpiresCachingProcessingPipeline.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/pipeline/impl/ExpiresCachingProcessingPipeline.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ExpiresCachingProcessingPipeline.java 15 Apr 2004 08:05:55 -0000 1.5
+++ ExpiresCachingProcessingPipeline.java 16 Jul 2004 12:36:45 -0000 1.6
@@ -20,9 +20,9 @@
import java.net.SocketException;
import java.util.Map;
-import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
import org.apache.cocoon.ConnectionResetException;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.caching.CachedResponse;
@@ -182,7 +182,7 @@
super.connectPipeline( environment );
this.lastConsumer = old;
- } catch ( ComponentException e ) {
+ } catch ( ServiceException e ) {
throw new ProcessingException("Could not connect pipeline.", e);
}
} else {
@@ -192,7 +192,7 @@
// we use the cache, so we need an xml deserializer
try {
this.xmlDeserializer = (XMLDeserializer)this.manager.lookup(XMLDeserializer.ROLE);
- } catch ( ComponentException e ) {
+ } catch ( ServiceException e ) {
throw new ProcessingException("Could not connect pipeline.", e);
}
}
1.6 +14 -14 cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolverTestCase.java
Index: PreparedVariableResolverTestCase.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolverTestCase.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- PreparedVariableResolverTestCase.java 6 May 2004 19:27:55 -0000 1.5
+++ PreparedVariableResolverTestCase.java 16 Jul 2004 12:36:46 -0000 1.6
@@ -50,7 +50,7 @@
Map sitemapElements = new HashMap();
context.pushMap("sitemap", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123", resolver.resolve(context, getObjectModel()));
}
@@ -65,7 +65,7 @@
Map sitemapElements = new HashMap();
sitemapElements.put("1", "oo");
context.pushMap("sitemap", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123", resolver.resolve(context, getObjectModel()));
}
@@ -78,7 +78,7 @@
Map sitemapElements = new HashMap();
sitemapElements.put("name", "123");
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123", resolver.resolve(context, getObjectModel()));
}
@@ -91,7 +91,7 @@
Map sitemapElements = new HashMap();
sitemapElements.put("1", "abc");
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123abc", resolver.resolve(context, getObjectModel()));
}
@@ -104,7 +104,7 @@
Map sitemapElements = new HashMap();
sitemapElements.put("1", "abc");
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123abc/def", resolver.resolve(context, getObjectModel()));
}
@@ -117,7 +117,7 @@
Map sitemapElements = new HashMap();
sitemapElements.put("1", "abc");
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("123abc/def", resolver.resolve(context, getObjectModel()));
}
@@ -136,7 +136,7 @@
sitemapElements.put("1", "oscar");
context.pushMap("label2", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("from juliet to oscar", resolver.resolve(context, getObjectModel()));
}
@@ -155,7 +155,7 @@
sitemapElements.put("1", "oscar");
context.pushMap("label2", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("from juliet to oscar", resolver.resolve(context, getObjectModel()));
}
@@ -169,7 +169,7 @@
sitemapElements = new HashMap();
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("http://cocoon.apache.org", resolver.resolve(context, getObjectModel()));
}
@@ -183,7 +183,7 @@
sitemapElements = new HashMap();
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals(":colon-starts-this", resolver.resolve(context, getObjectModel()));
}
@@ -198,7 +198,7 @@
sitemapElements.put("1", "abc");
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("abc:abc", resolver.resolve(context, getObjectModel()));
}
@@ -212,7 +212,7 @@
sitemapElements = new HashMap();
context.pushMap("label", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("This is a {brace}", resolver.resolve(context, getObjectModel()));
}
@@ -223,7 +223,7 @@
Map sitemapElements = new HashMap();
context.pushMap("sitemap", sitemapElements);
- PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ VariableResolver resolver = VariableResolverFactory.getResolver(expr, manager);
assertEquals("", resolver.resolve(context, getObjectModel()));
}
}