You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by da...@apache.org on 2005/05/02 00:01:25 UTC
svn commit: r165550 - in
/cocoon/trunk/src/java/org/apache/cocoon/components/blocks:
BlockManager.java BlocksManager.java core-components.xconf
Author: danielf
Date: Sun May 1 15:01:25 2005
New Revision: 165550
URL: http://svn.apache.org/viewcvs?rev=165550&view=rev
Log:
Made the BlockManager a processor that uses its own sitemap. Started to work on the BlocksManager, it creates and stores the BlockManagers and create a minimal parent component manager for them.
Added:
cocoon/trunk/src/java/org/apache/cocoon/components/blocks/core-components.xconf
Modified:
cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlockManager.java
cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlocksManager.java
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlockManager.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlockManager.java?rev=165550&r1=165549&r2=165550&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlockManager.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlockManager.java Sun May 1 15:01:25 2005
@@ -15,34 +15,54 @@
*/
package org.apache.cocoon.components.blocks;
-import java.io.IOException;
+import java.net.URL;
import java.util.HashMap;
import java.util.Map;
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.DefaultConfiguration;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.context.DefaultContext;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
+
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.Processor;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.components.container.CocoonServiceManager;
+import org.apache.cocoon.components.container.ComponentContext;
+import org.apache.cocoon.components.treeprocessor.TreeProcessor;
+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.xml.sax.SAXException;
/**
* @version SVN $Id$
*/
public class BlockManager
extends AbstractLogEnabled
- implements Configurable, Disposable, Serviceable {
+ implements Configurable, Contextualizable, Disposable, Initializable, Processor, Serviceable {
public static String ROLE = BlockManager.class.getName();
- private ServiceManager manager;
- private SourceResolver resolver;
+ private ServiceManager parentServiceManager;
+ private ServiceManager serviceManager;
+ private SourceResolver sourceResolver;
+ private DefaultContext context;
+ private Processor processor;
+ private EnvironmentHelper environmentHelper;
private String id;
private String location;
@@ -52,8 +72,11 @@
private Map properties = new HashMap();
public void service(ServiceManager manager) throws ServiceException {
- this.manager = manager;
- this.resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
+ this.parentServiceManager = manager;
+ }
+
+ public void contextualize(Context context) throws ContextException {
+ this.context = new ComponentContext(context);
}
public void configure(Configuration config)
@@ -91,31 +114,128 @@
// Read the block.xml file
String blockPath = this.location + "/COB-INF/block.xml";
+ SourceResolver resolver = null;
Source source = null;
Configuration block = null;
try {
- source = this.resolver.resolveURI(blockPath);
+ resolver =
+ (SourceResolver) this.parentServiceManager.lookup(SourceResolver.ROLE);
+ source = resolver.resolveURI(blockPath);
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
block = builder.build( source.getInputStream() );
- } catch (SAXException se) {
- String msg = "SAXException while reading " + blockPath + ": " + se.getMessage();
- throw new ConfigurationException(msg, se);
- } catch (IOException ie) {
- String msg = "IOException while reading " + blockPath + ": " + ie.getMessage();
- throw new ConfigurationException(msg, ie);
+ } catch (Exception e) {
+ String msg = "Exception while reading " + blockPath + ": " + e.getMessage();
+ throw new ConfigurationException(msg, e);
} finally {
- this.resolver.release(source);
+ if (resolver != null) {
+ resolver.release(source);
+ this.parentServiceManager.release(resolver);
+ }
}
this.sitemapPath = block.getChild("sitemap").getAttribute("src");
getLogger().debug("sitemapPath=" + this.sitemapPath);
}
+ public void initialize() throws Exception {
+ getLogger().debug("Initializing new Block Manager: " + this.id);
+
+ // A block is supposed to be an isolated unit so it should not have
+ // any direct access to the global root context
+ getLogger().debug("Root URL " +
+ ((URL) this.context.get(ContextHelper.CONTEXT_ROOT_URL)).toExternalForm());
+ String blockRoot =
+ ((URL) this.context.get(ContextHelper.CONTEXT_ROOT_URL)).toExternalForm() +
+ this.location;
+ this.context.put(ContextHelper.CONTEXT_ROOT_URL, new URL(blockRoot));
+ getLogger().debug("Block Root URL " +
+ ((URL) this.context.get(ContextHelper.CONTEXT_ROOT_URL)).toExternalForm());
+ this.context.makeReadOnly();
+
+ // Create an own service manager
+ this.serviceManager = new CocoonServiceManager(this.parentServiceManager);
+ ContainerUtil.enableLogging(this.serviceManager, this.getLogger());
+ ContainerUtil.contextualize(this.serviceManager, this.context);
+
+ // Hack to put a sitemap configuration for the main sitemap of
+ // the block into the service manager
+ getLogger().debug("Block Manager: create sitemap " + this.sitemapPath);
+ DefaultConfiguration sitemapConf =
+ new DefaultConfiguration("sitemap", "BlockManager sitemap: " + this.id +
+ " for " + this.sitemapPath);
+ sitemapConf.setAttribute("file", this.sitemapPath);
+ sitemapConf.setAttribute("check-reload", "yes");
+ // The source resolver must be defined in this service
+ // manager, otherwise the root path will be the one t“from the
+ // parent manager
+ DefaultConfiguration resolverConf =
+ new DefaultConfiguration("source-resolver", "BlockManager source resolver: " + this.id);
+ DefaultConfiguration conf =
+ new DefaultConfiguration("components", "BlockManager components: " + this.id);
+ conf.addChild(sitemapConf);
+ conf.addChild(resolverConf);
+
+ ContainerUtil.configure(this.serviceManager, conf);
+ ContainerUtil.initialize(this.serviceManager);
+
+ this.sourceResolver = (SourceResolver)this.serviceManager.lookup(SourceResolver.ROLE);
+ final Processor processor = EnvironmentHelper.getCurrentProcessor();
+ if ( processor != null ) {
+ getLogger().debug("processor context" + processor.getContext());
+ }
+ Source sitemapSrc = this.sourceResolver.resolveURI(this.sitemapPath);
+ getLogger().debug("Sitemap Source " + sitemapSrc.getURI());
+ this.sourceResolver.release(sitemapSrc);
+
+ // Get the Processor and keep it
+ this.processor = (Processor)this.serviceManager.lookup(Processor.ROLE);
+
+ this.environmentHelper = new EnvironmentHelper(
+ (URL)this.context.get(ContextHelper.CONTEXT_ROOT_URL));
+ ContainerUtil.enableLogging(this.environmentHelper, this.getLogger());
+ ContainerUtil.service(this.environmentHelper, this.serviceManager);
+ }
+
public void dispose() {
- if (this.manager != null) {
- this.manager.release(this.resolver);
- this.resolver = null;
- this.manager = null;
+ if (this.serviceManager != null) {
+ this.serviceManager.release(this.sourceResolver);
+ this.sourceResolver = null;
+ this.serviceManager = null;
+ }
+ this.parentServiceManager = null;
+ }
+
+ // The Processor methods
+
+ public boolean process(Environment environment) throws Exception {
+ EnvironmentHelper.enterProcessor(this, this.serviceManager, environment);
+ try {
+ return this.processor.process(environment);
+ } finally {
+ EnvironmentHelper.leaveProcessor();
}
+ }
+
+ public InternalPipelineDescription buildPipeline(Environment environment)
+ throws Exception {
+ return this.processor.buildPipeline(environment);
+ }
+
+ public Configuration[] getComponentConfigurations() {
+ return null;
+ }
+
+ // A block is supposed to be an isolated unit so it should not have
+ // any direct access to the global root sitemap
+ public Processor getRootProcessor() {
+ return this;
+ }
+
+ public org.apache.cocoon.environment.SourceResolver getSourceResolver() {
+ return this.environmentHelper;
+ }
+
+ public String getContext() {
+ return this.environmentHelper.getContext();
}
}
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlocksManager.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlocksManager.java?rev=165550&r1=165549&r2=165550&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlocksManager.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/blocks/BlocksManager.java Sun May 1 15:01:25 2005
@@ -16,12 +16,20 @@
package org.apache.cocoon.components.blocks;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
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.DefaultConfigurationBuilder;
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -29,6 +37,9 @@
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
+import org.apache.cocoon.components.container.CocoonServiceManager;
+import org.apache.cocoon.core.Core;
+import org.apache.cocoon.core.CoreUtil;
import org.apache.cocoon.ProcessingException;
import org.xml.sax.SAXException;
@@ -37,16 +48,25 @@
*/
public class BlocksManager
extends AbstractLogEnabled
- implements Configurable, Disposable, Serviceable, ThreadSafe {
+ implements Configurable, Contextualizable, Disposable, Initializable, Serviceable, ThreadSafe {
public static String ROLE = BlocksManager.class.getName();
-
- private ServiceManager manager;
+ public static String CORE_COMPONENTS_XCONF =
+ "resource://org/apache/cocoon/components/blocks/core-components.xconf";
+ private ServiceManager serviceManager;
private SourceResolver resolver;
+ private Context context;
+
+ private HashMap blockConfs = new HashMap();
+ private HashMap blocks = new HashMap();
public void service(ServiceManager manager) throws ServiceException {
- this.manager = manager;
- this.resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
+ this.serviceManager = manager;
+ this.resolver = (SourceResolver) this.serviceManager.lookup(SourceResolver.ROLE);
+ }
+
+ public void contextualize(Context context) throws ContextException {
+ this.context = context;
}
public void configure(Configuration config)
@@ -75,14 +95,58 @@
getLogger().debug("BlocksManager configure: " + block.getName() +
" id=" + block.getAttribute("id") +
" location=" + block.getAttribute("location"));
+ this.blockConfs.put(block.getAttribute("id"), block);
+ }
+ }
+
+ public void initialize() throws Exception {
+ getLogger().debug("Initializing the Blocks Manager");
+
+ // Create a root service manager for blocks. This should be
+ // the minimal number of components that are needed for any
+ // block. Only components that not are context dependent
+ // should be defined here. Block that depends on e.g. the root
+ // context path should be defined in the BlockManager instead.
+
+ Core core = (Core)this.serviceManager.lookup(Core.ROLE);
+ ServiceManager blockParentServiceManager =
+ new CoreUtil.RootServiceManager(null, core);
+ CocoonServiceManager blockServiceManager =
+ new CocoonServiceManager(blockParentServiceManager);
+ ContainerUtil.enableLogging(blockServiceManager, this.getLogger());
+ ContainerUtil.contextualize(blockServiceManager, this.context);
+
+ Source coreComponentsSource =
+ this.resolver.resolveURI(CORE_COMPONENTS_XCONF);
+ DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
+ Configuration coreComponentsConf =
+ builder.build( coreComponentsSource.getInputStream() );
+
+ ContainerUtil.configure(blockServiceManager, coreComponentsConf);
+ ContainerUtil.initialize(blockServiceManager);
+
+ // Create and store all blocks
+
+ Iterator confIter = this.blockConfs.entrySet().iterator();
+ while (confIter.hasNext()) {
+ Map.Entry entry = (Map.Entry)confIter.next();
+ Configuration blockConf = (Configuration)entry.getValue();
+ getLogger().debug("Creating " + blockConf.getName() +
+ " id=" + blockConf.getAttribute("id"));
+ BlockManager blockManager = new BlockManager();
+ ContainerUtil.enableLogging(blockManager, this.getLogger());
+ ContainerUtil.contextualize(blockManager, this.context);
+ ContainerUtil.configure(blockManager, blockConf);
+ ContainerUtil.initialize(blockManager);
+ this.blocks.put(entry.getKey(), blockManager);
}
}
public void dispose() {
- if (this.manager != null) {
- this.manager.release(this.resolver);
+ if (this.serviceManager != null) {
+ this.serviceManager.release(this.resolver);
this.resolver = null;
- this.manager = null;
+ this.serviceManager = null;
}
}
}
Added: cocoon/trunk/src/java/org/apache/cocoon/components/blocks/core-components.xconf
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/blocks/core-components.xconf?rev=165550&view=auto
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/blocks/core-components.xconf (added)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/blocks/core-components.xconf Sun May 1 15:01:25 2005
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!--
+ Copyright 1999-2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<cocoon version="2.2">
+
+ <include src="resource://org/apache/cocoon/cocoon.roles"/>
+
+ <xml-parser class="org.apache.excalibur.xml.impl.JaxpParser">
+ <parameter name="validate" value="false"/>
+ <parameter name="namespace-prefixes" value="false"/>
+ <parameter name="stop-on-warning" value="true"/>
+ <parameter name="stop-on-recoverable-error" value="true"/>
+ <parameter name="reuse-parsers" value="false"/>
+ </xml-parser>
+
+ <xmlizer/>
+
+ <source-resolver/>
+
+ <fam/>
+
+ <source-factories>
+ <component-instance class="org.apache.excalibur.source.impl.ResourceSourceFactory" name="resource"/>
+ <component-instance class="org.apache.cocoon.components.source.impl.ContextSourceFactory" name="context"/>
+ <component-instance class="org.apache.excalibur.source.impl.FileSourceFactory" name="file"/>
+ <component-instance class="org.apache.excalibur.source.impl.URLSourceFactory" name="*"/>
+ </source-factories>
+
+</cocoon>