You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2006/12/26 18:44:15 UTC

svn commit: r490341 - in /cocoon/trunk/core/cocoon-core/src: main/java/org/apache/cocoon/generation/ main/resources/META-INF/cocoon/avalon/ main/resources/META-INF/cocoon/spring/ test/java/org/apache/cocoon/generation/

Author: cziegeler
Date: Tue Dec 26 09:44:14 2006
New Revision: 490341

URL: http://svn.apache.org/viewvc?view=rev&rev=490341
Log:
Implement file generator as spring bean; no need for special factory anymore

Added:
    cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml   (with props)
Removed:
    cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGeneratorFactory.java
Modified:
    cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/CSVGenerator.java
    cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGenerator.java
    cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/avalon/cocoon-core-sitemapcomponents.xconf
    cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/FileGeneratorTestCase.java
    cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/PauseGenerator.java

Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/CSVGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/CSVGenerator.java?view=diff&rev=490341&r1=490340&r2=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/CSVGenerator.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/CSVGenerator.java Tue Dec 26 09:44:14 2006
@@ -30,11 +30,12 @@
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.xml.AttributesImpl;
+import org.apache.cocoon.xml.XMLUtils;
 import org.apache.excalibur.source.Source;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
 
 /**
  * <p>A simple parser converting a Comma Separated Values (CSV) file into XML.</p>
@@ -147,11 +148,11 @@
     }
 
     /**
-     * <p>Recycle this component.</p>.
+     * @see org.apache.cocoon.generation.FileGenerator#dispose()
      */
