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 2001/10/25 12:34:00 UTC
cvs commit: xml-cocoon2/src/org/apache/cocoon/sitemap SitemapManager.java Manager.java
sylvain 01/10/25 03:34:00
Modified: . changes.xml
src/org/apache/cocoon Cocoon.java Processor.java
cocoon.roles
src/org/apache/cocoon/sitemap Manager.java
Added: src/org/apache/cocoon/sitemap SitemapManager.java
Log:
The sitemap engine is now a regular component available through Processor.ROLE. This allows alternative implementations of Processors (e.g. interpreted sitemap, flowmap, statemap) to be plugged through cocoon.xconf.
Note : to ensure compatibility with existing cocoon.xconf files, the shorthand for the Processor role is "sitemap".
Revision Changes Path
1.45 +7 -1 xml-cocoon2/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/changes.xml,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- changes.xml 2001/10/22 13:14:06 1.44
+++ changes.xml 2001/10/25 10:34:00 1.45
@@ -4,7 +4,7 @@
<!--
History of Cocoon changes
- $Id: changes.xml,v 1.44 2001/10/22 13:14:06 sylvain Exp $
+ $Id: changes.xml,v 1.45 2001/10/25 10:34:00 sylvain Exp $
-->
<changes title="History of Changes">
@@ -26,6 +26,12 @@
</devs>
<release version="2.1-dev" date="@date@">
+ <action dev="SW" type="update">
+ The sitemap engine is now a regular component available through Processor.ROLE. This allows
+ alternative implementations of Processors (e.g. interpreted sitemap, flowmap, statemap) to
+ be plugged through cocoon.xconf. Note : to ensure compatibility with existing cocoon.xconf
+ files, the shorthand for the Processor role is "sitemap".
+ </action>
<action dev="SW" type="add">
Deprecation of CodeFactory in preparation of the tree traversal implementation of the sitemap.
All factory-based matchers have been rewritten using the new PreparableMatcher interface, and
1.31 +51 -93 xml-cocoon2/src/org/apache/cocoon/Cocoon.java
Index: Cocoon.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Cocoon.java,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- Cocoon.java 2001/10/11 07:28:15 1.30
+++ Cocoon.java 2001/10/25 10:34:00 1.31
@@ -38,8 +38,7 @@
import org.apache.cocoon.environment.ModifiableSource;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.Session;
-import org.apache.cocoon.sitemap.AbstractSitemap;
-import org.apache.cocoon.sitemap.Manager;
+import org.apache.cocoon.sitemap.SitemapManager;
import org.apache.cocoon.util.ClassUtils;
import org.xml.sax.InputSource;
@@ -57,7 +56,7 @@
* @author <a href="mailto:fumagalli@exoffice.com">Pierpaolo Fumagalli</a> (Apache Software Foundation, Exoffice Technologies)
* @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
* @author <a href="mailto:leo.sutic@inspireinfrastructure.com">Leo Sutic</a>
- * @version CVS $Revision: 1.30 $ $Date: 2001/10/11 07:28:15 $
+ * @version CVS $Revision: 1.31 $ $Date: 2001/10/25 10:34:00 $
*/
public class Cocoon
extends AbstractLoggable
@@ -76,15 +75,9 @@
/** The configuration file */
private ModifiableSource configurationFile;
- /** The sitemap file */
- private String sitemapFileName;
-
/** The configuration tree */
private Configuration configuration;
- /** The sitemap manager */
- private Manager sitemapManager;
-
/** The logkit manager */
private LogKitManager logKitManager;
@@ -94,12 +87,6 @@
/** The working directory (null if not available) */
private File workDir;
- /** Check reloading of sitemap */
- private boolean checkSitemapReload = true;
-
- /** reload sitemap asynchron */
- private boolean reloadSitemapAsynchron = true;
-
/** The component manager. */
public ExcaliburComponentManager componentManager;
@@ -114,6 +101,9 @@
/** maximum request count */
private static int maxRequestCount = 0;
+
+ /** the Processor if it is ThreadSafe */
+ private Processor threadSafeProcessor = null;
/** Create a new <code>Cocoon</code> instance. */
public Cocoon() throws ConfigurationException {
@@ -199,26 +189,16 @@
this.componentManager.initialize();
- getLogger().debug("Setting up the sitemap.");
- // Create the sitemap
- Configuration sconf = conf.getChild("sitemap");
- this.sitemapManager = new Manager();
- this.sitemapManager.setLogger(getLogger());
- this.sitemapManager.contextualize(this.context);
- this.sitemapManager.compose(this.componentManager);
- this.sitemapManager.configure(conf);
- this.sitemapFileName = sconf.getAttribute("file");
- if (this.sitemapFileName == null) {
- getLogger().error("No sitemap file name");
- throw new ConfigurationException("No sitemap file name\n" + conf.toString());
- }
- String value = sconf.getAttribute("check-reload", "yes");
- this.checkSitemapReload = !(value != null && value.equalsIgnoreCase("no") == true);
- value = sconf.getAttribute("reload-method", "asynchron");
- this.reloadSitemapAsynchron = !(value != null && value.equalsIgnoreCase("synchron") == true);
- getLogger().debug("Sitemap location = " + this.sitemapFileName);
- getLogger().debug("Checking sitemap reload = " + this.checkSitemapReload);
- getLogger().debug("Reloading sitemap asynchron = " + this.reloadSitemapAsynchron);
+ // Get the Processor and keep it if it's ThreadSafe
+ Processor processor = (Processor)this.componentManager.lookup(Processor.ROLE);
+ if (processor instanceof ThreadSafe) {
+ getLogger().debug("Processor of class " + processor.getClass().getName() + " is ThreadSafe");
+ this.threadSafeProcessor = processor;
+ } else {
+ getLogger().debug("Processor of class " + processor.getClass().getName() +
+ " is NOT ThreadSafe -- will be looked up at each request");
+ this.componentManager.release(processor);
+ }
// Start the database server
Server server = null;
@@ -236,6 +216,7 @@
} finally {
this.componentManager.release(server);
}
+
}
/** Dump System Properties */
@@ -257,7 +238,6 @@
public Configuration configure(ExcaliburComponentManager startupManager) throws ConfigurationException, ContextException {
Parser p = null;
Configuration roleConfig = null;
- Configuration sitemapConfig = null;
try {
this.configurationFile.refresh();
@@ -282,27 +262,6 @@
roleConfig = null;
try {
- this.configurationFile.refresh();
- p = (Parser)startupManager.lookup(Parser.ROLE);
- SAXConfigurationHandler b = new SAXConfigurationHandler();
- InputStream inputStream = ClassUtils.getResource("org/apache/cocoon/sitemap/sitemap.roles").openStream();
- InputSource is = new InputSource(inputStream);
- is.setSystemId(this.configurationFile.getSystemId());
- p.setContentHandler(b);
- p.parse(is);
- sitemapConfig = b.getConfiguration();
- } catch (Exception e) {
- getLogger().error("Could not configure Cocoon environment", e);
- throw new ConfigurationException("Error trying to load configurations", e);
- } finally {
- if (p != null) startupManager.release(p);
- }
-
- DefaultRoleManager sitemapRoleManager = new DefaultRoleManager();
- sitemapRoleManager.setLogger(getLogger());
- sitemapRoleManager.configure(sitemapConfig);
-
- try {
p = (Parser)startupManager.lookup(Parser.ROLE);
SAXConfigurationHandler b = new SAXConfigurationHandler();
InputSource is = this.configurationFile.getInputSource();
@@ -318,9 +277,6 @@
Configuration conf = this.configuration;
- AbstractSitemap.setRoleManager(sitemapRoleManager, conf);
- AbstractSitemap.setLogKitManager(this.logKitManager);
-
getLogger().debug("Root configuration: " + conf.getName());
if (! "cocoon".equals(conf.getName())) {
throw new ConfigurationException("Invalid configuration file\n" + conf.toString());
@@ -363,10 +319,6 @@
getLogger().debug("Setting up components...");
this.componentManager.configure(conf);
- // adding the processor itself to the available components
- // we need a wrapper to avoid infinite dispose loops
- this.componentManager.addComponentInstance(Processor.ROLE, new ProcessorWrapper(this));
-
return conf;
}
@@ -400,6 +352,7 @@
}
public void dispose() {
+ this.componentManager.release(this.threadSafeProcessor);
this.componentManager.dispose();
if (this.configurationFile != null)
this.configurationFile.recycle();
@@ -506,17 +459,28 @@
throws Exception {
if (disposed) throw new IllegalStateException("You cannot process a Disposed Cocoon engine.");
- try {
+ try {
if (this.getLogger().isDebugEnabled()) {
incRequestCount();
this.debug(environment, null, null);
}
- return this.sitemapManager.invoke(this.componentManager, environment, "", this.sitemapFileName, this.checkSitemapReload, this.reloadSitemapAsynchron);
+
+ if (this.threadSafeProcessor != null) {
+ return this.threadSafeProcessor.process(environment);
+ } else {
+ Processor processor = (Processor)this.componentManager.lookup(Processor.ROLE);
+ try {
+ return processor.process(environment);
+ }
+ finally {
+ this.componentManager.release(processor);
+ }
+ }
} finally {
if (this.getLogger().isDebugEnabled()) {
decRequestCount();
}
- }
+ }
}
/**
@@ -527,50 +491,44 @@
throws Exception {
if (disposed) throw new IllegalStateException("You cannot process a Disposed Cocoon engine.");
- try {
+ try {
if (this.getLogger().isDebugEnabled()) {
incRequestCount();
this.debug(environment, pipeline, eventPipeline);
+ }
+
+ if (this.threadSafeProcessor != null) {
+ return this.threadSafeProcessor.process(environment, pipeline, eventPipeline);
+ } else {
+ Processor processor = (Processor)this.componentManager.lookup(Processor.ROLE);
+ try {
+ return processor.process(environment);
+ }
+ finally {
+ this.componentManager.release(processor);
+ }
}
- return this.sitemapManager.invoke(this.componentManager, environment, "", this.sitemapFileName, this.checkSitemapReload, this.reloadSitemapAsynchron, pipeline, eventPipeline);
+
} finally {
if (this.getLogger().isDebugEnabled()) {
decRequestCount();
}
- }
+ }
}
/**
* Process the given <code>Environment</code> to generate the sitemap.
+ * Delegated to the Processor component if it's a <code>SitemapManager</code>.
*/
public void generateSitemap(Environment environment)
throws Exception {
- ProgramGenerator programGenerator = null;
- SourceHandler oldSourceHandler = environment.getSourceHandler();
- SourceHandler sourceHandler = null;
+ Component processor = this.componentManager.lookup(Processor.ROLE);
try {
- programGenerator = (ProgramGenerator) this.componentManager.lookup(ProgramGenerator.ROLE);
- sourceHandler = (SourceHandler) this.componentManager.lookup(SourceHandler.ROLE);
- environment.setSourceHandler(sourceHandler);
- String markupLanguage = "sitemap";
- String programmingLanguage = "java";
-
- getLogger().debug("Sitemap regeneration begin:" + sitemapFileName);
- CompiledComponent smap = programGenerator.load(this.componentManager, sitemapFileName, markupLanguage, programmingLanguage, environment);
- getLogger().debug("Sitemap regeneration complete");
-
- if (smap != null) {
- getLogger().debug("Main: The sitemap has been successfully compiled!");
- } else {
- getLogger().debug("Main: No errors, but the sitemap has not been set.");
+ if (processor instanceof SitemapManager) {
+ ((SitemapManager)processor).generateSitemap(environment);
}
- } catch (Exception e) {
- getLogger().error("Main: Error compiling sitemap", e);
- throw e;
} finally {
- environment.setSourceHandler(oldSourceHandler);
- if (programGenerator != null) this.componentManager.release(programGenerator);
- if (sourceHandler != null) this.componentManager.release((Component) sourceHandler);
+ this.componentManager.release(processor);
}
}
1.6 +3 -2 xml-cocoon2/src/org/apache/cocoon/Processor.java
Index: Processor.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Processor.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Processor.java 2001/10/11 07:28:15 1.5
+++ Processor.java 2001/10/25 10:34:00 1.6
@@ -7,6 +7,7 @@
*****************************************************************************/
package org.apache.cocoon;
+import org.apache.avalon.framework.component.Component;
import org.apache.cocoon.components.pipeline.EventPipeline;
import org.apache.cocoon.components.pipeline.StreamPipeline;
import org.apache.cocoon.environment.Environment;
@@ -15,9 +16,9 @@
*
* @author <a href="mailto:fumagalli@exoffice.com">Pierpaolo Fumagalli</a>
* (Apache Software Foundation, Exoffice Technologies)
- * @version CVS $Revision: 1.5 $ $Date: 2001/10/11 07:28:15 $
+ * @version CVS $Revision: 1.6 $ $Date: 2001/10/25 10:34:00 $
*/
-public interface Processor {
+public interface Processor extends Component {
String ROLE = "org.apache.cocoon.Processor";
1.25 +5 -0 xml-cocoon2/src/org/apache/cocoon/cocoon.roles
Index: cocoon.roles
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/cocoon.roles,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- cocoon.roles 2001/10/23 11:55:19 1.24
+++ cocoon.roles 2001/10/25 10:34:00 1.25
@@ -17,8 +17,13 @@
shorthand="browser"
default-class="org.apache.cocoon.components.browser.BrowserImpl"/>
+<!-- For backwards compatibility, the shorthand for this role is "sitemap"
<role name="org.apache.cocoon.Processor"
shorthand="processor"/>
+-->
+ <role name="org.apache.cocoon.Processor"
+ shorthand="sitemap"
+ default-class="org.apache.cocoon.sitemap.SitemapManager"/>
<role name="org.apache.cocoon.components.store.Store"
shorthand="store"
1.20 +9 -8 xml-cocoon2/src/org/apache/cocoon/sitemap/Manager.java
Index: Manager.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/Manager.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- Manager.java 2001/10/17 10:06:24 1.19
+++ Manager.java 2001/10/25 10:34:00 1.20
@@ -16,6 +16,7 @@
import org.apache.avalon.framework.component.Composable;
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.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
@@ -34,27 +35,27 @@
* checking regeneration of the sub <code>Sitemap</code>
*
* @author <a href="mailto:Giacomo.Pati@pwr.ch">Giacomo Pati</a>
- * @version CVS $Revision: 1.19 $ $Date: 2001/10/17 10:06:24 $
+ * @version CVS $Revision: 1.20 $ $Date: 2001/10/25 10:34:00 $
*/
public class Manager
extends AbstractLoggable
implements Component, Configurable, Composable, Contextualizable, ThreadSafe, LogKitManageable {
- private Context context;
+ protected Context context;
/** The vectors of sub sitemaps */
- private HashMap sitemaps = new HashMap();
+ protected HashMap sitemaps = new HashMap();
/** The configuration */
- private Configuration conf;
+ protected Configuration conf;
/** The component manager */
- private ComponentManager manager;
+ protected ComponentManager manager;
/** The sitemap role manager */
- private RoleManager sitemapRoles;
+ protected RoleManager sitemapRoles;
/** The sitemap logkit manager */
- private LogKitManager sitemapLogKitManager;
+ protected LogKitManager sitemapLogKitManager;
/**
@@ -74,7 +75,7 @@
/** get a configuration
* @param conf the configuration
*/
- public void configure(Configuration conf) {
+ public void configure(Configuration conf) throws ConfigurationException {
this.conf = conf;
}
1.1 xml-cocoon2/src/org/apache/cocoon/sitemap/SitemapManager.java
Index: SitemapManager.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.sitemap;
import org.apache.avalon.excalibur.component.RoleManager;
import org.apache.avalon.excalibur.logger.LogKitManager;
import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.framework.component.ComponentManager;
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.SAXConfigurationHandler;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Processor;
import org.apache.cocoon.components.language.generator.CompiledComponent;
import org.apache.cocoon.components.language.generator.ProgramGenerator;
import org.apache.cocoon.components.parser.Parser;
import org.apache.cocoon.components.pipeline.EventPipeline;
import org.apache.cocoon.components.pipeline.StreamPipeline;
import org.apache.cocoon.components.source.SourceHandler;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.util.ClassUtils;
import org.xml.sax.InputSource;
import java.io.InputStream;
/**
* A <code>Processor</code> based on sitemap language files compiled
* to Java code.
*
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
* @version CVS $Revision: 1.1 $ $Date: 2001/10/25 10:34:00 $
*/
public class SitemapManager extends Manager implements Processor, Configurable {
/** The sitemap file */
private String sitemapFileName;
/** Check reloading of sitemap */
private boolean checkSitemapReload = true;
/** reload sitemap asynchron */
private boolean reloadSitemapAsynchron = true;
public void configure(Configuration sconf) throws ConfigurationException {
super.configure(sconf);
this.sitemapFileName = sconf.getAttribute("file");
String value = sconf.getAttribute("check-reload", "yes");
this.checkSitemapReload = !(value != null && value.equalsIgnoreCase("no") == true);
value = sconf.getAttribute("reload-method", "asynchron");
this.reloadSitemapAsynchron = !(value != null && value.equalsIgnoreCase("synchron") == true);
getLogger().debug("Sitemap location = " + this.sitemapFileName);
getLogger().debug("Checking sitemap reload = " + this.checkSitemapReload);
getLogger().debug("Reloading sitemap asynchron = " + this.reloadSitemapAsynchron);
System.err.println("Sitemap location = " + this.sitemapFileName);
System.err.println("Checking sitemap reload = " + this.checkSitemapReload);
System.err.println("Reloading sitemap asynchron = " + this.reloadSitemapAsynchron);
// Read sitemap roles
Parser p = null;
Configuration rolesConfig;
try {
p = (Parser)this.manager.lookup(Parser.ROLE);
SAXConfigurationHandler b = new SAXConfigurationHandler();
InputStream inputStream = ClassUtils.getResource("org/apache/cocoon/sitemap/sitemap.roles").openStream();
InputSource is = new InputSource(inputStream);
is.setSystemId("org/apache/cocoon/sitemap/sitemap.roles");
p.setContentHandler(b);
p.parse(is);
rolesConfig = b.getConfiguration();
} catch (Exception e) {
getLogger().error("Could not configure Cocoon environment", e);
throw new ConfigurationException("Error trying to load configurations", e);
} finally {
this.manager.release(p);
}
DefaultRoleManager sitemapRoleManager = new DefaultRoleManager();
sitemapRoleManager.setLogger(getLogger());
sitemapRoleManager.configure(rolesConfig);
AbstractSitemap.setRoleManager(sitemapRoleManager, sconf);
AbstractSitemap.setLogKitManager(this.sitemapLogKitManager);
}
/**
* Process the given <code>Environment</code> to generate the sitemap.
*/
public void generateSitemap(Environment environment)
throws Exception {
ProgramGenerator programGenerator = null;
SourceHandler oldSourceHandler = environment.getSourceHandler();
SourceHandler sourceHandler = null;
try {
programGenerator = (ProgramGenerator) this.manager.lookup(ProgramGenerator.ROLE);
sourceHandler = (SourceHandler) this.manager.lookup(SourceHandler.ROLE);
environment.setSourceHandler(sourceHandler);
String markupLanguage = "sitemap";
String programmingLanguage = "java";
getLogger().debug("Sitemap regeneration begin:" + sitemapFileName);
CompiledComponent smap = programGenerator.load(this.manager, sitemapFileName, markupLanguage, programmingLanguage, environment);
getLogger().debug("Sitemap regeneration complete");
if (smap != null) {
getLogger().debug("Main: The sitemap has been successfully compiled!");
} else {
getLogger().debug("Main: No errors, but the sitemap has not been set.");
}
} catch (Exception e) {
getLogger().error("Main: Error compiling sitemap", e);
throw e;
} finally {
environment.setSourceHandler(oldSourceHandler);
if (programGenerator != null) this.manager.release(programGenerator);
if (sourceHandler != null) this.manager.release(sourceHandler);
}
}
/**
* Process the given <code>Environment</code> producing the output.
*/
public boolean process(Environment environment) throws Exception {
return this.invoke(this.manager, environment, "", this.sitemapFileName, this.checkSitemapReload, this.reloadSitemapAsynchron);
}
/**
* Process the given <code>Environment</code> to assemble
* a <code>StreamPipeline</code> and an <code>EventPipeline</code>.
*/
public boolean process(Environment environment, StreamPipeline pipeline, EventPipeline eventPipeline) throws Exception {
return this.invoke(this.manager, environment, "", this.sitemapFileName, this.checkSitemapReload, this.reloadSitemapAsynchron, 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