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 2007/01/07 17:34:53 UTC

svn commit: r493767 - in /cocoon/trunk/core: cocoon-pipeline/cocoon-pipeline-impl/ cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/ cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/...

Author: danielf
Date: Sun Jan  7 08:34:52 2007
New Revision: 493767

URL: http://svn.apache.org/viewvc?view=rev&rev=493767
Log:
Added handling of pipeline component info for Spring managed components. And refactored the previous mechanism to make it possible.
* ProcessorComponentInfo -> PipelineComponentInfo and moved from the sitemap-impl to the pipeline-impl module. This was necessary for being able to add the component info to the pipeline components, without depending on the sitemap modules.
* Component info is added to the pipeline components by inserting the decoration element:
    <pipeline:component mime-type="text/xml" label="foo" hint="bar"/>
* The decoration element setup the pipeline component to depend on an initializer bean that in turn puts the component info into the PipelineComponentInfo bean.
* The BridgeElementParser, (that handle Avalon definitions) is refactored to use the inititializer bean.

Added:
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/PipelineComponentInfo.java
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoFactoryBean.java
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializer.java
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializerDecorator.java
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java   (with props)
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers   (with props)
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas   (with props)
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd
Removed:
    cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java
    cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/ProcessorComponentInfoFactoryBean.java
Modified:
    cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/pom.xml
    cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
    cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/BridgeElementParser.java

Modified: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/pom.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/pom.xml?view=diff&rev=493767&r1=493766&r2=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/pom.xml (original)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/pom.xml Sun Jan  7 08:34:52 2007
@@ -130,6 +130,12 @@
       <artifactId>jakarta-regexp</artifactId>
       <version>1.4</version>
     </dependency>
