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/04/06 22:06:59 UTC
svn commit: r160323 - in cocoon/trunk/src:
java/org/apache/cocoon/components/modules/input/
java/org/apache/cocoon/components/treeprocessor/sitemap/
java/org/apache/cocoon/generation/ java/org/apache/cocoon/sitemap/impl/
test/org/apache/cocoon/generation/ test/org/apache/cocoon/generation/sub/
Author: danielf
Date: Wed Apr 6 13:06:56 2005
New Revision: 160323
URL: http://svn.apache.org/viewcvs?view=rev&rev=160323
Log:
Working (hopefully :) ) VPC generator. Changed location of resolved sources from Avalon context to environment, and removed the AvalonContextModule that only was added for this task.
Added:
cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java (with props)
cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java (with props)
cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml (with props)
Removed:
cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/AvalonContextModule.java
Modified:
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNodeBuilder.java
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCsNodeBuilder.java
cocoon/trunk/src/java/org/apache/cocoon/generation/VirtualPipelineGenerator.java
cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.java
cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.xtest
cocoon/trunk/src/test/org/apache/cocoon/generation/sub/sitemap.xmap
cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-sitemap.xmap
Added: cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java?view=auto&rev=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java (added)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java Wed Apr 6 13:06:56 2005
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+package org.apache.cocoon.components.modules.input;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.cocoon.environment.internal.EnvironmentHelper;
+
+/**
+ * EnvironmentAttributeModule provides access to the current
+ * Environment, intended for internal use in VPCs.
+ *
+ * @version $Id$
+ */
+public class EnvironmentAttributeModule implements InputModule {
+
+ public Object getAttribute( String name, Configuration modeConf, Map objectModel )
+ throws ConfigurationException {
+ return EnvironmentHelper.getCurrentEnvironment().getAttribute(name);
+ }
+
+ public Object[] getAttributeValues(String name, Configuration modeConf, Map objectModel)
+ throws ConfigurationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public Iterator getAttributeNames(Configuration modeConf, Map objectModel)
+ throws ConfigurationException {
+ throw new UnsupportedOperationException();
+ }
+}
Propchange: cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/EnvironmentAttributeModule.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java Wed Apr 6 13:06:56 2005
@@ -1,40 +1,40 @@
-/*
- * 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.
- */
-package org.apache.cocoon.components.treeprocessor.sitemap;
-
-import java.util.Set;
-
-import org.apache.cocoon.components.treeprocessor.NamedContainerNode;
-
-/**
- * A VPC node that just invokes its children and store what parameters are sources.
- *
- * @version $Id$
- */
-
-public class VPCNode extends NamedContainerNode {
-
- Set sourceSet;
-
- public VPCNode(String name, Set sourceSet) {
- super(name);
- this.sourceSet = sourceSet;
- }
-
- public Set getSources() {
- return this.sourceSet;
- }
-}
+/*
+ * 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.
+ */
+package org.apache.cocoon.components.treeprocessor.sitemap;
+
+import java.util.Set;
+
+import org.apache.cocoon.components.treeprocessor.NamedContainerNode;
+
+/**
+ * A VPC node that just invokes its children and store what parameters are sources.
+ *
+ * @version $Id$
+ */
+
+public class VPCNode extends NamedContainerNode {
+
+ Set sourceSet;
+
+ public VPCNode(String name, Set sourceSet) {
+ super(name);
+ this.sourceSet = sourceSet;
+ }
+
+ public Set getSources() {
+ return this.sourceSet;
+ }
+}
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNodeBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNodeBuilder.java?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNodeBuilder.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNodeBuilder.java Wed Apr 6 13:06:56 2005
@@ -1,84 +1,65 @@
-/*
- * 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.
- */
-package org.apache.cocoon.components.treeprocessor.sitemap;
-
-import java.util.HashSet;
-
-import org.apache.avalon.framework.configuration.Configuration;
-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.cocoon.Constants;
-import org.apache.cocoon.components.treeprocessor.CategoryNodeBuilder;
-import org.apache.cocoon.components.treeprocessor.ProcessingNode;
-import org.apache.cocoon.components.treeprocessor.LinkedProcessingNodeBuilder;
-import org.apache.cocoon.components.treeprocessor.NamedContainerNodeBuilder;
-import org.apache.cocoon.components.treeprocessor.ProcessingNode;
-
-/**
- * Handles a virtual sitemap component.
- *
- * @version $Id$
- */
-public class VPCNodeBuilder extends NamedContainerNodeBuilder
- implements Contextualizable, LinkedProcessingNodeBuilder {
-
- private DefaultContext context;
- private String type;
- private String name;
-
- public void contextualize(Context context) throws ContextException {
- this.context = (DefaultContext) context;
- }
-
- public ProcessingNode buildNode(Configuration config) throws Exception {
- this.type = config.getName();
- this.name = config.getAttribute(this.nameAttr);
-
- // Find out which parameters that should be handled as sources
- // and put the info in the context.
- Configuration[] sources = config.getChildren("source");
- HashSet sourceSet = new HashSet();
- for (int j = 0; j < sources.length; j++)
- sourceSet.add(sources[j].getAttribute("param"));
-
- VPCNode node = new VPCNode(this.name, sourceSet);
- this.setupNode(node, config);
-
- return node;
- }
-
- public void linkNode() throws Exception {
- // Stuff this node into the context of current Sitemap so that
- // VirtualPipelineComponent can find it.
- //
- // This probably doesn't work if the component is redifined in
- // a subsitemap, either the stack functionality in DefaultContext
- // should be used for context switches, or this info should
- // be put in the current processor instead.
- //
- // The plural "s" is because the category name is from the
- // embeding container and I didn't found a way to get that name.
- // But for VPCs we know that a generator is part of the
- // category geerators etc.
-
- ProcessingNode node =
- CategoryNodeBuilder.getNamedNode(this.treeBuilder, this.type + "s", this.name);
-
- this.context.put(Constants.CONTEXT_VPC_PREFIX + this.type + "-" + this.name, node);
- }
-}
+/*
+ * 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.
+ */
+package org.apache.cocoon.components.treeprocessor.sitemap;
+
+import java.util.HashSet;
+
+import org.apache.avalon.framework.configuration.Configuration;
+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.cocoon.Constants;
+import org.apache.cocoon.components.treeprocessor.NamedContainerNodeBuilder;
+import org.apache.cocoon.components.treeprocessor.ProcessingNode;
+
+/**
+ * Handles a virtual sitemap component.
+ *
+ * @version $Id$
+ */
+public class VPCNodeBuilder extends NamedContainerNodeBuilder
+ implements Contextualizable {
+
+ private DefaultContext context;
+
+ // FIXME: The class is thread safe, will that work with Contextualizable?
+ public void contextualize(Context context) throws ContextException {
+ this.context = (DefaultContext) context;
+ }
+
+ public ProcessingNode buildNode(Configuration config) throws Exception {
+ String type = config.getName();
+ String name = config.getAttribute(this.nameAttr);
+
+ // Find out which parameters that should be handled as sources
+ // and put the info in the context.
+ Configuration[] sources = config.getChildren("source");
+ HashSet sourceSet = new HashSet();
+ for (int j = 0; j < sources.length; j++)
+ sourceSet.add(sources[j].getAttribute("param"));
+
+ VPCNode node = new VPCNode(name, sourceSet);
+ this.setupNode(node, config);
+
+ // Stuff this node into the context of current Sitemap so that
+ // VirtualPipelineComponent can find it.
+ //
+ this.context.put(Constants.CONTEXT_VPC_PREFIX + type + "-" + name, node);
+
+ return node;
+ }
+}
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCsNodeBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCsNodeBuilder.java?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCsNodeBuilder.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCsNodeBuilder.java Wed Apr 6 13:06:56 2005
@@ -1,46 +1,46 @@
-/*
- * 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.
- */
-package org.apache.cocoon.components.treeprocessor.sitemap;
-
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationException;
-
-import org.apache.cocoon.components.treeprocessor.CategoryNodeBuilder;
-import org.apache.cocoon.generation.VirtualPipelineGenerator;
-
-/**
- * Handles a set of virtual sitemap components.
- *
- * @version $Id$
- */
-public class VPCsNodeBuilder extends CategoryNodeBuilder {
-
- /**
- * Checks if a child element is a VPC, and if not throws a <code>ConfigurationException</code>.
- *
- * @param child the child configuration to check.
- * @return <code>true</code> if this child should be considered or <code>false</code>
- * if it should be ignored.
- * @throws ConfigurationException if this child isn't allowed.
- */
- protected boolean isChild(Configuration child) throws ConfigurationException {
-
- checkNamespace(child);
-
- String clazz = child.getAttribute("src");
- return VirtualPipelineGenerator.class.getName().equals(clazz);
- }
-}
+/*
+ * 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.
+ */
+package org.apache.cocoon.components.treeprocessor.sitemap;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+
+import org.apache.cocoon.components.treeprocessor.CategoryNodeBuilder;
+import org.apache.cocoon.generation.VirtualPipelineGenerator;
+
+/**
+ * Handles a set of virtual sitemap components.
+ *
+ * @version $Id$
+ */
+public class VPCsNodeBuilder extends CategoryNodeBuilder {
+
+ /**
+ * Checks if a child element is a VPC, and if not throws a <code>ConfigurationException</code>.
+ *
+ * @param child the child configuration to check.
+ * @return <code>true</code> if this child should be considered or <code>false</code>
+ * if it should be ignored.
+ * @throws ConfigurationException if this child isn't allowed.
+ */
+ protected boolean isChild(Configuration child) throws ConfigurationException {
+
+ checkNamespace(child);
+
+ String clazz = child.getAttribute("src");
+ return VirtualPipelineGenerator.class.getName().equals(clazz);
+ }
+}
Modified: cocoon/trunk/src/java/org/apache/cocoon/generation/VirtualPipelineGenerator.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/generation/VirtualPipelineGenerator.java?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/generation/VirtualPipelineGenerator.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/generation/VirtualPipelineGenerator.java Wed Apr 6 13:06:56 2005
@@ -15,253 +15,68 @@
*/
package org.apache.cocoon.generation;
-import org.apache.avalon.framework.activity.Disposable;
-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;
-import org.apache.avalon.framework.context.DefaultContext;
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
-import org.apache.avalon.framework.parameters.Parameters;
-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.ProcessingException;
-import org.apache.cocoon.components.source.SourceUtil;
-import org.apache.cocoon.components.pipeline.ProcessingPipeline;
-import org.apache.cocoon.components.pipeline.VirtualProcessingPipeline;
-import org.apache.cocoon.components.treeprocessor.CategoryNode;
-import org.apache.cocoon.components.treeprocessor.InvokeContext;
-import org.apache.cocoon.components.treeprocessor.ProcessingNode;
-import org.apache.cocoon.components.treeprocessor.sitemap.VPCNode;
import org.apache.cocoon.environment.Environment;
-import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.environment.internal.EnvironmentHelper;
+import org.apache.cocoon.sitemap.impl.AbstractVirtualSitemapComponent;
import org.apache.cocoon.xml.XMLConsumer;
-import org.apache.excalibur.source.Source;
-import org.apache.excalibur.source.SourceException;
-import org.apache.excalibur.xml.sax.XMLizable;
import org.xml.sax.SAXException;
import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import java.util.Set;
-/**
- * TODO List:
- * <ul>
- * <li>Implement parameters support
- * <li>Resolve src parameter and pass to the pipeline
- * <li>Refactor ProcessingPipelines implementations
- * <li>Implement caching
- * </ul>
- */
-public class VirtualPipelineGenerator extends AbstractLogEnabled
- implements Generator, Serviceable, Disposable, Contextualizable, Configurable {
-
- private SourceResolver resolver;
- private DefaultContext context;
- private ServiceManager manager;
- private XMLConsumer consumer;
- private ProcessingNode node;
- private ProcessingPipeline pipeline;
- private String sourceMapName;
- private Map sourceMap = new HashMap();
- private Set sources;
- private String name;
-
-
- private class MyInvokeContext extends InvokeContext {
- public MyInvokeContext() throws Exception {
- super(true);
- super.processingPipeline = new VirtualProcessingPipeline(VirtualPipelineGenerator.this.context);
- }
- }
- public void contextualize(Context context) throws ContextException {
- this.context = (DefaultContext)context;
- }
+public class VirtualPipelineGenerator extends AbstractVirtualSitemapComponent
+ implements Generator {
- public void service(ServiceManager manager) throws ServiceException {
- this.manager = manager;
- }
+ protected XMLConsumer consumer;
- /**
- * Release all resources.
- */
- public void dispose() {
- try {
- Iterator sources =
- this.sourceMap.values().iterator();
- while (sources.hasNext()) {
- Source source = (Source)sources.next();
- // These are allready disposed, why?
- //this.resolver.release(source);
- }
- } catch (Exception e) {
- throw new RuntimeException("Could not dispose sources", e);
- }
- this.manager = null;
- }
-
- public void configure(Configuration configuration) throws ConfigurationException {
- this.name = configuration.getAttribute("name");
- this.sourceMapName = Constants.CONTEXT_ENV_PREFIX + "-source-map-" + this.name;
- try {
- this.node =
- (ProcessingNode)this.context.get(Constants.CONTEXT_VPC_PREFIX +
- "generator-" + this.name);
- this.sources = ((VPCNode)node).getSources();
- } catch (Exception e) {
- throw new ConfigurationException("Can not find VirtualPipelineGenerator '" +
- this.name + "' configuration");
- }
+ protected String getTypeName() {
+ return "generator";
}
public void setConsumer(XMLConsumer consumer) {
this.consumer = consumer;
}
- public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
- throws ProcessingException, SAXException, IOException {
-
- this.resolver = resolver;
-
- // save callers resolved sources if there are any
- Map oldSourceMap = null;
- try {
- oldSourceMap = (Map)this.context.get(this.sourceMapName);
- } catch (ContextException e) {
- // This VPC has not been used by the caller
- }
- // place for resolved sources
- this.context.put(this.sourceMapName, this.sourceMap);
-
- Environment env = EnvironmentHelper.getCurrentEnvironment();
- String oldPrefix = env.getURIPrefix();
- String oldURI = env.getURI();
- MyInvokeContext invoker = null;
-
- try {
- // resolve the sources in the parameter map before switching context
- Map resolvedParams = resolveParams(par, src);
-
- String uri = (String) this.context.get(Constants.CONTEXT_ENV_URI);
- String prefix = (String) this.context.get(Constants.CONTEXT_ENV_PREFIX);
- env.setURI(prefix, uri);
-
- invoker = new MyInvokeContext();
- invoker.enableLogging(getLogger());
- invoker.service(this.manager);
- invoker.pushMap(null, resolvedParams);
-
- this.node.invoke(env, invoker);
- this.pipeline = invoker.getProcessingPipeline();
- } catch (Exception e) {
- throw new ProcessingException("Oops", e);
- } finally {
- if (invoker != null) {
- invoker.popMap();
- invoker.dispose();
- }
- // Restore context
- env.setURI(oldPrefix, oldURI);
- // restore sourceMap
- this.context.put(this.sourceMapName, oldSourceMap);
- }
- }
-
- private Map resolveParams(Parameters par, String src)
- throws ProcessingException, IOException {
- HashMap map = new HashMap();
-
- // resolve and map params
- Iterator names = par.getParameterNames();
- while (names.hasNext()) {
- String name = (String)names.next();
- String value = par.getParameter(name, null);
- if (this.sources.contains(name))
- value = resolveAndMapSourceURI(name, value);
- map.put(name, value);
- }
-
- // resolve and map src
- if (src != null)
- map.put("src", resolveAndMapSourceURI("src", src));
-
- return map;
- }
-
- private String resolveAndMapSourceURI(String name, String uri)
- throws ProcessingException, IOException {
-
- // Resolve the URI
- getLogger().debug("VPCGenerator: resolve " + name + " = " + uri);
- Source src = null;
- try {
- src = this.resolver.resolveURI(uri);
- } catch (SourceException se) {
- throw SourceUtil.handle("Error during resolving of " + uri, se);
- }
-
- getLogger().debug("VPCGenerator: URI " + name + " = " + src.getURI());
-
- // Save the source
- this.sourceMap.put(name, src);
-
- // Create a new URI that refers to the source in the context
- String mappedURI;
- if (src instanceof XMLizable)
- mappedURI = "xmodule:avalon-context:" + this.sourceMapName + "#" + name;
- else
- mappedURI = "module:avalon-context:" + this.sourceMapName + "#" + name;
-
- getLogger().debug("VPCGenerator: mapped URI " + name + " = " + mappedURI);
-
- return mappedURI;
- }
-
public void generate()
throws IOException, SAXException, ProcessingException {
- // save callers resolved sources if there are any
- Map oldSourceMap = null;
- try {
- oldSourceMap = (Map)this.context.get(this.sourceMapName);
- } catch (ContextException e) {
- // This VPC has not been used by the caller
- }
- // place for resolved sources
- this.context.put(this.sourceMapName, this.sourceMap);
-
// Should use SourceResolver of the this components' sitemap, not caller sitemap
// Have to switch to another environment...
Environment env = EnvironmentHelper.getCurrentEnvironment();
String oldPrefix = env.getURIPrefix();
String oldURI = env.getURI();
+
+ // save callers resolved sources if there are any
+ Map oldSourceMap = (Map)env.getAttribute(this.sourceMapName);
+ // place for resolved sources
+ env.setAttribute(this.sourceMapName, this.sourceMap);
+
try {
- String uri = (String) this.context.get(Constants.CONTEXT_ENV_URI);
- String prefix = (String) this.context.get(Constants.CONTEXT_ENV_PREFIX);
- env.setURI(prefix, uri);
-
- this.pipeline.prepareInternal(env);
- } catch (Exception e) {
- throw new ProcessingException("Oops", e);
- } finally {
- // Restore context
- env.setURI(oldPrefix, oldURI);
- }
+ try {
+ String uri = (String) this.context.get(Constants.CONTEXT_ENV_URI);
+ String prefix = (String) this.context.get(Constants.CONTEXT_ENV_PREFIX);
+ env.setURI(prefix, uri);
+
+ this.pipeline.prepareInternal(env);
+ } catch (Exception e) {
+ throw new ProcessingException("Oops", e);
+ } finally {
+ // Restore context
+ env.setURI(oldPrefix, oldURI);
+ }
- this.pipeline.process(env, this.consumer);
+ this.pipeline.process(env, this.consumer);
- // restore sourceMap
- this.context.put(this.sourceMapName, oldSourceMap);
+ } finally {
+ // restore sourceMap
+ if (oldSourceMap != null)
+ env.setAttribute(this.sourceMapName, oldSourceMap);
+ else
+ env.removeAttribute(this.sourceMapName);
+ }
}
-}
+ }
Added: cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java?view=auto&rev=160323
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java (added)
+++ cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java Wed Apr 6 13:06:56 2005
@@ -0,0 +1,218 @@
+/*
+ * 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.
+ */
+package org.apache.cocoon.sitemap.impl;
+
+import org.apache.avalon.framework.activity.Disposable;
+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;
+import org.apache.avalon.framework.context.DefaultContext;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.parameters.Parameters;
+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.ProcessingException;
+import org.apache.cocoon.components.source.SourceUtil;
+import org.apache.cocoon.components.pipeline.ProcessingPipeline;
+import org.apache.cocoon.components.pipeline.VirtualProcessingPipeline;
+import org.apache.cocoon.components.treeprocessor.InvokeContext;
+import org.apache.cocoon.components.treeprocessor.ProcessingNode;
+import org.apache.cocoon.components.treeprocessor.sitemap.VPCNode;
+import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.environment.internal.EnvironmentHelper;
+import org.apache.cocoon.sitemap.SitemapModelComponent;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceException;
+import org.apache.excalibur.xml.sax.XMLizable;
+
+import org.xml.sax.SAXException;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * TODO List:
+ * <ul>
+ * <li>Refactor ProcessingPipelines implementations
+ * <li>Implement caching
+ * </ul>
+ */
+public abstract class AbstractVirtualSitemapComponent extends AbstractLogEnabled
+ implements SitemapModelComponent, Serviceable, Disposable, Contextualizable, Configurable {
+
+ protected SourceResolver resolver;
+ protected DefaultContext context;
+ protected ServiceManager manager;
+ protected ProcessingNode node;
+ protected ProcessingPipeline pipeline;
+ protected String sourceMapName;
+ protected Map sourceMap = new HashMap();
+ protected Set sources;
+ protected String name;
+
+
+ protected class MyInvokeContext extends InvokeContext {
+ public MyInvokeContext() throws Exception {
+ super(true);
+ super.processingPipeline = new VirtualProcessingPipeline(AbstractVirtualSitemapComponent.this.context);
+ }
+ }
+
+ abstract protected String getTypeName();
+
+ public void contextualize(Context context) throws ContextException {
+ this.context = (DefaultContext)context;
+ }
+
+ public void service(ServiceManager manager) throws ServiceException {
+ this.manager = manager;
+ }
+
+ /**
+ * Release all resources.
+ */
+ public void dispose() {
+ try {
+ Iterator sources =
+ this.sourceMap.values().iterator();
+ while (sources.hasNext()) {
+ Source source = (Source)sources.next();
+ // FIXME
+ // These are allready disposed, why?
+ //this.resolver.release(source);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Could not dispose sources", e);
+ }
+ this.manager = null;
+ }
+
+ public void configure(Configuration configuration) throws ConfigurationException {
+ this.name = configuration.getAttribute("name");
+ this.sourceMapName =
+ Constants.CONTEXT_ENV_PREFIX + "-" + getTypeName() + "-source-map-" + this.name;
+ try {
+ this.node = (ProcessingNode)this.context.get(Constants.CONTEXT_VPC_PREFIX +
+ getTypeName() + "-" + this.name);
+ this.sources = ((VPCNode)node).getSources();
+ } catch (Exception e) {
+ throw new ConfigurationException("Can not find VirtualPipelineComponent '" +
+ this.name + "' configuration");
+ }
+ }
+
+ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
+ throws ProcessingException, SAXException, IOException {
+ this.resolver = resolver;
+
+ Environment env = EnvironmentHelper.getCurrentEnvironment();
+ String oldPrefix = env.getURIPrefix();
+ String oldURI = env.getURI();
+
+ // save callers resolved sources if there are any
+ Map oldSourceMap = (Map)env.getAttribute(this.sourceMapName);
+ // place for resolved sources
+ env.setAttribute(this.sourceMapName, this.sourceMap);
+
+ MyInvokeContext invoker = null;
+
+ try {
+ // resolve the sources in the parameter map before switching context
+ Map resolvedParams = resolveParams(par, src);
+
+ String uri = (String) this.context.get(Constants.CONTEXT_ENV_URI);
+ String prefix = (String) this.context.get(Constants.CONTEXT_ENV_PREFIX);
+ env.setURI(prefix, uri);
+
+ invoker = new MyInvokeContext();
+ invoker.enableLogging(getLogger());
+ invoker.service(this.manager);
+ invoker.pushMap(null, resolvedParams);
+
+ this.node.invoke(env, invoker);
+ this.pipeline = invoker.getProcessingPipeline();
+ } catch (Exception e) {
+ throw new ProcessingException("Oops", e);
+ } finally {
+ if (invoker != null) {
+ invoker.popMap();
+ invoker.dispose();
+ }
+ // Restore context
+ env.setURI(oldPrefix, oldURI);
+ // restore sourceMap
+ if (oldSourceMap != null)
+ env.setAttribute(this.sourceMapName, oldSourceMap);
+ else
+ env.removeAttribute(this.sourceMapName);
+ }
+ }
+
+ protected Map resolveParams(Parameters par, String src)
+ throws ProcessingException, IOException {
+ HashMap map = new HashMap();
+
+ // resolve and map params
+ Iterator names = par.getParameterNames();
+ while (names.hasNext()) {
+ String name = (String)names.next();
+ String value = par.getParameter(name, null);
+ if (this.sources.contains(name))
+ value = resolveAndMapSourceURI(name, value);
+ map.put(name, value);
+ }
+
+ // resolve and map src
+ if (src != null)
+ map.put("src", resolveAndMapSourceURI("src", src));
+
+ return map;
+ }
+
+ protected String resolveAndMapSourceURI(String name, String uri)
+ throws ProcessingException, IOException {
+
+ // Resolve the URI
+ Source src = null;
+ try {
+ src = this.resolver.resolveURI(uri);
+ } catch (SourceException se) {
+ throw SourceUtil.handle("Error during resolving of " + uri, se);
+ }
+
+ // Save the source
+ this.sourceMap.put(name, src);
+
+ // Create a new URI that refers to the source in the context
+ String mappedURI;
+ if (src instanceof XMLizable)
+ mappedURI = "xmodule:environment-attribute:" + this.sourceMapName + "#" + name;
+ else
+ mappedURI = "module:environment-attribute:" + this.sourceMapName + "#" + name;
+
+ return mappedURI;
+ }
+}
Propchange: cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/AbstractVirtualSitemapComponent.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.java?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.java (original)
+++ cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.java Wed Apr 6 13:06:56 2005
@@ -1,120 +1,120 @@
-/*
- * 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.
- */
-package org.apache.cocoon.generation;
-
-import java.net.URL;
-
-import org.apache.avalon.framework.context.DefaultContext;
-import org.apache.cocoon.Constants;
-import org.apache.cocoon.Processor;
-import org.apache.cocoon.SitemapComponentTestCase;
-import org.apache.cocoon.components.ContextHelper;
-import org.apache.cocoon.environment.internal.EnvironmentHelper;
-import org.apache.cocoon.environment.mock.MockEnvironment;
-
-public class VirtualPipelineGeneratorTestCase extends SitemapComponentTestCase {
-
- private Processor processor;
- private String classDir;
- private URL classDirURL;
-
- public void setUp() throws Exception {
- this.classDirURL = getClassDirURL();
- this.classDir = this.classDirURL.toExternalForm();
- super.setUp();
- this.processor = (Processor)this.lookup(Processor.ROLE);
- }
-
- public void tearDown() throws Exception {
- this.release(this.processor);
- super.tearDown();
- }
-
- // Hack to get the URL to the directory that this class is in
- private URL getClassDirURL() throws RuntimeException {
- String className = getClass().getName().replace( '.', '/' ) + ".class";
- try {
- String classURL =
- getClass().getClassLoader().getResource( className ).toExternalForm();
- String classDir = classURL.substring(0, classURL.lastIndexOf('/') + 1);
-
- return new URL(classDir);
- } catch (Exception e) {
- throw new RuntimeException("Couldn't create URL for " + className, e);
- }
- }
-
- protected void addContext(DefaultContext context) {
- super.addContext(context);
- context.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, getContext());
- context.put(ContextHelper.CONTEXT_ROOT_URL, this.classDirURL);
- }
-
- protected boolean addSourceFactories() {
- return false;
- }
-
- public byte[] process(String uri) throws Exception {
- MockEnvironment env = new MockEnvironment();
- env.setURI("", uri);
- getRequest().setEnvironment(env);
- env.setObjectModel(getObjectModel());
-
- EnvironmentHelper.enterProcessor(this.processor, this.getManager(), env);
- try {
- this.processor.process(env);
- getLogger().info("Output: " + new String(env.getOutput(), "UTF-8"));
-
- return env.getOutput();
- } finally {
- EnvironmentHelper.leaveProcessor();
- }
- }
-
- public void pipeTest(String uri, String expectedSource) throws Exception {
- byte[] expected = loadByteArray(this.classDir + expectedSource);
- byte[] actual = process(uri);
- assertIdentical(expected, actual);
- }
-
- public void testSimplePipe() throws Exception {
- pipeTest("test", "vpc-test.xml");
- }
-
- public void testVirtualPipe() throws Exception {
- pipeTest("v1", "vpc-test.xml");
- }
-
- public void testVirtualPipeParam() throws Exception {
- pipeTest("v2", "vpc-param-expected.xml");
- }
-
- public void testVirtualPipeSourceParam() throws Exception {
- process("v3");
- }
-
- public void testVirtualSubPipeSourceParam() throws Exception {
- process("sub/v3");
- }
-
- public void testVirtualPipeSrc() throws Exception {
- process("v4");
- }
-
- public void testVirtualSubPipeSrc() throws Exception {
- process("sub/v4");
- }
-}
+/*
+ * 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.
+ */
+package org.apache.cocoon.generation;
+
+import java.net.URL;
+
+import org.apache.avalon.framework.context.DefaultContext;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.Processor;
+import org.apache.cocoon.SitemapComponentTestCase;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.environment.internal.EnvironmentHelper;
+import org.apache.cocoon.environment.mock.MockEnvironment;
+
+public class VirtualPipelineGeneratorTestCase extends SitemapComponentTestCase {
+
+ private Processor processor;
+ private String classDir;
+ private URL classDirURL;
+
+ public void setUp() throws Exception {
+ this.classDirURL = getClassDirURL();
+ this.classDir = this.classDirURL.toExternalForm();
+ super.setUp();
+ this.processor = (Processor)this.lookup(Processor.ROLE);
+ }
+
+ public void tearDown() throws Exception {
+ this.release(this.processor);
+ super.tearDown();
+ }
+
+ // Hack to get the URL to the directory that this class is in
+ private URL getClassDirURL() throws RuntimeException {
+ String className = getClass().getName().replace( '.', '/' ) + ".class";
+ try {
+ String classURL =
+ getClass().getClassLoader().getResource( className ).toExternalForm();
+ String classDir = classURL.substring(0, classURL.lastIndexOf('/') + 1);
+
+ return new URL(classDir);
+ } catch (Exception e) {
+ throw new RuntimeException("Couldn't create URL for " + className, e);
+ }
+ }
+
+ protected void addContext(DefaultContext context) {
+ super.addContext(context);
+ context.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, getContext());
+ context.put(ContextHelper.CONTEXT_ROOT_URL, this.classDirURL);
+ }
+
+ protected boolean addSourceFactories() {
+ return false;
+ }
+
+ public byte[] process(String uri) throws Exception {
+ MockEnvironment env = new MockEnvironment();
+ env.setURI("", uri);
+ getRequest().setEnvironment(env);
+ env.setObjectModel(getObjectModel());
+
+ EnvironmentHelper.enterProcessor(this.processor, this.getManager(), env);
+ try {
+ this.processor.process(env);
+ getLogger().info("Output: " + new String(env.getOutput(), "UTF-8"));
+
+ return env.getOutput();
+ } finally {
+ EnvironmentHelper.leaveProcessor();
+ }
+ }
+
+ public void pipeTest(String uri, String expectedSource) throws Exception {
+ byte[] expected = loadByteArray(this.classDir + expectedSource);
+ byte[] actual = process(uri);
+ assertIdentical(expected, actual);
+ }
+
+ public void testSimplePipe() throws Exception {
+ pipeTest("test", "vpc-test.xml");
+ }
+
+ public void testVirtualPipe() throws Exception {
+ pipeTest("v1", "vpc-test.xml");
+ }
+
+ public void testVirtualPipeParam() throws Exception {
+ pipeTest("v2", "vpc-param-expected.xml");
+ }
+
+ public void testVirtualPipeSourceParam() throws Exception {
+ pipeTest("v3", "vpc-source-param-expected.xml");
+ }
+
+ public void testVirtualSubPipeSourceParam() throws Exception {
+ pipeTest("sub/v3", "vpc-source-param-expected.xml");
+ }
+
+ public void testVirtualPipeSrc() throws Exception {
+ pipeTest("v4", "vpc-test.xml");
+ }
+
+ public void testVirtualSubPipeSrc() throws Exception {
+ pipeTest("sub/v4", "vpc-test.xml");
+ }
+}
Modified: cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.xtest
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.xtest?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.xtest (original)
+++ cocoon/trunk/src/test/org/apache/cocoon/generation/VirtualPipelineGeneratorTestCase.xtest Wed Apr 6 13:06:56 2005
@@ -1,88 +1,91 @@
-<?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.
--->
-
-<testcase>
- <roles>
- <role name="org.apache.excalibur.xml.sax.SAXParser"
- shorthand="xml-parser"
- default-class="org.apache.excalibur.xml.impl.JaxpParser"/>
- <role name="org.apache.excalibur.xmlizer.XMLizer"
- shorthand="xmlizer"
- default-class="org.apache.excalibur.xmlizer.DefaultXMLizer"/>
- <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"/>
- <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.excalibur.source.SourceFactorySelector"
- shorthand="source-factories"
- default-class="org.apache.cocoon.core.container.DefaultServiceSelector"/>
- <role name="org.apache.excalibur.source.SourceResolver"
- shorthand="source-resolver"
- default-class="org.apache.excalibur.source.impl.SourceResolverImpl"/>
- <role name="org.apache.cocoon.Processor"
- shorthand="sitemap"
- default-class="org.apache.cocoon.components.treeprocessor.TreeProcessor"/>
- <role name="org.apache.cocoon.components.treeprocessor.TreeBuilder/sitemap-1.0"
- default-class="org.apache.cocoon.components.treeprocessor.sitemap.SitemapLanguage"/>
- <role name="org.apache.cocoon.components.modules.input.InputModuleSelector"
- shorthand="input-modules"
- default-class="org.apache.cocoon.core.container.DefaultServiceSelector"/>
- </roles>
-
- <components>
- <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/>
-
- <input-modules>
- <component-instance class="org.apache.cocoon.components.modules.input.AvalonContextModule" name="avalon-context"/>
- </input-modules>
-
- <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.cocoon.components.source.impl.ModuleSourceFactory" name="module"/>
- <component-instance class="org.apache.cocoon.components.source.impl.XModuleSourceFactory" name="xmodule"/>
- <component-instance class="org.apache.excalibur.source.impl.FileSourceFactory" name="file"/>
- <component-instance class="org.apache.excalibur.source.impl.URLSourceFactory" name="*"/>
- </source-factories>
-
- <!-- Relative sitemap path works during sitemap execution but
- give exceptions during decommissioning -->
- <sitemap file="resource://org/apache/cocoon/generation/vpc-sitemap.xmap"/>
-
- </components>
-
-</testcase>
+<?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.
+-->
+
+<testcase>
+ <roles>
+ <role name="org.apache.excalibur.xml.sax.SAXParser"
+ shorthand="xml-parser"
+ default-class="org.apache.excalibur.xml.impl.JaxpParser"/>
+ <role name="org.apache.excalibur.xmlizer.XMLizer"
+ shorthand="xmlizer"
+ default-class="org.apache.excalibur.xmlizer.DefaultXMLizer"/>
+ <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"/>
+ <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.excalibur.source.SourceFactorySelector"
+ shorthand="source-factories"
+ default-class="org.apache.cocoon.core.container.DefaultServiceSelector"/>
+ <role name="org.apache.excalibur.source.SourceResolver"
+ shorthand="source-resolver"
+ default-class="org.apache.excalibur.source.impl.SourceResolverImpl"/>
+ <role name="org.apache.cocoon.Processor"
+ shorthand="sitemap"
+ default-class="org.apache.cocoon.components.treeprocessor.TreeProcessor"/>
+ <role name="org.apache.cocoon.components.treeprocessor.TreeBuilder/sitemap-1.0"
+ default-class="org.apache.cocoon.components.treeprocessor.sitemap.SitemapLanguage"/>
+ <role name="org.apache.cocoon.components.modules.input.InputModuleSelector"
+ shorthand="input-modules"
+ default-class="org.apache.cocoon.core.container.DefaultServiceSelector"/>
+ <role name="org.apache.cocoon.components.fam.SitemapMonitor"
+ shorthand="fam"
+ default-class="org.apache.cocoon.components.fam.SitemapMonitorImpl"/>
+ </roles>
+
+ <components>
+ <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/>
+
+ <input-modules>
+ <component-instance class="org.apache.cocoon.components.modules.input.EnvironmentAttributeModule" name="environment-attribute"/>
+ </input-modules>
+
+ <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.cocoon.components.source.impl.ModuleSourceFactory" name="module"/>
+ <component-instance class="org.apache.cocoon.components.source.impl.XModuleSourceFactory" name="xmodule"/>
+ <component-instance class="org.apache.excalibur.source.impl.FileSourceFactory" name="file"/>
+ <component-instance class="org.apache.excalibur.source.impl.URLSourceFactory" name="*"/>
+ </source-factories>
+
+ <!-- Relative sitemap path works during sitemap execution but
+ give exceptions during decommissioning -->
+ <sitemap file="resource://org/apache/cocoon/generation/vpc-sitemap.xmap"/>
+
+ </components>
+
+</testcase>
Modified: cocoon/trunk/src/test/org/apache/cocoon/generation/sub/sitemap.xmap
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/generation/sub/sitemap.xmap?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/generation/sub/sitemap.xmap (original)
+++ cocoon/trunk/src/test/org/apache/cocoon/generation/sub/sitemap.xmap Wed Apr 6 13:06:56 2005
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<!-- SVN $Id$ -->
-
-<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
-
- <map:pipelines>
- <map:pipeline>
-
- <map:match pattern="v3">
- <map:generate type="virtual3">
- <map:parameter name="source" value="test.xml"/>
- <map:parameter name="foo" value="bar"/>
- </map:generate>
- <map:serialize type="xml"/>
- </map:match>
-
- <map:match pattern="v4">
- <map:generate type="virtual4" src="test.xml"/>
- <map:serialize type="xml"/>
- </map:match>
-
- </map:pipeline>
- </map:pipelines>
-</map:sitemap>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<!-- SVN $Id$ -->
+
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+
+ <map:pipelines>
+ <map:pipeline>
+
+ <map:match pattern="v3">
+ <map:generate type="virtual3">
+ <map:parameter name="source" value="test.xml"/>
+ <map:parameter name="foo" value="bar"/>
+ </map:generate>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match pattern="v4">
+ <map:generate type="virtual4" src="test.xml"/>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ </map:pipeline>
+ </map:pipelines>
+</map:sitemap>
Modified: cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-sitemap.xmap
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-sitemap.xmap?view=diff&r1=160322&r2=160323
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-sitemap.xmap (original)
+++ cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-sitemap.xmap Wed Apr 6 13:06:56 2005
@@ -1,106 +1,106 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<!-- SVN $Id$ -->
-
-<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
-
- <map:components>
- <map:generators default="file">
- <map:generator name="file" src="org.apache.cocoon.generation.FileGenerator"/>
- <map:generator name="jx" src="org.apache.cocoon.generation.JXTemplateGenerator"/>
- <map:generator name="virtual1" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
- <map:generate type="file" src="vpc-test.xml"/>
- </map:generator>
- <map:generator name="virtual2" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
- <map:generate type="jx" src="vpc-param.xml">
- <map:parameter name="foo2" value="{foo}"/>
- </map:generate>
- </map:generator>
- <map:generator name="virtual3" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
- <map:source param="source"/>
- <map:generate type="jx" src="vpc-source-param.xml">
- <map:parameter name="source" value="{source}"/>
- <map:parameter name="foo2" value="{foo}"/>
- </map:generate>
- </map:generator>
- <map:generator name="virtual4" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
- <map:generate src="{src}"/>
- </map:generator>
- </map:generators>
-
- <map:transformers default="xslt">
- <map:transformer name="xslt" src="org.apache.cocoon.transformation.TraxTransformer">
- <xslt-processor-role>xalan</xslt-processor-role>
- </map:transformer>
- </map:transformers>
-
- <map:serializers default="xml">
- <map:serializer mime-type="text/xml" name="xml" src="org.apache.cocoon.serialization.XMLSerializer"/>
- </map:serializers>
-
- <map:matchers default="wildcard">
- <map:matcher name="wildcard" src="org.apache.cocoon.matching.WildcardURIMatcher"/>
- </map:matchers>
-
- <map:pipes default="noncaching">
- <map:pipe name="noncaching" src="org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline">
- </map:pipe>
- </map:pipes>
- </map:components>
-
- <map:pipelines>
- <map:pipeline>
-
- <map:match pattern="test">
- <map:generate type="file" src="vpc-test.xml"/>
- <map:serialize type="xml"/>
- </map:match>
-
- <map:match pattern="v1">
- <map:generate type="virtual1"/>
- <map:serialize type="xml"/>
- </map:match>
-
- <map:match pattern="v2">
- <map:generate type="virtual2">
- <map:parameter name="foo" value="bar"/>
- </map:generate>
- <map:serialize type="xml"/>
- </map:match>
-
- <map:match pattern="v3">
- <map:generate type="virtual3">
- <map:parameter name="source" value="vpc-test.xml"/>
- <map:parameter name="foo" value="bar"/>
- </map:generate>
- <map:serialize type="xml"/>
- </map:match>
-
- <map:match pattern="sub/**">
- <map:mount uri-prefix="sub"
- src="resource://org/apache/cocoon/generation/sub/"/>
- </map:match>
-
- <map:match pattern="v4">
- <map:generate type="virtual4" src="vpc-test.xml"/>
- <map:serialize type="xml"/>
- </map:match>
-
- </map:pipeline>
- </map:pipelines>
-</map:sitemap>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<!-- SVN $Id$ -->
+
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+
+ <map:components>
+ <map:generators default="file">
+ <map:generator name="file" src="org.apache.cocoon.generation.FileGenerator"/>
+ <map:generator name="jx" src="org.apache.cocoon.generation.JXTemplateGenerator"/>
+ <map:generator name="virtual1" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
+ <map:generate type="file" src="vpc-test.xml"/>
+ </map:generator>
+ <map:generator name="virtual2" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
+ <map:generate type="jx" src="vpc-param.xml">
+ <map:parameter name="foo2" value="{foo}"/>
+ </map:generate>
+ </map:generator>
+ <map:generator name="virtual3" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
+ <map:source param="source"/>
+ <map:generate type="jx" src="vpc-source-param.xml">
+ <map:parameter name="source" value="{source}"/>
+ <map:parameter name="foo2" value="{foo}"/>
+ </map:generate>
+ </map:generator>
+ <map:generator name="virtual4" src="org.apache.cocoon.generation.VirtualPipelineGenerator">
+ <map:generate src="{src}"/>
+ </map:generator>
+ </map:generators>
+
+ <map:transformers default="xslt">
+ <map:transformer name="xslt" src="org.apache.cocoon.transformation.TraxTransformer">
+ <xslt-processor-role>xalan</xslt-processor-role>
+ </map:transformer>
+ </map:transformers>
+
+ <map:serializers default="xml">
+ <map:serializer mime-type="text/xml" name="xml" src="org.apache.cocoon.serialization.XMLSerializer"/>
+ </map:serializers>
+
+ <map:matchers default="wildcard">
+ <map:matcher name="wildcard" src="org.apache.cocoon.matching.WildcardURIMatcher"/>
+ </map:matchers>
+
+ <map:pipes default="noncaching">
+ <map:pipe name="noncaching" src="org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline">
+ </map:pipe>
+ </map:pipes>
+ </map:components>
+
+ <map:pipelines>
+ <map:pipeline>
+
+ <map:match pattern="test">
+ <map:generate type="file" src="vpc-test.xml"/>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match pattern="v1">
+ <map:generate type="virtual1"/>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match pattern="v2">
+ <map:generate type="virtual2">
+ <map:parameter name="foo" value="bar"/>
+ </map:generate>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match pattern="v3">
+ <map:generate type="virtual3">
+ <map:parameter name="source" value="vpc-test.xml"/>
+ <map:parameter name="foo" value="bar"/>
+ </map:generate>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match pattern="sub/**">
+ <map:mount uri-prefix="sub"
+ src="resource://org/apache/cocoon/generation/sub/"/>
+ </map:match>
+
+ <map:match pattern="v4">
+ <map:generate type="virtual4" src="vpc-test.xml"/>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ </map:pipeline>
+ </map:pipelines>
+</map:sitemap>
Added: cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml?view=auto&rev=160323
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml (added)
+++ cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml Wed Apr 6 13:06:56 2005
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><test source="module:environment-attribute:env-prefix-generator-source-map-virtual3#source" foo2="bar"/>
\ No newline at end of file
Propchange: cocoon/trunk/src/test/org/apache/cocoon/generation/vpc-source-param-expected.xml
------------------------------------------------------------------------------
svn:keywords = Id
Re: svn commit: r160323 - in cocoon/trunk/src: java/org/apache/cocoon/components/modules/input/
java/org/apache/cocoon/components/treeprocessor/sitemap/ java/org/apache/cocoon/generation/
java/org/apache/cocoon/sitemap/impl/ test/org/apache/cocoon/generation/ test/org/apache/cocoon/generation/sub/
Posted by Daniel Fagerstrom <da...@nada.kth.se>.
Vadim Gritsenko wrote:
> danielf@apache.org wrote:
>
>>
>> Modified:
>> cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java
>
>
<snip/>
> etc. So, what has changed?
If you wonder what has changed since my last revision: I stored sources
from the calling pipeline in the Avalon context before, but then they
had dissapeared when the VPC needed them so I store them in the
environment instead. Don't know if that is the best place. I had missed
that a superclass of VPCNodeBuilder was threadsafe, and got problems as
soon as I used more than one VPC. I factored out the VPC common stuff
from the VirtualPipelineGenerator to AbstractVirtualSitemapComponent to
prepare for the rest of the VPCs.
If you instead wanted a more understandable description of how
everything works, I rather wait with that untill I have done some more
stuff.
> (I bet you forgot about svn eol-style property)
Fixed now :)
/Daniel
Re: svn commit: r160323 - in cocoon/trunk/src: java/org/apache/cocoon/components/modules/input/
java/org/apache/cocoon/components/treeprocessor/sitemap/ java/org/apache/cocoon/generation/
java/org/apache/cocoon/sitemap/impl/ test/org/apache/cocoon/generation/ test/org/apache/cocoon/generation/sub/
Posted by Vadim Gritsenko <va...@reverycodes.com>.
danielf@apache.org wrote:
>
> Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java
> URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java?view=diff&r1=160322&r2=160323
> ==============================================================================
> --- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java (original)
> +++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/VPCNode.java Wed Apr 6 13:06:56 2005
> @@ -1,40 +1,40 @@
> -/*
> - * 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.
> - */
> -package org.apache.cocoon.components.treeprocessor.sitemap;
> -
> -import java.util.Set;
> -
> -import org.apache.cocoon.components.treeprocessor.NamedContainerNode;
> -
> -/**
> - * A VPC node that just invokes its children and store what parameters are sources.
> - *
> - * @version $Id$
> - */
> -
> -public class VPCNode extends NamedContainerNode {
> -
> - Set sourceSet;
> -
> - public VPCNode(String name, Set sourceSet) {
> - super(name);
> - this.sourceSet = sourceSet;
> - }
> -
> - public Set getSources() {
> - return this.sourceSet;
> - }
> -}
> +/*
> + * 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.
> + */
> +package org.apache.cocoon.components.treeprocessor.sitemap;
> +
> +import java.util.Set;
> +
> +import org.apache.cocoon.components.treeprocessor.NamedContainerNode;
> +
> +/**
> + * A VPC node that just invokes its children and store what parameters are sources.
> + *
> + * @version $Id$
> + */
> +
> +public class VPCNode extends NamedContainerNode {
> +
> + Set sourceSet;
> +
> + public VPCNode(String name, Set sourceSet) {
> + super(name);
> + this.sourceSet = sourceSet;
> + }
> +
> + public Set getSources() {
> + return this.sourceSet;
> + }
> +}
etc. So, what has changed? (I bet you forgot about svn eol-style property)
Vadim