-    public void recycle() {
-        super.recycle();
-        
+    public void dispose() {
+        super.dispose();
+
         this.encoding = DEFAULT_ENCODING;
         this.separator = DEFAULT_SEPARATOR.charAt(0);
         this.escape = DEFAULT_ESCAPE.charAt(0);
@@ -208,9 +209,9 @@
 
         try {
             /* Start the document */
-            this.contentHandler.setDocumentLocator(csv);
-            this.contentHandler.startDocument();
-            this.contentHandler.startPrefixMapping(NAMESPACE_PREFIX, NAMESPACE_URI);
+            this.consumer.setDocumentLocator(csv);
+            this.consumer.startDocument();
+            this.consumer.startPrefixMapping(NAMESPACE_PREFIX, NAMESPACE_URI);
             this.indent(0);
             this.startElement("document");
 
@@ -266,8 +267,8 @@
             /* Terminate the document */
             this.indent(0);
             this.endElement("document");
-            this.contentHandler.endPrefixMapping(NAMESPACE_PREFIX);
-            this.contentHandler.endDocument();
+            this.consumer.endPrefixMapping(NAMESPACE_PREFIX);
+            this.consumer.endDocument();
 
         } finally {
             csv.close();
@@ -288,7 +289,7 @@
             if (this.recordnumber > 0) {
                 AttributesImpl attributes = new AttributesImpl();
                 String value = Integer.toString(this.recordnumber);
-                attributes.addAttribute("", "number", "number", "CDATA", value);
+                attributes.addCDATAAttribute("number", value);
                 this.startElement("record", attributes);
             } else {
                 this.startElement("header");
@@ -303,7 +304,7 @@
 
         AttributesImpl attributes = new AttributesImpl();
         String value = Integer.toString(this.fieldnumber);
-        attributes.addAttribute("", "number", "number", "CDATA", value);
+        attributes.addCDATAAttribute("number", value);
 
         if (this.recordnumber < 1) {
             this.columns.put(new Integer(this.fieldnumber), new String(array));
@@ -311,12 +312,12 @@
         } else if (this.columns != null) {
             String header = (String) this.columns.get(new Integer(this.fieldnumber));
             if (header != null) {
-                attributes.addAttribute("", "column", "column", "CDATA", header);
+                attributes.addCDATAAttribute("column", header);
             }
         }
 
         this.startElement(element, attributes);
-        this.contentHandler.characters(array, 0, array.length);
+        this.consumer.characters(array, 0, array.length);
         this.endElement(element);
         this.buffer.reset();
 
@@ -339,26 +340,25 @@
 
     private void indent(int level)
     throws SAXException {
-        this.contentHandler.characters(INDENT_STRING, 0, level + 1);
+        this.consumer.characters(INDENT_STRING, 0, level + 1);
     }
 
     private void startElement(String name)
     throws SAXException {
-        this.startElement(name, new AttributesImpl());
+        this.startElement(name, XMLUtils.EMPTY_ATTRIBUTES);
     }
 
     private void startElement(String name, Attributes atts)
     throws SAXException {
         if (name == null) throw new NullPointerException("Null name");
-        if (atts == null) atts = new AttributesImpl();
         String qual = NAMESPACE_PREFIX + ':' + name;
-        this.contentHandler.startElement(NAMESPACE_URI, name, qual, atts);
+        this.consumer.startElement(NAMESPACE_URI, name, qual, (atts == null ? XMLUtils.EMPTY_ATTRIBUTES : atts));
     }
 
     private void endElement(String name)
     throws SAXException {
         String qual = NAMESPACE_PREFIX + ':' + name;
-        this.contentHandler.endElement(NAMESPACE_URI, name, qual);
+        this.consumer.endElement(NAMESPACE_URI, name, qual);
     }
 
     private static final class CSVReader extends Reader implements Locator {
@@ -369,7 +369,7 @@
         private int line = 1;
         private int last = -1;
 
-        private CSVReader(Source source, String encoding, int buffer)
+        protected CSVReader(Source source, String encoding, int buffer)
         throws IOException {
             InputStream stream = source.getInputStream();
             Reader reader = new InputStreamReader(stream, encoding);

Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGenerator.java?view=diff&rev=490341&r1=490340&r2=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGenerator.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/generation/FileGenerator.java Tue Dec 26 09:44:14 2006
@@ -20,7 +20,11 @@
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.caching.CacheableProcessingComponent;
 import org.apache.cocoon.components.source.SourceUtil;
+import org.apache.cocoon.core.xml.SAXParser;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.sitemap.DisposableSitemapComponent;
+import org.apache.cocoon.util.AbstractLogEnabled;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceException;
 import org.apache.excalibur.source.SourceValidity;
@@ -36,50 +40,64 @@
  * and generates SAX Events. The <code>FileGenerator</code> implements the
  * <code>CacheableProcessingComponent</code> interface.
  *
- * <br>See {@link FileGeneratorFactory} for thread safe implementation of this
- * component.
- *
  * @cocoon.sitemap.component.name   file
  * @cocoon.sitemap.component.label  content
  * @cocoon.sitemap.component.logger sitemap.generator.file
  * @cocoon.sitemap.component.documentation.caching
  *     Uses the last modification date of the xml document for validation
  *
- * @cocoon.sitemap.component.pooling.max  32
- *
  * @version $Id$
  */
-public class FileGenerator extends ServiceableGenerator
-                           implements CacheableProcessingComponent {
+public class FileGenerator
+    extends AbstractLogEnabled
+    implements Generator, CacheableProcessingComponent, DisposableSitemapComponent {
 
     /** The input source */
     protected Source inputSource;
 
+    /** The source resolver. */
+    protected SourceResolver resolver;
+
+    /** The consumer. */
+    protected XMLConsumer consumer;
+
+    /** The SAX Parser. */
+    protected SAXParser parser;
+
+    public void setParser(SAXParser parser) {
+        this.parser = parser;
+    }
+
     /**
-     * Recycle this component.
-     * All instance variables are set to <code>null</code>.
+     * @see org.apache.cocoon.sitemap.DisposableSitemapComponent#dispose()
      */
-    public void recycle() {
-        if (null != this.inputSource) {
-            super.resolver.release(this.inputSource);
+    public void dispose() {
+        if ( this.inputSource != null ) {
+            this.resolver.release(this.inputSource);
             this.inputSource = null;
         }
-        super.recycle();
+        this.resolver = null;
+        this.consumer = null;
     }
 
     /**
      * Setup the file generator.
      * Try to get the last modification date of the source for caching.
+     *
+     * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
      */
     public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
     throws ProcessingException, SAXException, IOException {
-
-        super.setup(resolver, objectModel, src, par);
+        this.resolver = resolver;
         try {
-            this.inputSource = super.resolver.resolveURI(src);
+            this.inputSource = this.resolver.resolveURI(src);
         } catch (SourceException se) {
             throw SourceUtil.handle("Error during resolving of '" + src + "'.", se);
         }
+        if (getLogger().isDebugEnabled()) {
+            getLogger().debug("Source " + src +
+                              " resolved to " + this.inputSource.getURI());
+        }
     }
 
     /**
@@ -103,17 +121,19 @@
     }
 
     /**
+     * @see org.apache.cocoon.xml.XMLProducer#setConsumer(org.apache.cocoon.xml.XMLConsumer)
+     */
+    public void setConsumer(XMLConsumer consumer) {
+        this.consumer = consumer;
+    }
+
+    /**
      * Generate XML data.
      */
     public void generate()
     throws IOException, SAXException, ProcessingException {
-
         try {
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("Source " + super.source +
-                                  " resolved to " + this.inputSource.getURI());
-            }
-            SourceUtil.parse(this.manager, this.inputSource, super.xmlConsumer);
+            this.parser.parse(SourceUtil.getInputSource(this.inputSource), this.consumer);
         } catch (SAXException e) {
             SourceUtil.handleSAXException(this.inputSource.getURI(), e);
         }

Modified: cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/avalon/cocoon-core-sitemapcomponents.xconf
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/avalon/cocoon-core-sitemapcomponents.xconf?view=diff&rev=490341&r1=490340&r2=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/avalon/cocoon-core-sitemapcomponents.xconf (original)
+++ cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/avalon/cocoon-core-sitemapcomponents.xconf Tue Dec 26 09:44:14 2006
@@ -53,7 +53,6 @@
      | All components follow this scheme.
      +-->
  <map:generators default="file">
-   <map:generator label="content" logger="sitemap.generator.file" name="file" pool-max="32" src="org.apache.cocoon.generation.FileGenerator"/>
    <map:generator label="content" logger="sitemap.generator.directory" name="directory" pool-max="16" src="org.apache.cocoon.generation.DirectoryGenerator"/>
    <map:generator label="content" logger="sitemap.generator.xpathdirectory" name="xpathdirectory" src="org.apache.cocoon.generation.XPathDirectoryGenerator"/>
    <map:generator label="content" logger="sitemap.generator.traversable" name="traversable" pool-max="16" src="org.apache.cocoon.generation.TraversableGenerator"/>

Added: cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml?view=auto&rev=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml (added)
+++ cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml Tue Dec 26 09:44:14 2006
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
+    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<!--
+  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.
+-->
+
+<!-- @version $Id$ -->
+<beans>
+  <bean name="org.apache.cocoon.generation.Generator/file"
+        class="org.apache.cocoon.generation.FileGenerator"
+        scope="prototype">
+    <property name="parser" ref="org.apache.cocoon.core.xml.SAXParser"/>
+  </bean>
+
+</beans>
\ No newline at end of file

Propchange: cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/cocoon/spring/cocoon-core-generators.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/FileGeneratorTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/FileGeneratorTestCase.java?view=diff&rev=490341&r1=490340&r2=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/FileGeneratorTestCase.java (original)
+++ cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/FileGeneratorTestCase.java Tue Dec 26 09:44:14 2006
@@ -23,9 +23,9 @@
 
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.cocoon.MockLogger;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.components.source.SourceUtil;
+import org.apache.cocoon.core.xml.impl.JaxpSAXParser;
 import org.apache.cocoon.environment.SourceResolver;
 import org.apache.cocoon.xml.WhitespaceFilter;
 import org.apache.cocoon.xml.dom.DOMBuilder;
@@ -76,7 +76,6 @@
         Parameters parameters = new Parameters();
         String result = "resource://org/apache/cocoon/generation/FileGeneratorTestCase.source.xml";
         FileGenerator generator = new FileGenerator();
-        generator.enableLogging(new MockLogger(generator.getClass()));
         manager.expects(atLeastOnce()).method("lookup").with(same(SAXParser.ROLE)).
                 will(returnValue(parser));
         manager.expects(once()).method("release").with(same(parser));
@@ -85,7 +84,7 @@
         resolver.expects(once()).method("resolveURI").with(same(src)).
                 will(returnValue(source));
         resolver.expects(once()).method("release").with(same(source));
-        generator.service((ServiceManager) manager.proxy());
+        generator.setParser(new JaxpSAXParser());
         generator.setup((SourceResolver) resolver.proxy(), objectModel, src, parameters);
         DOMBuilder builder = new DOMBuilder();
         generator.setConsumer(new WhitespaceFilter(builder));

Modified: cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/PauseGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/PauseGenerator.java?view=diff&rev=490341&r1=490340&r2=490341
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/PauseGenerator.java (original)
+++ cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/generation/PauseGenerator.java Tue Dec 26 09:44:14 2006
@@ -17,8 +17,11 @@
 package org.apache.cocoon.generation;
 
 import java.io.IOException;
+import java.util.Map;
 
+import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.SourceResolver;
 import org.apache.cocoon.generation.FileGenerator;
 import org.xml.sax.SAXException;
 
@@ -34,17 +37,34 @@
 public class PauseGenerator 
     extends FileGenerator {
 
+    protected long secs;
 
+    /**
+     * @see org.apache.cocoon.generation.FileGenerator#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
+     */
+    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException {
+        super.setup(resolver, objectModel, src, par);
+        this.secs = par.getParameterAsLong("pause", 60);
+    }
+
+    /**
+     * @see org.apache.cocoon.generation.FileGenerator#generate()
+     */
     public void generate()
     throws IOException, SAXException, ProcessingException {
-        long secs = this.parameters.getParameterAsLong("pause", 60);
-        this.getLogger().debug("Waiting for " + secs + " secs.");
+        if ( this.getLogger().isDebugEnabled() ) {
+            this.getLogger().debug("Waiting for " + secs + " secs.");
+        }
         try {
             Thread.sleep(secs * 1000);
         } catch (InterruptedException ie) {
+            // ignore
+        }
+        if ( this.getLogger().isDebugEnabled() ) {
+            this.getLogger().debug("Finished waiting.");
         }
-        this.getLogger().debug("Finished waiting.");
         super.generate();
     }
+
 
 }