+    <!-- Spring Framework -->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+      <version>2.0.1</version>
+    </dependency>   
     <dependency>
       <groupId>xml-apis</groupId>
       <artifactId>xml-apis</artifactId>

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/PipelineComponentInfo.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/PipelineComponentInfo.java?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/PipelineComponentInfo.java (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/components/pipeline/impl/PipelineComponentInfo.java Sun Jan  7 08:34:52 2007
@@ -0,0 +1,203 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.cocoon.components.pipeline.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.cocoon.generation.Generator;
+import org.apache.cocoon.reading.Reader;
+import org.apache.cocoon.serialization.Serializer;
+import org.apache.cocoon.transformation.Transformer;
+
+/**
+ * Holds informations defined in &lt;map:components&gt; such as default hint, labels and mime-types
+ * that are needed when building a processor and to manage inheritance when building child processors.
+ * <p>
+ * In previous versions of the sitemap engine, these informations where store in specialized
+ * extensions of ComponentSelector (<code>SitemapComponentSelector</code> and
+ * <code>OutputComponentSelector</code>), which led to a strong dependency on the chosen component
+ * container implementation. This is now a regular component that also "listens" to modifications
+ * of the service manager when it is built.
+ * 
+ * @version $Id: ProcessorComponentInfo.java 490762 2006-12-28 17:03:53Z danielf $
+ */
+public class PipelineComponentInfo {
+
+    /** The role to lookup this component. */
+    public static final String ROLE = PipelineComponentInfo.class.getName();
+    
+    protected static final String GENERATOR_PREFIX = Generator.ROLE + "/";
+    protected static final String TRANSFORMER_PREFIX = Transformer.ROLE + "/";
+    protected static final String SERIALIZER_PREFIX = Serializer.ROLE + "/";
+    protected static final String READER_PREFIX = Reader.ROLE + "/";
+    
+    /** Component info for the parent processor */
+    protected PipelineComponentInfo parent;
+    
+    /** Lock that prevents further modification */
+    protected boolean locked = false;
+    
+    /**
+     * 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.
+     */
+    private Map data;
+    
+    public PipelineComponentInfo(PipelineComponentInfo parent) {
+        this.parent = parent;
+    }
+    
+    /**
+     * Grabs on the fly the sitemap-related information on generators, transformers,
+     * serializers and readers when they're declared in the <code>ServiceManager</code>.
+     * <p>
+     * This method is triggered when a component is added on a <code>CocoonServiceManager</code>.
+     * 
+     * @param role the component's role
+     * @param clazz the component's class
+     * @param config the component's configuration
+     */
+    public void componentAdded(String role, String clazz, Configuration config) {
+        if (role.startsWith(GENERATOR_PREFIX)) {
+            setupLabelAndPipelineHint(role, config);
+
+        } else if (role.startsWith(TRANSFORMER_PREFIX)) {
+            setupLabelAndPipelineHint(role, config);
+
+        } else if (role.startsWith(SERIALIZER_PREFIX)) {
+            setupLabelAndPipelineHint(role, config);
+            setupMimeType(role, config);
+
+        } else if (role.startsWith(READER_PREFIX)) {
+            setupMimeType(role, config);
+        }
+    }
+    
+    protected void setupLabelAndPipelineHint(String role, Configuration config) {
+
+        // Labels
+        String label = config.getAttribute("label", null);
+        if (label != null) {
+            StringTokenizer st = new StringTokenizer(label, " ,", false);
+            String[] labels = new String[st.countTokens()];
+            for (int tokenIdx = 0; tokenIdx < labels.length; tokenIdx++) {
+                labels[tokenIdx] = st.nextToken();
+            }
+            setLabels(role, labels);
+        } else {
+            // Set no labels, overriding those defined in the parent sitemap, if any
+            setLabels(role, null);
+        }
+
+        // Pipeline hints
+        String pipelineHint = config.getAttribute("hint", null);
+        setPipelineHint(role, pipelineHint);
+    }
+
+    protected void setupMimeType(String role, Configuration config) {
+        setMimeType(role, config.getAttribute("mime-type", null));
+    }
+
+    /** Store some data, creating the storage map if needed */
+    private void setData(String key, Object value) {
+        if (locked) throw new IllegalStateException("ProcessorComponentInfo is locked");
+        if (this.data == null) this.data = new HashMap();
+        this.data.put(key, value);
+    }
+    
+    /** Get some data, asking the parent if needed */
+    private Object getData(String key) {
+        // Need to check containsKey as the default hint may be unspecified (i.e. no "default" attribute)
+        if (this.data != null && this.data.containsKey(key)) {
+            return this.data.get(key);
+        } else if (this.parent != null) {
+            // Ask parent
+            return this.parent.getData(key);
+        } else {
+            return null;
+        }
+    }
+    
+    /**
+     * Lock this component info object at the end of processor building to prevent
+     * any further changes.
+     */
+    public void lock() {
+        this.locked = true;
+    }
+    
+    public void setDefaultType(String role, String hint) {
+        setData("defaultType/" + role, hint);
+    }
+    
+    public String getDefaultType(String role) {
+        return (String)getData("defaultType/" + role);
+    }
+    
+    public void setPipelineHint(String role, String hint) {
+        setData("pipelineHint/" + role, hint);
+    }
+    
+    public String getPipelineHint(String role, String type) {
+        return (String)getData("pipelineHint/" + role + "/" + type);
+    }
+    
+    public void setMimeType(String role, String mimeType) {
+        setData("mimeType/" + role, mimeType);
+    }
+    
+    public String getMimeType(String role, String type) {
+        return (String)getData("mimeType/" + role + "/" + type);
+    }
+    
+    public void setLabels(String role, String[] labels) {
+        setData("labels/" + role, labels);
+    }
+    
+    public String[] getLabels(String role, String type) {
+        return (String[])getData("labels/" + role + "/" + type);
+    }
+    
+    public boolean hasLabel(String role, String type, String label) {
+        String[] labels = this.getLabels(role, type);
+        if (labels != null) {
+            for (int i = 0; i < labels.length; i++) {
+                if (labels[i].equals(label))
+                    return true;
+            }
+        }
+        return false;
+    }
+
+    public Map getData() {
+        return this.data;
+    }
+
+    public void setData(Map map) {
+        this.data = map;
+    }
+    
+    public void addData(Map map) {
+        if (this.data == null)
+            this.data = map;
+        else
+            this.data.putAll(map);
+    }
+}
\ No newline at end of file

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoFactoryBean.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoFactoryBean.java?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoFactoryBean.java (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoFactoryBean.java Sun Jan  7 08:34:52 2007
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.cocoon.core.container.spring.pipeline;
+
+import java.util.Map;
+
+import org.apache.cocoon.components.pipeline.impl.PipelineComponentInfo;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.HierarchicalBeanFactory;
+
+/**
+ * This spring factory bean adds the processor component info to the bean factory.
+ *
+ * @since 2.2
+ * @version $Id: ProcessorComponentInfoFactoryBean.java 448473 2006-09-21 06:22:51Z crossley $
+ */
+public class PipelineComponentInfoFactoryBean
+    implements FactoryBean, BeanFactoryAware {
+
+    /** The bean factory. */
+    protected BeanFactory beanFactory;
+
+    protected Map data;
+
+    protected PipelineComponentInfo info;
+
+    /**
+     * @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)
+     */
+    public void setBeanFactory(BeanFactory factory) throws BeansException {
+        this.beanFactory = factory;
+    }
+
+    protected void init()
+    throws Exception {
+        PipelineComponentInfo parent = null;
+        if ( this.beanFactory instanceof HierarchicalBeanFactory ) {
+            BeanFactory parentFactory = ((HierarchicalBeanFactory)this.beanFactory).getParentBeanFactory();
+            if ( parentFactory != null && parentFactory.containsBean(PipelineComponentInfo.ROLE) ) {
+                parent = (PipelineComponentInfo)parentFactory.getBean(PipelineComponentInfo.ROLE);
+            }
+        }
+        this.info = new PipelineComponentInfo(parent);
+        if ( this.data != null ) {
+            info.setData(data);
+        }
+    }
+
+    /**
+     * @see org.springframework.beans.factory.FactoryBean#getObject()
+     */
+    public Object getObject() throws Exception {
+        return this.info;
+    }
+
+    /**
+     * @see org.springframework.beans.factory.FactoryBean#getObjectType()
+     */
+    public Class getObjectType() {
+        return PipelineComponentInfo.class;
+    }
+
+    /**
+     * @see org.springframework.beans.factory.FactoryBean#isSingleton()
+     */
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public Map getData() {
+        return data;
+    }
+
+    public void setData(Map data) {
+        this.data = data;
+    }
+}

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializer.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializer.java?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializer.java (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializer.java Sun Jan  7 08:34:52 2007
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.cocoon.core.container.spring.pipeline;
+
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.apache.cocoon.components.pipeline.impl.PipelineComponentInfo;
+
+
+/**
+ * @version $Id$
+ * @since 2.2
+ */
+public class PipelineComponentInfoInitializer {
+    private PipelineComponentInfo info;
+    private String componentName;
+    private String mimeType;
+    private String label;
+    private String hint;
+    private Map data;
+    
+    public void init() {
+        if (this.mimeType != null)
+            this.info.setMimeType(this.componentName, this.mimeType);
+        if (this.label != null) {
+            StringTokenizer st = new StringTokenizer(this.label, " ,", false);
+            String[] labels = new String[st.countTokens()];
+            for (int tokenIdx = 0; tokenIdx < labels.length; tokenIdx++) {
+                labels[tokenIdx] = st.nextToken();
+            }
+            this.info.setLabels(this.componentName, labels);
+        }
+        if (this.hint != null)
+            this.info.setPipelineHint(this.componentName, this.hint);
+        if (this.data != null)
+            this.info.addData(data);
+    }
+
+    /**
+     * @param info
+     */
+    public void setInfo(PipelineComponentInfo info) {
+        this.info = info;
+    }
+
+    /**
+     * @param componentName
+     */
+    public void setComponentName(String componentName) {
+        this.componentName = componentName;
+    }
+    /**
+     * @param hint
+     */
+    public void setHint(String hint) {
+        this.hint = hint;
+    }
+    /**
+     * @param label
+     */
+    public void setLabel(String label) {
+        this.label = label;
+    }
+    /**
+     * @param mimeType
+     */
+    public void setMimeType(String mimeType) {
+        this.mimeType = mimeType;
+    }
+
+    /**
+     * @param data the data to set
+     */
+    public void setData(Map data) {
+        this.data = data;
+    }
+
+}

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializerDecorator.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializerDecorator.java?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializerDecorator.java (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineComponentInfoInitializerDecorator.java Sun Jan  7 08:34:52 2007
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.cocoon.core.container.spring.pipeline;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.cocoon.components.pipeline.impl.PipelineComponentInfo;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.RootBeanDefinition;
+import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @version $Id$
+ * @since 2.2
+ */
+public class PipelineComponentInfoInitializerDecorator implements
+        BeanDefinitionDecorator {
+
+    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+    /** Logger  */
+    private final Log logger = LogFactory.getLog(getClass());
+
+    /* (non-Javadoc)
+     * @see org.springframework.beans.factory.xml.BeanDefinitionDecorator#decorate(org.w3c.dom.Node, org.springframework.beans.factory.config.BeanDefinitionHolder, org.springframework.beans.factory.xml.ParserContext)
+     */
+    public BeanDefinitionHolder decorate(Node source, BeanDefinitionHolder holder, ParserContext ctx) {
+        registerPipelineComponentInfo(ctx);
+        String initializerBeanName = registerPipelineComponentInfoInitializer(source, holder, ctx);
+        createDependencyOnPipelineComponentInfoInitializer(holder, initializerBeanName);
+        return holder;
+    }
+
+    private void registerPipelineComponentInfo(ParserContext ctx) {
+        if (!ctx.getRegistry().containsBeanDefinition(PipelineComponentInfo.ROLE)) {
+            BeanDefinitionBuilder defBuilder = BeanDefinitionBuilder.rootBeanDefinition(PipelineComponentInfoFactoryBean.class); 
+            defBuilder.setSingleton(true);
+            defBuilder.setLazyInit(false);
+            defBuilder.setInitMethodName("init");
+            ctx.getRegistry().registerBeanDefinition(PipelineComponentInfo.ROLE, defBuilder.getBeanDefinition());
+        }
+    }
+
+    private String registerPipelineComponentInfoInitializer(Node source, BeanDefinitionHolder holder, ParserContext ctx) {
+        String componentName = holder.getBeanName();
+        String mimeType = ((Element)source).hasAttribute("mime-type") ? ((Element)source).getAttribute("mime-type") : null;
+        String label = ((Element)source).hasAttribute("label") ? ((Element)source).getAttribute("label") : null;
+        String hint = ((Element)source).hasAttribute("hint") ? ((Element)source).getAttribute("hint") : null;
+        
+        BeanDefinitionBuilder initializer = BeanDefinitionBuilder.rootBeanDefinition(PipelineComponentInfoInitializer.class);
+        initializer.addPropertyReference("info", PipelineComponentInfo.ROLE);
+        initializer.addPropertyValue("componentName", componentName);
+        if (mimeType != null)
+            initializer.addPropertyValue("mimeType", mimeType);
+        if (label != null)
+            initializer.addPropertyValue("label", label);
+        if (hint != null)
+            initializer.addPropertyValue("hint", hint);
+        initializer.setInitMethodName("init");
+
+        String beanName = componentName + "/info";
+        ctx.getRegistry().registerBeanDefinition(beanName, initializer.getBeanDefinition());
+        
+        return beanName;
+    }
+
+    private void createDependencyOnPipelineComponentInfoInitializer(BeanDefinitionHolder holder, String initializerBeanName) {
+        AbstractBeanDefinition definition = ((AbstractBeanDefinition) holder.getBeanDefinition());
+        String[] dependsOn = definition.getDependsOn();
+        if (dependsOn == null) {
+           dependsOn = new String[]{initializerBeanName};
+        } else {
+           List dependencies = new ArrayList(Arrays.asList(dependsOn));
+           dependencies.add(initializerBeanName);
+           dependsOn = (String[]) dependencies.toArray(EMPTY_STRING_ARRAY);
+        }
+        definition.setDependsOn(dependsOn);
+    }
+}

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java Sun Jan  7 08:34:52 2007
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.cocoon.core.container.spring.pipeline;
+
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+
+/**
+ * Spring namespace handler for the cocoon pipeline namespace.
+ * Currently this namespace defines the following elements
+ * (in the namespace "http://cocoon.apache.org/schema/pipeline"):
+ * "component" : with optional attributes "mime-type", "label" and "hint".
+ *
+ * @version $Id$
+ * @since 2.2
+ */
+public class PipelineNamespaceHandler extends NamespaceHandlerSupport {
+
+    /* (non-Javadoc)
+     * @see org.springframework.beans.factory.xml.NamespaceHandler#init()
+     */
+    public void init() {
+        this.registerBeanDefinitionDecorator("component", new PipelineComponentInfoInitializerDecorator());
+    }
+
+}

Propchange: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/core/container/spring/pipeline/PipelineNamespaceHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers Sun Jan  7 08:34:52 2007
@@ -0,0 +1,16 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+http\://cocoon.apache.org/schema/pipeline=org.apache.cocoon.core.container.spring.pipeline.PipelineNamespaceHandler

Propchange: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.handlers
------------------------------------------------------------------------------
    svn:eol-style = native

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas Sun Jan  7 08:34:52 2007
@@ -0,0 +1,16 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+http\://cocoon.apache.org/schema/pipeline/cocoon-pipeline-1.0.xsd=org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd

Propchange: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/META-INF/spring.schemas
------------------------------------------------------------------------------
    svn:eol-style = native

Added: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd?view=auto&rev=493767
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd (added)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/resources/org/apache/cocoon/core/container/spring/pipeline/pipeline.xsd Sun Jan  7 08:34:52 2007
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        targetNamespace="http://cocoon.apache.org/schema/pipeline"
+        xmlns:tns="http://cocoon.apache.org/schema/pipeline">
+
+    <xsd:element name="component" type="tns:componentType"/>
+
+    <xsd:complexType name="componentType">
+    	<xsd:attribute name="mime-type" type="xsd:string" use="optional"/>
+    	<xsd:attribute name="label" type="xsd:string" use="optional"/>
+        <xsd:attribute name="hint" type="xsd:string" use="optional"/>
+    </xsd:complexType>
+</xsd:schema>
\ No newline at end of file

Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java?view=diff&rev=493767&r1=493766&r2=493767
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java Sun Jan  7 08:34:52 2007
@@ -46,6 +46,7 @@
 import org.apache.cocoon.Constants;
 import org.apache.cocoon.classloader.reloading.Monitor;
 import org.apache.cocoon.components.LifecycleHelper;
+import org.apache.cocoon.components.pipeline.impl.PipelineComponentInfo;
 import org.apache.cocoon.components.source.util.SourceUtil;
 import org.apache.cocoon.components.treeprocessor.AbstractProcessingNode;
 import org.apache.cocoon.components.treeprocessor.CategoryNode;
@@ -56,7 +57,6 @@
 import org.apache.cocoon.components.treeprocessor.ParameterizableProcessingNode;
 import org.apache.cocoon.components.treeprocessor.ProcessingNode;
 import org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder;
-import org.apache.cocoon.components.treeprocessor.ProcessorComponentInfo;
 import org.apache.cocoon.components.treeprocessor.TreeBuilder;
 import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
 import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
@@ -142,7 +142,7 @@
     /**
      * The sitemap component information grabbed while building itsMaanger
      */
-    protected ProcessorComponentInfo itsComponentInfo;
+    protected PipelineComponentInfo itsComponentInfo;
 
     /** Optional event listeners for the enter sitemap event */
     protected List enterSitemapEventListeners = new ArrayList();
@@ -360,7 +360,7 @@
         // register listeners
         this.registerListeners();
 
-        this.itsComponentInfo = (ProcessorComponentInfo) this.itsManager.lookup(ProcessorComponentInfo.ROLE);
+        this.itsComponentInfo = (PipelineComponentInfo) this.itsManager.lookup(PipelineComponentInfo.ROLE);
         // Create a helper object to setup components
         this.itsLifecycle = new LifecycleHelper(getLogger(), itsContext, this.itsManager, null /* configuration */);
 

Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/BridgeElementParser.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/BridgeElementParser.java?view=diff&rev=493767&r1=493766&r2=493767
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/BridgeElementParser.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/BridgeElementParser.java Sun Jan  7 08:34:52 2007
@@ -28,8 +28,10 @@
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.cocoon.acting.Action;
 import org.apache.cocoon.components.pipeline.ProcessingPipeline;
-import org.apache.cocoon.components.treeprocessor.ProcessorComponentInfo;
+import org.apache.cocoon.components.pipeline.impl.PipelineComponentInfo;
 import org.apache.cocoon.configuration.Settings;
+import org.apache.cocoon.core.container.spring.pipeline.PipelineComponentInfoFactoryBean;
+import org.apache.cocoon.core.container.spring.pipeline.PipelineComponentInfoInitializer;
 import org.apache.cocoon.generation.Generator;
 import org.apache.cocoon.matching.Matcher;
 import org.apache.cocoon.reading.Reader;
@@ -40,6 +42,7 @@
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.RuntimeBeanReference;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.support.BeanDefinitionReader;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -272,7 +275,7 @@
 
     protected void registerComponentInfo(ConfigurationInfo      configInfo,
                                          BeanDefinitionRegistry registry) {
-        ProcessorComponentInfo info = new ProcessorComponentInfo(null);
+        PipelineComponentInfo info = new PipelineComponentInfo(null);
         final Iterator i = configInfo.getComponents().values().iterator();
         while (i.hasNext()) {
             final ComponentInfo current = (ComponentInfo) i.next();
@@ -287,13 +290,23 @@
         prepareSelector(info, configInfo, Matcher.ROLE);
         prepareSelector(info, configInfo, Reader.ROLE);
         info.lock();
-        final RootBeanDefinition beanDef = new RootBeanDefinition();
-        beanDef.setBeanClass(ProcessorComponentInfoFactoryBean.class);
-        beanDef.setSingleton(true);
-        beanDef.setLazyInit(false);
-        beanDef.getPropertyValues().addPropertyValue("data", info.getData());
-        beanDef.setInitMethodName("init");
-        this.register(beanDef, ProcessorComponentInfo.ROLE, registry);
+        if (!registry.containsBeanDefinition(PipelineComponentInfo.ROLE)) {
+            final RootBeanDefinition beanDef = new RootBeanDefinition();
+            beanDef.setBeanClass(PipelineComponentInfoFactoryBean.class);
+            beanDef.setSingleton(true);
+            beanDef.setLazyInit(false);
+            beanDef.setInitMethodName("init");
+            this.register(beanDef, PipelineComponentInfo.ROLE, registry);
+        }
+        BeanDefinitionBuilder initDefBuilder =
+            BeanDefinitionBuilder.rootBeanDefinition(PipelineComponentInfoInitializer.class);
+        initDefBuilder.addPropertyReference("info", PipelineComponentInfo.ROLE);
+        initDefBuilder.setSingleton(true);
+        initDefBuilder.setLazyInit(false);
+        initDefBuilder.setInitMethodName("init");
+        initDefBuilder.addPropertyValue("data", info.getData());
+        final String beanName = this.getClass().getName() + "/init";
+        this.register(initDefBuilder.getBeanDefinition(), beanName, registry);
 
         final RootBeanDefinition ciBeanDef = new RootBeanDefinition();
         ciBeanDef.setBeanClass(ConfigurationInfoFactoryBean.class);
@@ -303,7 +316,7 @@
         this.register(ciBeanDef, ConfigurationInfo.class.getName(), registry);
     }
 
-    protected static void prepareSelector(ProcessorComponentInfo info,
+    protected static void prepareSelector(PipelineComponentInfo info,
                                           ConfigurationInfo configInfo,
                                           String category) {
         final ComponentInfo component = (ComponentInfo) configInfo.getComponents().get(category + "Selector");