You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2008/04/14 16:04:15 UTC

svn commit: r647802 - in /cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline: ./ component/ resource/

Author: reinhard
Date: Mon Apr 14 07:04:07 2008
New Revision: 647802

URL: http://svn.apache.org/viewvc?rev=647802&view=rev
Log:
COCOON-2195 Apply Steven's patch:

. add an abstract transformers implementation as base class for transformers
. add XSLT transformer
. tidy up pipeline implementations
. add content-type handling

Added:
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java   (with props)
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java   (with props)
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java   (with props)
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java   (with props)
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java   (with props)
Modified:
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/AbstractPipeline.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/CachingPipeline.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/Pipeline.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractXMLProducer.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/CachingPipelineComponent.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileGenerator.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileReaderComponent.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Finisher.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/PipelineComponent.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Starter.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLSerializer.java
    cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/resource/ClassPathResourceResolver.java

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/AbstractPipeline.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/AbstractPipeline.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/AbstractPipeline.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/AbstractPipeline.java Mon Apr 14 07:04:07 2008
@@ -39,7 +39,7 @@
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.apache.cocoon.corona.pipeline.Pipeline#addAction(org.apache.cocoon.corona.pipeline.action.Action)
      */
     public void addAction(Action action) {
@@ -48,7 +48,7 @@
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.apache.cocoon.corona.pipeline.Pipeline#addComponent(org.apache.cocoon.corona.pipeline.component.PipelineComponent)
      */
     public void addComponent(PipelineComponent pipelineComponent) {
@@ -57,28 +57,27 @@
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.apache.cocoon.corona.pipeline.Pipeline#execute(OutputStream)
      */
     public void execute(Map<String, Object> parameters, OutputStream outputStream) throws Exception {
-        // execute the actions first
-        for (Action action : this.actions) {
-            action.execute(parameters);
-        }
+        this.invokeActions(parameters);
 
-        // now setup the components
-        this.setupComponents(outputStream);
+        this.setupComponents(parameters, outputStream);
 
-        // and execute the Starter
-        Starter starter = (Starter) this.components.getFirst();
-        starter.execute(parameters);
+        this.invokeStarter();
     }
 
     protected LinkedList<PipelineComponent> getComponents() {
         return this.components;
     }
 
-    protected void setupComponents(OutputStream outputStream) {
+    protected void invokeStarter() {
+        Starter starter = (Starter) this.components.getFirst();
+        starter.execute();
+    }
+
+    protected void setupComponents(Map<String, Object> parameters, OutputStream outputStream) {
         PipelineComponent first = this.components.getFirst();
 
         // first component must be a Starter
@@ -95,19 +94,29 @@
         // now try to link the components, always two components at a time
         // start at the first component
         PipelineComponent currentComponent = first;
+        first.setInputParameters(parameters);
+
         // next component to link is the second in the list
         for (ListIterator<PipelineComponent> i = this.components.listIterator(1); i.hasNext();) {
             // link the current with the next component
             PipelineComponent nextComponent = i.next();
             this.linkComponents(currentComponent, nextComponent);
+
             // now advance to the next component
             currentComponent = nextComponent;
+            currentComponent.setInputParameters(parameters);
         }
 
         // configure the finisher
         ((Finisher) last).setOutputStream(outputStream);
     }
 
+    protected void invokeActions(Map<String, Object> parameters) throws Exception {
+        for (Action action : this.actions) {
+            action.execute(parameters);
+        }
+    }
+
     private void linkComponents(PipelineComponent firstComponent, PipelineComponent secondComponent) {
         // first component must be a Producer
         if (!(firstComponent instanceof Producer)) {
@@ -121,5 +130,11 @@
 
         // let the Producer accept the Consumer (the Producer might reject it)
         ((Producer) firstComponent).setConsumer((Consumer) secondComponent);
+    }
+
+    public String getContentType() {
+        Finisher last = (Finisher) this.components.getLast();
+        System.out.println("Retrieving mime-type from component " + last);
+        return last.getContentType();
     }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/CachingPipeline.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/CachingPipeline.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/CachingPipeline.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/CachingPipeline.java Mon Apr 14 07:04:07 2008
@@ -36,9 +36,14 @@
 
     @Override
     public void execute(Map<String, Object> parameters, OutputStream outputStream) throws Exception {
-        // construct the current cache key
-        CacheKey cacheKey = this.constructCacheKey(parameters);
+        this.invokeActions(parameters);
+
+        // create a caching output stream to intercept the result
+        CachingOutputStream cachingOutputStream = new CachingOutputStream(outputStream);
+        this.setupComponents(parameters, cachingOutputStream);
 
+        // construct the current cache key
+        CacheKey cacheKey = this.constructCacheKey();
         // checked for a cached value first
         CacheValue cachedValue = this.getCachedValue(cacheKey);
         if (cachedValue != null) {
@@ -47,26 +52,27 @@
             return;
         }
 
-        // create a caching output stream to intercept the result
-        CachingOutputStream cachingOutputStream = new CachingOutputStream(outputStream);
         // execute the pipeline
-        super.execute(parameters, cachingOutputStream);
+        this.invokeStarter();
 
-        this.pipelineCache.put(cacheKey, new CompleteCacheValue(cachingOutputStream.getContent()));
+        // cache the result
+        if (cacheKey != null) {
+            this.pipelineCache.put(cacheKey, new CompleteCacheValue(cachingOutputStream.getContent()));
+        }
     }
 
     public void setPipelineCache(PipelineCache pipelineCache) {
         this.pipelineCache = pipelineCache;
     }
 
-    private CacheKey constructCacheKey(Map<String, Object> parameters) {
+    private CacheKey constructCacheKey() {
         CompoundCacheKey result = new CompoundCacheKey();
 
         for (PipelineComponent pipelineComponent : this.getComponents()) {
             if (pipelineComponent instanceof CachingPipelineComponent) {
                 CachingPipelineComponent cachablePipelineComponent = (CachingPipelineComponent) pipelineComponent;
 
-                result.addCacheKey(cachablePipelineComponent.constructCacheKey(parameters));
+                result.addCacheKey(cachablePipelineComponent.constructCacheKey());
                 continue;
             }
 

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/Pipeline.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/Pipeline.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/Pipeline.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/Pipeline.java Mon Apr 14 07:04:07 2008
@@ -32,4 +32,5 @@
 
     void execute(Map<String, Object> parameters, OutputStream outputStream) throws Exception;
 
+    String getContentType();
 }

Added: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java?rev=647802&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java (added)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java Mon Apr 14 07:04:07 2008
@@ -0,0 +1,96 @@
+/*
+ * 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.corona.pipeline.component;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+public abstract class AbstractTransformer extends AbstractXMLProducer implements XMLConsumer {
+
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        this.getXMLConsumer().characters(ch, start, length);
+    }
+
+    public void comment(char[] ch, int start, int length) throws SAXException {
+        this.getXMLConsumer().comment(ch, start, length);
+    }
+
+    public void endCDATA() throws SAXException {
+        this.getXMLConsumer().endCDATA();
+    }
+
+    public void endDocument() throws SAXException {
+        this.getXMLConsumer().endDocument();
+    }
+
+    public void endDTD() throws SAXException {
+        this.getXMLConsumer().endDTD();
+    }
+
+    public void endElement(String uri, String localName, String name) throws SAXException {
+        this.getXMLConsumer().endElement(uri, localName, name);
+    }
+
+    public void endEntity(String name) throws SAXException {
+        this.getXMLConsumer().endEntity(name);
+    }
+
+    public void endPrefixMapping(String prefix) throws SAXException {
+        this.getXMLConsumer().endPrefixMapping(prefix);
+    }
+
+    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+        this.getXMLConsumer().ignorableWhitespace(ch, start, length);
+    }
+
+    public void processingInstruction(String target, String data) throws SAXException {
+        this.getXMLConsumer().processingInstruction(target, data);
+    }
+
+    public void setDocumentLocator(Locator locator) {
+        this.getXMLConsumer().setDocumentLocator(locator);
+    }
+
+    public void skippedEntity(String name) throws SAXException {
+        this.getXMLConsumer().skippedEntity(name);
+    }
+
+    public void startCDATA() throws SAXException {
+        this.getXMLConsumer().startCDATA();
+    }
+
+    public void startDocument() throws SAXException {
+        this.getXMLConsumer().startDocument();
+    }
+
+    public void startDTD(String name, String publicId, String systemId) throws SAXException {
+        this.getXMLConsumer().startDTD(name, publicId, systemId);
+    }
+
+    public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
+        this.getXMLConsumer().startElement(uri, localName, name, atts);
+    }
+
+    public void startEntity(String name) throws SAXException {
+        this.getXMLConsumer().startEntity(name);
+    }
+
+    public void startPrefixMapping(String prefix, String uri) throws SAXException {
+        this.getXMLConsumer().startPrefixMapping(prefix, uri);
+    }
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractTransformer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractXMLProducer.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractXMLProducer.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractXMLProducer.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/AbstractXMLProducer.java Mon Apr 14 07:04:07 2008
@@ -29,23 +29,36 @@
      * 
      * @see org.apache.cocoon.corona.pipeline.component.Producer#setConsumer(org.apache.cocoon.corona.pipeline.component.Consumer)
      */
-    public void setConsumer(Consumer consumer) {
+    public final void setConsumer(Consumer consumer) {
         if (!(consumer instanceof XMLConsumer)) {
             throw new IllegalArgumentException("XMLProducer requires an XMLConsumer.");
         }
 
-        this.xmlConsumer = (XMLConsumer) consumer;
+        this.setXMLConsumer((XMLConsumer) consumer);
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setParameters(java.util.Map)
+     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setConfiguration(java.util.Map)
      */
-    public void setParameters(Map<String, ? extends Object> parameters) {
+    public void setConfiguration(Map<String, ? extends Object> parameters) {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setInputParameters(java.util.Map)
+     */
+    public void setInputParameters(Map<String, Object> parameters) {
     }
 
     protected XMLConsumer getXMLConsumer() {
         return this.xmlConsumer;
     }
+
+    protected void setXMLConsumer(XMLConsumer xmlConsumer) {
+        this.xmlConsumer = xmlConsumer;
+    }
+
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/CachingPipelineComponent.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/CachingPipelineComponent.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/CachingPipelineComponent.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/CachingPipelineComponent.java Mon Apr 14 07:04:07 2008
@@ -18,11 +18,10 @@
  */
 package org.apache.cocoon.corona.pipeline.component;
 
-import java.util.Map;
 
 import org.apache.cocoon.corona.pipeline.caching.CacheKey;
 
 public interface CachingPipelineComponent {
 
-    CacheKey constructCacheKey(Map<String, ? extends Object> parameters);
+    CacheKey constructCacheKey();
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileGenerator.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileGenerator.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileGenerator.java Mon Apr 14 07:04:07 2008
@@ -46,9 +46,9 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.CachingPipelineComponent#constructCacheKey(Map)
+     * @see org.apache.cocoon.corona.pipeline.component.CachingPipelineComponent#constructCacheKey()
      */
-    public CacheKey constructCacheKey(Map<String, ? extends Object> parameters) {
+    public CacheKey constructCacheKey() {
         try {
             return new TimestampCacheKey(this.source, this.source.openConnection().getLastModified());
         } catch (IOException e) {
@@ -62,9 +62,9 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.Starter#execute(Map)
+     * @see org.apache.cocoon.corona.pipeline.component.Starter#execute()
      */
-    public void execute(Map<String, ? extends Object> parameters) {
+    public void execute() {
         if (this.source == null) {
             // failed to resolve
             throw new IllegalArgumentException("FileGenerator cannot resolve source '" + this.source + "'");
@@ -87,10 +87,10 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.AbstractXMLProducer#setParameters(java.util.Map)
+     * @see org.apache.cocoon.corona.pipeline.component.AbstractXMLProducer#setConfiguration(java.util.Map)
      */
     @Override
-    public void setParameters(Map<String, ? extends Object> parameters) {
+    public void setConfiguration(Map<String, ? extends Object> parameters) {
         this.setSource((URL) parameters.get("source"));
     }
 

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileReaderComponent.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileReaderComponent.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileReaderComponent.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/FileReaderComponent.java Mon Apr 14 07:04:07 2008
@@ -45,9 +45,9 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.CachingPipelineComponent#constructCacheKey(java.util.Map)
+     * @see org.apache.cocoon.corona.pipeline.component.CachingPipelineComponent#constructCacheKey()
      */
-    public CacheKey constructCacheKey(Map<String, ? extends Object> parameters) {
+    public CacheKey constructCacheKey() {
         try {
             URLConnection connection = this.source.openConnection();
             return new TimestampCacheKey(this.source, connection.getLastModified());
@@ -62,9 +62,9 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.Starter#execute(Map)
+     * @see org.apache.cocoon.corona.pipeline.component.Starter#execute()
      */
-    public void execute(Map<String, ? extends Object> parameters) {
+    public void execute() {
         try {
             if (this.source == null) {
                 throw new IllegalArgumentException("FileReaderComponent has no source configured to read from.");
@@ -93,19 +93,27 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.Finisher#setOutputStream(java.io.OutputStream)
+     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setConfiguration(java.util.Map)
      */
-    public void setOutputStream(OutputStream outputStream) {
-        this.outputStream = outputStream;
+    public void setConfiguration(Map<String, ? extends Object> parameters) {
+        this.setSource((URL) parameters.get("source"));
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setParameters(java.util.Map)
+     * @see org.apache.cocoon.corona.pipeline.component.PipelineComponent#setInputParameters(java.util.Map)
      */
-    public void setParameters(Map<String, ? extends Object> parameters) {
-        this.setSource((URL) parameters.get("source"));
+    public void setInputParameters(Map<String, Object> parameters) {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.apache.cocoon.corona.pipeline.component.Finisher#setOutputStream(java.io.OutputStream)
+     */
+    public void setOutputStream(OutputStream outputStream) {
+        this.outputStream = outputStream;
     }
 
     public void setSource(URL source) {
@@ -120,5 +128,13 @@
     @Override
     public String toString() {
         return "ReaderComponent(" + this.source + ")";
+    }
+
+    public String getContentType() {
+        try {
+            return this.source.openConnection().getContentType();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Finisher.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Finisher.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Finisher.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Finisher.java Mon Apr 14 07:04:07 2008
@@ -23,4 +23,6 @@
 public interface Finisher extends PipelineComponent {
 
     void setOutputStream(OutputStream outputStream);
+
+    String getContentType();
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/PipelineComponent.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/PipelineComponent.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/PipelineComponent.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/PipelineComponent.java Mon Apr 14 07:04:07 2008
@@ -22,5 +22,7 @@
 
 public interface PipelineComponent {
 
-    void setParameters(Map<String, ? extends Object> parameters);
+    void setConfiguration(Map<String, ? extends Object> configuration);
+
+    void setInputParameters(Map<String, Object> parameters);
 }

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Starter.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Starter.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Starter.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/Starter.java Mon Apr 14 07:04:07 2008
@@ -18,10 +18,9 @@
  */
 package org.apache.cocoon.corona.pipeline.component;
 
-import java.util.Map;
 
 
 public interface Starter extends PipelineComponent {
 
-    void execute(Map<String, ? extends Object> parameters);
+    void execute();
 }

Added: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java?rev=647802&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java (added)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java Mon Apr 14 07:04:07 2008
@@ -0,0 +1,113 @@
+/*
+ * 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.corona.pipeline.component;
+
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.logging.Log;
+
+/**
+ * A smart error listener for <code>javax.xml.tranform</code> that does its best to provide useful error messages.
+ * 
+ * @version $Id$
+ */
+public class TraxErrorListener implements ErrorListener {
+
+    /** The exception we had from error() or fatalError() */
+    private TransformerException exception;
+    private final Log log;
+    private String uri;
+    /** The exception we had from warning() */
+    private TransformerException warningEx;
+
+    public TraxErrorListener(Log log, String uri) {
+        this.log = log;
+        this.uri = uri;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.xml.transform.ErrorListener#error(javax.xml.transform.TransformerException)
+     */
+    public void error(TransformerException ex) throws TransformerException {
+        // If we had a warning previoulsy, and the current exception has no cause, then use the warning.
+        // This is how Xalan behaves on <xsl:message terminate="yes">: it first issues a warning with all
+        // the useful information, then a useless "stylesheed directed termination" error.
+        if (this.warningEx != null && ex.getCause() == null) {
+            ex = this.warningEx;
+        }
+        this.warningEx = null;
+
+        // Keep the exception for later use.
+        this.exception = ex;
+        // and rethrow it
+        throw ex;
+    }
+
+    public void fatalError(TransformerException ex) throws TransformerException {
+        if (this.warningEx != null && ex.getCause() == null) {
+            ex = this.warningEx;
+        }
+        this.warningEx = null;
+
+        this.exception = ex;
+        throw ex;
+    }
+
+    /**
+     * Get the exception that was catched by this listener, if any.
+     * 
+     * @return the exception
+     */
+    public Throwable getThrowable() {
+        if (this.exception == null) {
+            return null;
+        }
+
+        // Location loc = LocationUtils.getLocation(this.exception);
+        // if (LocationUtils.isKnown(loc)) {
+        // // Has a location: don't loose this precious information!
+        // return this.exception;
+        // }
+
+        // No location: if it's just a wrapper, consider only the wrapped exception
+        if (this.exception.getCause() != null) {
+            return this.exception.getCause();
+        }
+
+        // That's the actual exception!
+        return this.exception;
+    }
+
+    public void warning(TransformerException ex) throws TransformerException {
+        // TODO: We may want here to allow some special formatting of the messages, such as
+        // "DEBUG:A debug message" or "INFO:Transforming <foo> in mode 'bar'" to use the different
+        // log levels. This can include also deprecation logs for system-defined stylesheets
+        // using "DEPRECATED:WARN:Styling 'foo' is replaced by 'bar'".
+
+        if (this.log.isWarnEnabled()) {
+            // Location loc = LocationUtils.getLocation(ex);
+            // getLogger().warn(ex.getMessage() + " at " + (loc == null ? this.uri : loc.toString()));
+            this.log.warn(ex.getMessage() + " at " + this.uri);
+        }
+
+        // Keep the warning (see below)
+        this.warningEx = ex;
+    }
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/TraxErrorListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java?rev=647802&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java (added)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java Mon Apr 14 07:04:07 2008
@@ -0,0 +1,107 @@
+/*
+ * 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.corona.pipeline.component;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+public class XMLConsumerAdapter implements XMLConsumer {
+
+    private ContentHandler contentHandler;
+    private LexicalHandler lexicalHandler;
+
+    public XMLConsumerAdapter(ContentHandler contentHandler, LexicalHandler lexicalHandler) {
+        super();
+        this.contentHandler = contentHandler;
+        this.lexicalHandler = lexicalHandler;
+    }
+
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        this.contentHandler.characters(ch, start, length);
+    }
+
+    public void comment(char[] ch, int start, int length) throws SAXException {
+        this.lexicalHandler.comment(ch, start, length);
+    }
+
+    public void endCDATA() throws SAXException {
+        this.lexicalHandler.endCDATA();
+    }
+
+    public void endDocument() throws SAXException {
+        this.contentHandler.endDocument();
+    }
+
+    public void endDTD() throws SAXException {
+        this.lexicalHandler.endDTD();
+    }
+
+    public void endElement(String uri, String localName, String name) throws SAXException {
+        this.contentHandler.endElement(uri, localName, name);
+    }
+
+    public void endEntity(String name) throws SAXException {
+        this.lexicalHandler.endEntity(name);
+    }
+
+    public void endPrefixMapping(String prefix) throws SAXException {
+        this.contentHandler.endPrefixMapping(prefix);
+    }
+
+    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+        this.contentHandler.ignorableWhitespace(ch, start, length);
+    }
+
+    public void processingInstruction(String target, String data) throws SAXException {
+        this.contentHandler.processingInstruction(target, data);
+    }
+
+    public void setDocumentLocator(Locator locator) {
+        this.contentHandler.setDocumentLocator(locator);
+    }
+
+    public void skippedEntity(String name) throws SAXException {
+        this.contentHandler.skippedEntity(name);
+    }
+
+    public void startCDATA() throws SAXException {
+        this.lexicalHandler.startCDATA();
+    }
+
+    public void startDocument() throws SAXException {
+        this.contentHandler.startDocument();
+    }
+
+    public void startDTD(String name, String publicId, String systemId) throws SAXException {
+        this.lexicalHandler.startDTD(name, publicId, systemId);
+    }
+
+    public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
+        this.contentHandler.startElement(uri, localName, name, atts);
+    }
+
+    public void startEntity(String name) throws SAXException {
+        this.lexicalHandler.startEntity(name);
+    }
+
+    public void startPrefixMapping(String prefix, String uri) throws SAXException {
+        this.contentHandler.startPrefixMapping(prefix, uri);
+    }
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLConsumerAdapter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLSerializer.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLSerializer.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLSerializer.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XMLSerializer.java Mon Apr 14 07:04:07 2008
@@ -39,6 +39,7 @@
 
     private static final SAXTransformerFactory SAX_TRANSFORMER_FACTORY = (SAXTransformerFactory) TransformerFactory.newInstance();
 
+    private String contentType;
     private Properties format = new Properties();
 
     private TransformerHandler transformerHandler;
@@ -51,7 +52,7 @@
         this.transformerHandler.comment(ch, start, length);
     }
 
-    public CacheKey constructCacheKey(Map<String, ? extends Object> parameters) {
+    public CacheKey constructCacheKey() {
         return new SimpleCacheKey();
     }
 
@@ -79,6 +80,10 @@
         this.transformerHandler.endPrefixMapping(prefix);
     }
 
+    public String getContentType() {
+        return this.contentType;
+    }
+
     public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
         this.transformerHandler.ignorableWhitespace(ch, start, length);
     }
@@ -87,6 +92,16 @@
         this.transformerHandler.processingInstruction(target, data);
     }
 
+    public void setConfiguration(Map<String, ? extends Object> parameters) {
+        if (parameters.containsKey("mime-type")) {
+            this.contentType = (String) parameters.get("mime-type");
+        }
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
     public void setDocumentLocator(Locator locator) {
         this.transformerHandler.setDocumentLocator(locator);
     }
@@ -95,6 +110,9 @@
         this.format = format;
     }
 
+    public void setInputParameters(Map<String, Object> parameters) {
+    }
+
     public void setOutputStream(OutputStream outputStream) {
         try {
             this.transformerHandler = SAX_TRANSFORMER_FACTORY.newTransformerHandler();
@@ -104,10 +122,6 @@
         } catch (TransformerConfigurationException e) {
             e.printStackTrace();
         }
-    }
-
-    public void setParameters(Map<String, ? extends Object> parameters) {
-        // currently no parameters...
     }
 
     public void skippedEntity(String name) throws SAXException {

Added: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java?rev=647802&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java (added)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java Mon Apr 14 07:04:07 2008
@@ -0,0 +1,107 @@
+/*
+ * 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.corona.pipeline.component;
+
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.logging.Log;
+
+/**
+ * A smart error listener for <code>javax.xml.tranform</code> that does its best to provide useful error messages.
+ * 
+ * @version $Id$
+ */
+public class XSLTProcessorErrorListener implements ErrorListener {
+
+    /** The exception we had from error() or fatalError() */
+    private TransformerException exception;
+    private final Log logger;
+    private final String uri;
+    /** The exception we had from warning() */
+    private TransformerException warningEx;
+
+    public XSLTProcessorErrorListener(Log logger, String uri) {
+        this.logger = logger;
+        this.uri = uri;
+    }
+
+    public void error(TransformerException ex) throws TransformerException {
+        // If we had a warning previoulsy, and the current exception has no cause, then use the warning.
+        // This is how Xalan behaves on <xsl:message terminate="yes">: it first issues a warning with all
+        // the useful information, then a useless "stylesheed directed termination" error.
+        if (this.warningEx != null && ex.getCause() == null) {
+            ex = this.warningEx;
+        }
+        this.warningEx = null;
+
+        // Keep the exception for later use.
+        this.exception = ex;
+        // and rethrow it
+        throw ex;
+    }
+
+    public void fatalError(TransformerException ex) throws TransformerException {
+        if (this.warningEx != null && ex.getCause() == null) {
+            ex = this.warningEx;
+        }
+        this.warningEx = null;
+
+        this.exception = ex;
+        throw ex;
+    }
+
+    /**
+     * Get the exception that was catched by this listener, if any.
+     * 
+     * @return the exception
+     */
+    public Throwable getThrowable() {
+        if (this.exception == null) {
+            return null;
+        }
+
+        // Location loc = LocationUtils.getLocation(this.exception);
+        // if (LocationUtils.isKnown(loc)) {
+        // // Has a location: don't loose this precious information!
+        // return this.exception;
+        // }
+
+        // No location: if it's just a wrapper, consider only the wrapped exception
+        if (this.exception.getCause() != null) {
+            return this.exception.getCause();
+        }
+
+        // That's the actual exception!
+        return this.exception;
+    }
+
+    public void warning(TransformerException ex) throws TransformerException {
+        // TODO: We may want here to allow some special formatting of the messages, such as
+        // "DEBUG:A debug message" or "INFO:Transforming <foo> in mode 'bar'" to use the different
+        // log levels. This can include also deprecation logs for system-defined stylesheets
+        // using "DEPRECATED:WARN:Styling 'foo' is replaced by 'bar'".
+
+        if (this.logger.isWarnEnabled()) {
+            // Location loc = LocationUtils.getLocation(ex);
+            // this.logger.warn(ex.getMessage() + " at " + loc == null ? this.uri : loc.toString());
+            this.logger.warn(ex.getMessage() + " at " + this.uri);
+        }
+        // Keep the warning (see below)
+        this.warningEx = ex;
+    }
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTProcessorErrorListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java?rev=647802&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java (added)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java Mon Apr 14 07:04:07 2008
@@ -0,0 +1,121 @@
+/*
+ * 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.corona.pipeline.component;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TemplatesHandler;
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class XSLTTransformer extends AbstractTransformer {
+
+    private final Log log = LogFactory.getLog(XSLTTransformer.class);
+    private Map<String, Object> parameters;
+    private URL source;
+
+    /**
+     * Test if the name is a valid parameter name for XSLT
+     */
+    private static boolean isValidXSLTParameterName(String name) {
+        return name.matches("[a-zA-Z_][\\w\\-\\.]*");
+    }
+
+    @Override
+    public void setConfiguration(Map<String, ? extends Object> parameters) {
+        this.source = (URL) parameters.get("source");
+
+        this.parameters = new HashMap<String, Object>(parameters);
+    }
+
+    @Override
+    protected void setXMLConsumer(XMLConsumer consumer) {
+        TransformerHandler transformerHandler;
+        try {
+            transformerHandler = this.createTransformerHandler();
+        } catch (Exception ex) {
+            throw new RuntimeException("Could not initialize transformer handler.", ex);
+        }
+
+        final Map<String, Object> map = this.getLogicSheetParameters();
+        if (map != null) {
+            final Transformer transformer = transformerHandler.getTransformer();
+
+            for (Entry<String, Object> entry : map.entrySet()) {
+                transformer.setParameter(entry.getKey(), entry.getValue());
+            }
+        }
+
+        final SAXResult result = new SAXResult();
+        result.setHandler(consumer);
+        // According to TrAX specs, all TransformerHandlers are LexicalHandlers
+        result.setLexicalHandler(consumer);
+        transformerHandler.setResult(result);
+
+        TraxErrorListener traxErrorListener = new TraxErrorListener(this.log, this.source.toExternalForm());
+        transformerHandler.getTransformer().setErrorListener(traxErrorListener);
+
+        super.setXMLConsumer(new XMLConsumerAdapter(transformerHandler, transformerHandler));
+    }
+
+    private TransformerHandler createTransformerHandler() throws Exception {
+        SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
+        TemplatesHandler templatesHandler = transformerFactory.newTemplatesHandler();
+
+        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+        xmlReader.setContentHandler(templatesHandler);
+        xmlReader.parse(new InputSource(this.source.toURI().toString()));
+
+        // Create transformer handler
+        final TransformerHandler handler = transformerFactory.newTransformerHandler(templatesHandler.getTemplates());
+        handler.getTransformer().setErrorListener(new XSLTProcessorErrorListener(this.log, this.source.toExternalForm()));
+        // TODO: apparently this is currently not needed
+        // handler.getTransformer().setURIResolver(this);
+
+        return handler;
+    }
+
+    private Map<String, Object> getLogicSheetParameters() {
+        if (this.parameters == null) {
+            return null;
+        }
+
+        Map<String, Object> result = new HashMap<String, Object>();
+
+        for (Entry<String, Object> entry : this.parameters.entrySet()) {
+            String name = entry.getKey();
+
+            if (isValidXSLTParameterName(name)) {
+                result.put(name, entry.getValue());
+            }
+        }
+
+        return result;
+    }
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/component/XSLTTransformer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/resource/ClassPathResourceResolver.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/resource/ClassPathResourceResolver.java?rev=647802&r1=647801&r2=647802&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/resource/ClassPathResourceResolver.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-core/src/main/java/org/apache/cocoon/corona/pipeline/resource/ClassPathResourceResolver.java Mon Apr 14 07:04:07 2008
@@ -26,14 +26,18 @@
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.apache.cocoon.corona.pipeline.resource.ResourceResolver#resolve(java.lang.String)
      */
     public URL resolve(String resource) {
         URL url = this.getClass().getResource(resource);
 
-        if (url == null && resource.charAt(0) != '/') {
+        if (url == null && !resource.startsWith("/")) {
             url = this.getClass().getResource("/" + resource);
+        }
+
+        if (url == null && !resource.startsWith("/COB-INF/")) {
+            url = this.getClass().getResource("/COB-INF/" + resource);
         }
 
         return url;