Peter Royal wrote:
> > Same problem, where are classes about caching ? I want to display what
> > is in the cache and the number of hit for each one.
> 
> You want to be looking at the debug output from the CachingEventPipeline and
> the CachingStreamPipeline. Unfortunately it does not keep statistics on the
> cache hit rate, but if you look at the debug output you can see if it did
> pick up on the cached content or not.

Here is a patch against cocoon_20_branch, I don't know if you can apply
it
on HEAD (I did not test).

Please, do NOT include it into cocoon_20_branch CVS on apache.org, it's 
working, but eat huge quantity of memory, and displayed data are raw. 
This is not for final administrators yet.

What is inside:
- New iterator() function on StoreJanitor.
- Function added in StatusGenerator to display data in each store.
- Changes on status2html stylesheet to display thoses data.

Request http://localhost:8080/cocoon/status to see the result.

Using a vanilia cocoon_20_branch, you have 3 different MRUMemoryStore
(they have a different hashCode), with about 440 objects in each.
Except for 2 object, all keys are presents in each Store.
I think there is something wrong here. Is it my code ?

-- 
Sébastien Koechlin - IVision - [EMAIL PROTECTED]
diff -u -r -x CVS 
xml-cocoon2.orig/src/org/apache/cocoon/components/store/StoreJanitor.java 
xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitor.java
--- xml-cocoon2.orig/src/org/apache/cocoon/components/store/StoreJanitor.java   Thu 
Dec  6 12:32:45 2001
+++ xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitor.java        Wed 
+Dec  5 18:40:12 2001
@@ -23,4 +23,7 @@
 
     /** unregister method for the stores */
     void unregister(Store store);
+
+    /** get an iterator to list registered stores */
+    java.util.Iterator iterator();
 }
diff -u -r -x CVS 
xml-cocoon2.orig/src/org/apache/cocoon/components/store/StoreJanitorImpl.java 
xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitorImpl.java
--- xml-cocoon2.orig/src/org/apache/cocoon/components/store/StoreJanitorImpl.java      
 Thu Dec  6 12:32:46 2001
