Hi,

first sorry to send you the diff files over the mailing list, but I
have some troubles with my firewall at home, so some IP adresses were
blocked, including http://nagoya.apache.org/bugzilla/ :(

To the components...  The components are now using the transient store for
the fragments instead of storing the fragments direct in the classes.
The components also uses the XML(De)Serialer for building the fragments
instead of using the DOMBuilder.

I hope this helps you, Stephan Michels.
Index: src/java/org/apache/cocoon/generation/FragmentExtractorGenerator.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/java/org/apache/cocoon/generation/FragmentExtractorGenerator.java,v

retrieving revision 1.7
diff -u -r1.7 FragmentExtractorGenerator.java
--- src/java/org/apache/cocoon/generation/FragmentExtractorGenerator.java       22 Feb 
2002 07:03:51 -0000      1.7
+++ src/java/org/apache/cocoon/generation/FragmentExtractorGenerator.java       18 May 
+2002 08:51:32 -0000
@@ -50,23 +50,20 @@
 */
 package org.apache.cocoon.generation;
 
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.cocoon.Constants;
+import org.apache.avalon.framework.component.ComponentException;
+
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.caching.CacheValidity;
 import org.apache.cocoon.caching.Cacheable;
 import org.apache.cocoon.caching.NOPCacheValidity;
-import org.apache.cocoon.environment.AbstractEnvironment;
-import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.components.sax.XMLDeserializer;
 import org.apache.cocoon.util.HashUtil;
-import org.apache.cocoon.xml.dom.DOMStreamer;
-import org.w3c.dom.Document;
+
+import org.apache.excalibur.store.Store;
+
 import org.xml.sax.SAXException;
 
 import java.io.IOException;
-import java.rmi.server.UID;
-import java.util.HashMap;
-import java.util.Map;
 
 /** The generation half of FragmentExtractor.
  * FragmentExtractor is a transformer-generator pair which is designed to allow
@@ -78,33 +75,13 @@
  * This is by no means complete yet, but it should prove useful, particularly
  * for offline generation.
  * <p>
- * <b><em>Warning</em> : since fragments are stored locally in the class, this 
generator
- * and the associated transformer are very likely to fail on a clustered server.</b>
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Paul Russell</a>
  * @version CVS $Id: FragmentExtractorGenerator.java,v 1.7 2002/02/22 07:03:51 
cziegeler Exp $
  */