+++ xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitorImpl.java    Wed 
+Dec  5 18:55:31 2001
@@ -16,6 +16,7 @@
 import org.apache.avalon.framework.thread.ThreadSafe;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 
 /**
  * This class is a implentation of a StoreJanitor. Store classes
@@ -168,6 +169,22 @@
             this.getLogger().debug("Unregister store instance");
             this.getLogger().debug("Size of StoreJanitor now:" + 
this.getStoreList().size());
         }
+    }
+
+    /**
+     * This method return a java.util.Iterator of every registered stores
+     * 
+     * <i>The iterators returned is fail-fast: if list is structurally
+     * modified at any time after the iterator is created, in any way, the
+     * iterator will throw a ConcurrentModificationException.  Thus, in the
+     * face of concurrent modification, the iterator fails quickly and
+     * cleanly, rather than risking arbitrary, non-deterministic behavior at
+     * an undetermined time in the future.</i>
+     *
+     * @return a java.util.Iterator
+     */
+    public Iterator iterator() {
+        return this.getStoreList().iterator();
     }
 
     /**
diff -u -r -x CVS 
xml-cocoon2.orig/src/org/apache/cocoon/generation/StatusGenerator.java 
xml-cocoon2/src/org/apache/cocoon/generation/StatusGenerator.java
--- xml-cocoon2.orig/src/org/apache/cocoon/generation/StatusGenerator.java      Thu 
Dec  6 12:32:46 2001
+++ xml-cocoon2/src/org/apache/cocoon/generation/StatusGenerator.java   Thu Dec  6 
+12:05:13 2001
@@ -8,6 +8,11 @@
 package org.apache.cocoon.generation;
 
 import org.apache.avalon.excalibur.pool.Recyclable;
+import org.apache.cocoon.components.store.StoreJanitor;
+import org.apache.cocoon.components.store.Store;
+import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.Composable;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -20,6 +25,8 @@
 import java.util.Date;
 import java.util.List;
 import java.util.StringTokenizer;
+import java.util.Iterator;
+import java.util.Enumeration;
 
 /** Generates an XML representation of the current status of Cocoon.
  * Potted DTD:
@@ -51,6 +58,8 @@
  */
 public class StatusGenerator extends ComposerGenerator implements Recyclable {
 
+    private StoreJanitor storejanitor = null;
+
     /** The XML namespace for the output document.
      */
     protected static final String namespace =
@@ -61,6 +70,21 @@
     protected static final String xlinkNamespace =
         "http://www.w3.org/1999/xlink";;
 
+    /**
+     * Set the current <code>ComponentManager</code> instance used by this
+     * <code>Composable</code>.
+     * Need to get statistics about cache hits
+     */
+    public void compose(ComponentManager manager) throws ComponentException {
+        super.compose(manager);
+        this.storejanitor = (StoreJanitor)manager.lookup(StoreJanitor.ROLE);
+       if( this.storejanitor == null ) {
+            getLogger().debug("StoreJanitor is null, sorry no statistics");
+        } else {
+            getLogger().debug("Got reference to StoreJanitor");
+        };
+    }
+
     /** Generate the status information in XML format.
      * @throws SAXException
      *         when there is a problem creating the output SAX events.
@@ -142,6 +166,7 @@
         endGroup(ch);
         // END operating system
 
+       // BEGIN ClassPath
         String classpath = System.getProperty("java.class.path");
         List paths = new ArrayList();
         StringTokenizer tokenizer = new StringTokenizer(classpath, 
System.getProperty("path.separator"));
@@ -149,6 +174,38 @@
             paths.add(tokenizer.nextToken());
         }
         addMultilineValue(ch, "classpath", paths);
+       // END ClassPath
+
+       // BEGIN Cache
+       startGroup(ch, "Store-Janitor");
+
+       // For each element in StoreJanitor
+       Iterator i = this.storejanitor.iterator();
+       while( i.hasNext() ) {
+               Store store = (Store) i.next();
+               // For each element in Store
+               Enumeration e = store.keys();
+               List cachelist = new ArrayList();
+               while( e.hasMoreElements() ) {
+                       Object o = e.nextElement();
+                       cachelist.add( 
+                               o.toString() + "( hash: " +
+                               o.hashCode() + " | class: " +
+                               o.getClass().getName() +
+                               " )" 
+                       );
+               };
+
+               startGroup(ch, store.getClass().getName()+" ("+cachelist.size()+" 
+items / "+store.hashCode()+")" );
+               if( cachelist.isEmpty() ) {
+                       addValue(ch, "cached", "[empty]");
+               } else {
+                       addMultilineValue(ch, "cached", cachelist);
+               };
+               endGroup(ch);
+       };
+       endGroup(ch);
+       // END Cache    
 
         // BEGIN OS info
         endGroup(ch);
diff -u -r -x CVS xml-cocoon2.orig/webapp/stylesheets/system/status2html.xsl 
xml-cocoon2/webapp/stylesheets/system/status2html.xsl
--- xml-cocoon2.orig/webapp/stylesheets/system/status2html.xsl  Thu Dec  6 12:32:51 
2001
+++ xml-cocoon2/webapp/stylesheets/system/status2html.xsl       Thu Dec  6 11:15:53 
+2001
@@ -71,21 +71,45 @@
 
   </xsl:template>
 
-  <xsl:template match="status:value">
-    <tr>
-      <td bgcolor="#0086b2" valign="top" align="left">
-       <FONT face="arial,helvetica,sanserif" color="#ffffff">
-        <xsl:value-of select="@status:name"/>
-       </FONT>
-      </td>
-      <td bgcolor="ffffff" width="100%">
-       <FONT face="arial,helvetica,sanserif">
-        <xsl:value-of select="." />
-       </FONT>
-      </td>
-    </tr>
+       <xsl:template match="status:value[count(status:line) &lt;= 1]">
+               <tr>
+                       <td bgcolor="#0086b2" valign="top" align="left">
+                               <font face="arial,helvetica,sanserif" color="#ffffff">
+                                       <xsl:value-of select="@status:name"/>
+                               </font>
+                       </td>
+                       <td bgcolor="ffffff" width="100%">
+                               <font face="arial,helvetica,sanserif">
+                                       <xsl:value-of select="status:line" />
+                               </font>
+                       </td>
+               </tr>
+       </xsl:template>
 
-  </xsl:template>
+
+       <xsl:template match="status:value[count(status:line) &gt; 1]">
+               <tr>
+                       <td bgcolor="#0086b2" valign="top" align="left">
+                               <font face="arial,helvetica,sanserif" color="#ffffff">
+                                       <xsl:value-of select="@status:name"/>
+                               </font>
+                       </td>
+                       <td bgcolor="ffffff" width="100%">
+                               <ul>
+                                       <xsl:apply-templates />
+                               </ul>
+                       </td>
+               </tr>
+       </xsl:template>
+
+
+       <xsl:template match="status:line">
+               <li>
+                       <font face="arial,helvetica,sanserif">
+                               <xsl:value-of select="." />
+                       </font>
+               </li>
+       </xsl:template>
 
 
        <xsl:template match="status:value[../@status:name='memory' and ( 
@status:name='total' or @status:name='free')]">

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to