-public class FragmentExtractorGenerator extends AbstractGenerator
+public class FragmentExtractorGenerator extends ComposerGenerator
         implements Cacheable {
 
-    /** The fragment store. */
-    private static Map fragmentStore = new HashMap();
-
-    /** flag for cleanup */
-    boolean cleanupStore = true;
-
-    public void setup(SourceResolver resolver, Map objectModel, String src, 
Parameters par)
-        throws ProcessingException, SAXException, IOException {
-        super.setup(resolver,objectModel,src,par);
-
-        // Fix for commandline generation.
-        // Don't cleanup the store if we are in LINK_VIEW
-        AbstractEnvironment env = (AbstractEnvironment) resolver;
-        String view = env.getView();
-        if(view != null && view.equals(Constants.LINK_VIEW))
-            cleanupStore = false;
-    }
-
     /**
      * Generate the unique key.
      * This key must be unique inside the space of this component.
@@ -129,34 +106,28 @@
         // Obtain the fragmentID  (which is simply the filename portion of the 
source)
         getLogger().debug("FragmentExtractorGenerator retrieving document " + source 
+ ".");
 
-        synchronized (FragmentExtractorGenerator.fragmentStore) {
-            Document doc = (Document) 
FragmentExtractorGenerator.fragmentStore.get(source);
-
-            if(doc == null)
-                throw new SAXException("Could not find fragment " + source + ".");
-
-            DOMStreamer streamer = new 
DOMStreamer(this.contentHandler,this.lexicalHandler);
-
-            streamer.stream(doc);
-            // Fix for commandline generation.
-            // Don't cleanup the store if we are in LINK_VIEW
-            if(cleanupStore)
-                FragmentExtractorGenerator.fragmentStore.remove(source);
-        }
-    }
-
-    public static String store(Document doc) {
-        String id = (new UID()).toString();
-
-        // Cannot create File names with a ':' (in command-line generation)
-        // So replace ':' with '-'
-        id = id.replace(':','-');
-
-        synchronized (FragmentExtractorGenerator.fragmentStore) {
-            fragmentStore.put(id,doc);
+        Store store = null;
+        XMLDeserializer deserializer = null;
+        Object fragment = null;
+        try {
+            store = (Store) this.manager.lookup(Store.TRANSIENT_STORE);
+            fragment = store.get(source);
+
+            if (fragment==null)
+              throw new SAXException("Could not find frament with id " + source + " 
+in store");
+
+            deserializer = (XMLDeserializer) 
+this.manager.lookup(XMLDeserializer.ROLE);
+            deserializer.setConsumer(this.xmlConsumer);
+            deserializer.deserialize(fragment);
+
+        } catch (ComponentException ce) {
+            getLogger().error("Could not lookup for component.", ce);
+            throw new SAXException("Could not lookup for component.", ce);
+        } finally
+        {
+            this.manager.release(store);
+            this.manager.release(deserializer);
         }
-
-        return id;
     }
 }
 
Index: src/java/org/apache/cocoon/transformation/FragmentExtractorTransformer.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/java/org/apache/cocoon/transformation/FragmentExtractorTransformer.java,v

retrieving revision 1.13
diff -u -r1.13 FragmentExtractorTransformer.java
--- src/java/org/apache/cocoon/transformation/FragmentExtractorTransformer.java 22 Feb 
2002 07:03:56 -0000      1.13
+++ src/java/org/apache/cocoon/transformation/FragmentExtractorTransformer.java 18 May 
+2002 08:52:21 -0000
@@ -50,6 +50,11 @@
 */
 package org.apache.cocoon.transformation;
 
+import org.apache.avalon.excalibur.pool.Recyclable;
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.Composable;
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -59,11 +64,14 @@
 import org.apache.cocoon.caching.CacheValidity;
 import org.apache.cocoon.caching.Cacheable;
 import org.apache.cocoon.caching.NOPCacheValidity;
+import org.apache.cocoon.components.sax.XMLSerializer;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.generation.FragmentExtractorGenerator;
-import org.apache.cocoon.xml.dom.DOMBuilder;
+import org.apache.cocoon.util.HashUtil;
+
+import org.apache.excalibur.store.Store;
 
-import org.w3c.dom.Document;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
@@ -87,14 +95,12 @@
  *   &lt;extract-element&gt;my-element&lt;/extract-element&gt;
  * </pre>
  * <p>
- * <b><em>Warning</em> : since fragments are stored locally in the class, this 
transformer
- * and the associated generator are very likely to fail on a clustered server.</b>
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Paul Russell</a>
  * @version CVS $Id: FragmentExtractorTransformer.java,v 1.13 2002/02/22 07:03:56 
cziegeler Exp $
  */
 public class FragmentExtractorTransformer extends AbstractTransformer
-    implements Cacheable, Configurable {
+    implements Cacheable, Configurable, Composable, Disposable, Recyclable {
 
     private static final String EXTRACT_URI_NAME = "extract-uri";
     private static final String EXTRACT_ELEMENT_NAME = "extract-element";
@@ -110,7 +116,10 @@
 
     private static String generatorClass = 
"org.apache.cocoon.generation.FragmentExtractorGenerator";
 
-    private DOMBuilder currentBuilder;
+    /** The component manager instance */
+    protected ComponentManager manager = null;
+
+    private XMLSerializer serializer;
 
     private Map prefixMap;
 
@@ -118,6 +127,8 @@
 
     private int fragmentID;
 
+    private String requestURI;
+
     /**
      * Configure this transformer.
      */
@@ -138,6 +149,33 @@
         extractLevel = 0;
         fragmentID = 0;
         prefixMap = new HashMap();
+
+        this.requestURI = ObjectModelHelper.getRequest(objectModel).getSitemapURI();
+    }
+
+    /**
+     * Set the current <code>ComponentManager</code> instance used by this
+     * <code>Composable</code>.
+     */
+    public void compose(ComponentManager manager) throws ComponentException {
+        this.manager = manager;
+    }
+    
+    /**
+     * Release all resources.
+     */
+    public void dispose() {
+        this.manager.release(serializer);
+        this.serializer = null;
+        this.manager = null;
+    }
+    
+    /**
+     * Recycle this component
+     */
+    public void recycle() {
+        this.manager.release(serializer);
+        this.serializer = null;
     }
 
     /**
@@ -186,7 +224,7 @@
             super.startPrefixMapping(prefix,uri);
             prefixMap.put(prefix,uri);
         } else {
-            this.currentBuilder.startPrefixMapping(prefix,uri);
+            this.serializer.startPrefixMapping(prefix,uri);
         }
     }
 
@@ -201,7 +239,7 @@
             super.endPrefixMapping(prefix);
             prefixMap.remove(prefix);
         } else {
-            this.currentBuilder.endPrefixMapping(prefix);
+            this.serializer.endPrefixMapping(prefix);
         }
     }
 
@@ -225,13 +263,20 @@
             fragmentID++;
             getLogger().debug("FragmentExtractorTransformer extractLevel now " + 
extractLevel + ".");
 
+            try {
+                this.serializer = (XMLSerializer) 
+this.manager.lookup(XMLSerializer.ROLE);
+            } catch (ComponentException ce) {
+                getLogger().error("Could not lookup for XMLSerializer.", ce);
+                throw new SAXException("Could not lookup for XMLSerializer.", ce);
+            }
+
             // Start the DOM document
-            this.currentBuilder = new DOMBuilder();
-            this.currentBuilder.startDocument();
+            this.serializer.startDocument();
+
             Iterator itt = prefixMap.entrySet().iterator();
             while (itt.hasNext()) {
                 Map.Entry entry = (Map.Entry)itt.next();
-                this.currentBuilder.startPrefixMapping(
+                this.serializer.startPrefixMapping(
                     (String)entry.getKey(),
                     (String)entry.getValue()
                 );
@@ -241,7 +286,7 @@
         if (extractLevel == 0) {
             super.startElement(uri,loc,raw,a);
         } else {
-            this.currentBuilder.startElement(uri,loc,raw,a);
+            this.serializer.startElement(uri,loc,raw,a);
         }
     }
 
@@ -262,24 +307,41 @@
         if (extractLevel == 0) {
             super.endElement(uri,loc,raw);
         } else {
-            this.currentBuilder.endElement(uri,loc,raw);
+            this.serializer.endElement(uri,loc,raw);
             if (this.extractURI.equals(uri) && this.extractElement.equals(loc)) {
                 extractLevel--;
                 getLogger().debug("FragmentExtractorTransformer extractLevel now " + 
extractLevel + ".");
 
                 if (extractLevel == 0) {
-                    // finish building the DOM. remove existing prefix mappings.
+                    // finish building the fragment. remove existing prefix mappings.
                     Iterator itt = prefixMap.entrySet().iterator();
                     while (itt.hasNext()) {
                         Map.Entry entry = (Map.Entry) itt.next();
-                        this.currentBuilder.endPrefixMapping(
+                        this.serializer.endPrefixMapping(
                             (String)entry.getKey()
                         );
                     }
-                    this.currentBuilder.endDocument();
+                    this.serializer.endDocument();
 
-                    Document doc = this.currentBuilder.getDocument();
-                    String id = FragmentExtractorGenerator.store(doc);
+                    Store store = null;
+                    String id = 
+Long.toHexString((hashCode()^HashUtil.hash(requestURI))+fragmentID);
+                    try {
+                        store = (Store) this.manager.lookup(Store.TRANSIENT_STORE);
+
+                        store.store(id, this.serializer.getSAXFragment()); 
+                    } catch (ComponentException ce) {
+                        getLogger().error("Could not lookup for transient store.", 
+ce);
+                        throw new SAXException("Could not lookup for transient 
+store.", ce);
+                    } catch (IOException ioe) {
+                        getLogger().error("Could not store fragment.", ioe);
+                        throw new SAXException("Could not store fragment.", ioe);
+                    } finally
+                    {
+                        this.manager.release(store);
+                        this.manager.release(this.serializer);
+                        this.serializer = null;
+                    }
+               
                     getLogger().debug("FragmentExtractorTransformer stored document " 
+ id + ".");
 
                     // Insert ref.
@@ -306,7 +368,7 @@
         if (extractLevel == 0) {
             super.characters(c,start,len);
         } else {
-            this.currentBuilder.characters(c,start,len);
+            this.serializer.characters(c,start,len);
         }
     }
 
@@ -322,7 +384,7 @@
         if (extractLevel == 0) {
             super.ignorableWhitespace(c,start,len);
         } else {
-            this.currentBuilder.ignorableWhitespace(c,start,len);
+            this.serializer.ignorableWhitespace(c,start,len);
         }
     }
 
@@ -338,7 +400,7 @@
         if (extractLevel == 0) {
             super.processingInstruction(target,data);
         } else {
-            this.currentBuilder.processingInstruction(target,data);
+            this.serializer.processingInstruction(target,data);
         }
     }
 
@@ -353,7 +415,7 @@
         if (extractLevel == 0) {
             super.skippedEntity(name);
         } else {
-            this.currentBuilder.skippedEntity(name);
+            this.serializer.skippedEntity(name);
         }
     }
 
@@ -402,7 +464,7 @@
         if (extractLevel == 0) {
             super.startEntity(name);
         } else {
-            this.currentBuilder.startEntity(name);
+            this.serializer.startEntity(name);
         }
     }
 
@@ -416,7 +478,7 @@
         if (extractLevel == 0) {
             super.endEntity(name);
         } else {
-            this.currentBuilder.endEntity(name);
+            this.serializer.endEntity(name);
         }
     }
 
@@ -428,7 +490,7 @@
         if (extractLevel == 0) {
             super.startCDATA();
         } else {
-            this.currentBuilder.startCDATA();
+            this.serializer.startCDATA();
         }
     }
 
@@ -440,7 +502,7 @@
         if (extractLevel == 0) {
             super.endCDATA();
         } else {
-            this.currentBuilder.endCDATA();
+            this.serializer.endCDATA();
         }
     }
 
@@ -456,7 +518,7 @@
         if (extractLevel == 0) {
             super.comment(ch,start,len);
         } else {
-            this.currentBuilder.comment(ch,start,len);
+            this.serializer.comment(ch,start,len);
         }
     }
 
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to