Author: reinhard Date: Fri Apr 22 06:54:29 2005 New Revision: 164239 URL: http://svn.apache.org/viewcvs?rev=164239&view=rev Log: show continuations tree in status, fix small bug in StatusGenerator that produced not-wellformed XML
Added: cocoon/trunk/src/java/org/apache/cocoon/components/flow/WebContinuationDataBean.java Modified: cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java cocoon/trunk/src/java/org/apache/cocoon/generation/StatusGenerator.java cocoon/trunk/src/webapp/samples/samples.xml cocoon/trunk/src/webapp/samples/sitemap.xmap cocoon/trunk/src/webapp/stylesheets/system/status2html.xslt Modified: cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java Fri Apr 22 06:54:29 2005 @@ -15,6 +15,8 @@ */ package org.apache.cocoon.components.flow; +import java.util.List; + /** * The interface of the Continuations manager. * @@ -89,4 +91,9 @@ * @see WebContinuation#display() */ public void displayAllContinuations(); + + /** + * Get a list of all continuations as <code>WebContinuationDataBean</code> objects. + */ + public List getWebContinuationsDataBeanList(); } Modified: cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java Fri Apr 22 06:54:29 2005 @@ -16,6 +16,7 @@ package org.apache.cocoon.components.flow; import java.security.SecureRandom; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -45,6 +46,7 @@ import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Session; + /** * The default implementation of [EMAIL PROTECTED] ContinuationsManager}. <br/>There are * two modes of work: <br/> @@ -181,6 +183,17 @@ return wk; } + + /** + * Get a list of all web continuations (data only) + */ + public List getWebContinuationsDataBeanList() { + List beanList = new ArrayList(); + for(Iterator it = this.forest.iterator(); it.hasNext();) { + beanList.add(new WebContinuationDataBean((WebContinuation) it.next())); + } + return beanList; + } public WebContinuation lookupWebContinuation(String id, String interpreterId) { // REVISIT: Is the following check needed to avoid threading issues: @@ -480,7 +493,7 @@ * A holder for WebContinuations. When bound to session notifies the * continuations manager of session invalidation. */ - private class WebContinuationsHolder implements HttpSessionBindingListener { + public class WebContinuationsHolder implements HttpSessionBindingListener { private final static String CONTINUATIONS_HOLDER = "o.a.c.c.f.SCMI.WebContinuationsHolder"; Added: cocoon/trunk/src/java/org/apache/cocoon/components/flow/WebContinuationDataBean.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/flow/WebContinuationDataBean.java?rev=164239&view=auto ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/flow/WebContinuationDataBean.java (added) +++ cocoon/trunk/src/java/org/apache/cocoon/components/flow/WebContinuationDataBean.java Fri Apr 22 06:54:29 2005 @@ -0,0 +1,93 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cocoon.components.flow; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +/** + * Access to continuation data for monitoring applications + */ +public class WebContinuationDataBean { + + private static final String TYPE_JAVAFLOW = "javaflow"; + private static final String TYPE_FLOWSCRIPT = "flowscript"; + private static final String HAS_EXPIRED_NO = "no"; + private static final String HAS_EXPIRED_YES = "yes"; + + private WebContinuation wc; + private SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + private List _children = new ArrayList(); + + public WebContinuationDataBean(WebContinuation wc) { + this.wc = wc; + for (Iterator it = wc.getChildren().iterator(); it.hasNext();) { + WebContinuationDataBean child = new WebContinuationDataBean( + (WebContinuation) it.next()); + this._children.add(child); + } + } + + public String getId() { + return wc.getId(); + } + + public String getLastAccessTime() { + return formatter.format(new Date(wc.getLastAccessTime())); + } + + public String getInterpreterId() { + return wc.getInterpreterId(); + } + + public String getTimeToLiveInMinutes() { + return Long.toString(wc.getTimeToLive() / 1000 / 60); + } + + public String getTimeToLive() { + return Long.toString(wc.getTimeToLive()); + } + + public String getExpireTime() { + return formatter.format(new Date(wc.getLastAccessTime() + + wc.getTimeToLive())); + } + + public String hasExpired() { + if ((wc.getLastAccessTime() + wc.getTimeToLive()) < System + .currentTimeMillis()) { + return HAS_EXPIRED_YES; + } + return HAS_EXPIRED_NO; + + } + + public String getType() { + if (wc.getUserObject().getClass().getName().indexOf( + "FOM_WebContinuation") > 0) { + return TYPE_FLOWSCRIPT; + } + return TYPE_JAVAFLOW; + } + + public List get_children() { + return this._children; + } + +} Modified: cocoon/trunk/src/java/org/apache/cocoon/generation/StatusGenerator.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/generation/StatusGenerator.java?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/generation/StatusGenerator.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/generation/StatusGenerator.java Fri Apr 22 06:54:29 2005 @@ -15,6 +15,7 @@ */ package org.apache.cocoon.generation; +import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.DateFormat; @@ -27,11 +28,24 @@ import java.util.Properties; import java.util.StringTokenizer; +import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.cocoon.Constants; +<<<<<<< .mine +import org.apache.cocoon.ProcessingException; +import org.apache.cocoon.components.flow.ContinuationsManager; +import org.apache.cocoon.components.flow.WebContinuationDataBean; +import org.apache.cocoon.configuration.Settings; +======= +>>>>>>> .r164238 import org.apache.cocoon.core.Core; +<<<<<<< .mine +import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.generation.ServiceableGenerator; +======= import org.apache.cocoon.core.Settings; +>>>>>>> .r164238 import org.apache.commons.lang.SystemUtils; import org.apache.excalibur.store.Store; import org.apache.excalibur.store.StoreJanitor; @@ -60,7 +74,7 @@ * cocoon-version CDATA #IMPLIED * > * - * <!ELEMENT group (group|value)*> + * <!ELEMENT group (group|value|cont)*> * <!ATTLIST group * name CDATA #IMPLIED * > @@ -79,9 +93,10 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> * @version $Id$ */ -public class StatusGenerator - extends ServiceableGenerator { +public class StatusGenerator extends ServiceableGenerator { + private static final String SHOW_CONTINUATIONS_INFO = "show-cont"; + /** * The StoreJanitor used to get cache statistics */ @@ -89,22 +104,31 @@ protected Store store_persistent; /** + * The ContinuationManager + */ + protected ContinuationsManager continuationsManager; + + /** + * add infos about continuations? + */ + protected boolean showContinuationsInformation = false; + + /** * The XML namespace for the output document. */ - protected static final String namespace = - "http://apache.org/cocoon/status/2.0"; + protected static final String namespace = "http://apache.org/cocoon/status/2.0"; /** * The XML namespace for xlink */ - protected static final String xlinkNamespace = - "http://www.w3.org/1999/xlink"; + protected static final String xlinkNamespace = "http://www.w3.org/1999/xlink"; /** * The namespace prefix for xlink namespace */ protected static final String xlinkPrefix = "xlink"; + /** * Set the current <code>ServiceManager</code> instance used by this * <code>Serviceable</code>. @@ -122,11 +146,13 @@ } else { getLogger().info("Persistent Store is not available. Sorry no cache statistics about it."); } + if(this.manager.hasService(ContinuationsManager.ROLE)) { + continuationsManager = (ContinuationsManager) this.manager.lookup(ContinuationsManager.ROLE); + } else { + getLogger().info("ContinuationsManager is not available. Sorry no overview of created continuations"); + } } - /* (non-Javadoc) - * @see org.apache.avalon.framework.activity.Disposable#dispose() - */ public void dispose() { if (this.manager != null) { this.manager.release(this.store_persistent); @@ -136,6 +162,13 @@ } super.dispose(); } + + + public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) + throws ProcessingException, SAXException, IOException { + super.setup(resolver, objectModel, src, parameters); + this.showContinuationsInformation = parameters.getParameterAsBoolean(SHOW_CONTINUATIONS_INFO, false); + } /** Generate the status information in XML format. * @throws SAXException @@ -181,16 +214,44 @@ atts.addAttribute(namespace, "host", "host", "CDATA", localHost); atts.addAttribute(namespace, "cocoon-version", "cocoon-version", "CDATA", Constants.VERSION); this.xmlConsumer.startElement(namespace, "statusinfo", "statusinfo", atts); - + + if(this.showContinuationsInformation) { + genContinuationsTree(); + } genSettings(); genVMStatus(); - genProperties(); - + // End root element. this.xmlConsumer.endElement(namespace, "statusinfo", "statusinfo"); } + private void genContinuationsTree() throws SAXException { + startGroup("Continuations"); + List continuationsAsDataBeansList = this.continuationsManager.getWebContinuationsDataBeanList(); + for(Iterator it = continuationsAsDataBeansList.iterator(); it.hasNext();) { + displayContinuation((WebContinuationDataBean) it.next()); + } + endGroup(); + } + + + private void displayContinuation(WebContinuationDataBean wc) throws SAXException { + AttributesImpl ai = new AttributesImpl(); + ai.addAttribute(namespace, "id", "id", "CDATA", wc.getId()); + ai.addAttribute(namespace, "interpreter", "interpreter", "CDATA", wc.getInterpreterId()); + ai.addAttribute(namespace, "expire-time", "expire-time", "CDATA", wc.getExpireTime()); + ai.addAttribute(namespace, "time-to-live", "time-to-live", "CDATA", wc.getTimeToLive()); + ai.addAttribute(namespace, "last-access-time", "last-access-time", "CDATA", wc.getLastAccessTime()); + + this.xmlConsumer.startElement(namespace, "cont", "cont", ai); + List children = wc.get_children(); + for (int i = 0; i < children.size(); i++) { + displayContinuation((WebContinuationDataBean) children.get(i)); + } + this.xmlConsumer.endElement(namespace, "cont", "cont"); + } + private void genVMStatus() throws SAXException { AttributesImpl atts = new AttributesImpl(); @@ -234,7 +295,7 @@ // BEGIN Cache if (this.storejanitor != null) { - startGroup("Store-Janitor"); + startGroup("Store-Janitorrrr"); // For each element in StoreJanitor Iterator i = this.storejanitor.iterator(); @@ -356,6 +417,9 @@ this.addValue(Settings.KEY_SHOWTIME, s.isShowTime()); this.addValue(Settings.KEY_HIDE_SHOWTIME, s.isHideShowTime()); this.addValue(Settings.KEY_LAZY_MODE, s.isLazyMode()); + + this.endGroup(); + } private void genProperties() throws SAXException { Modified: cocoon/trunk/src/webapp/samples/samples.xml URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/webapp/samples/samples.xml?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/webapp/samples/samples.xml (original) +++ cocoon/trunk/src/webapp/samples/samples.xml Fri Apr 22 06:54:29 2005 @@ -113,6 +113,14 @@ This page shows the current internal status of cocoon, along with information on the cache and the object stores. </sample> + <sample name="Status Page (with continuations)" href="status-with-continuations.html"> + This page shows the current internal status of cocoon, along with + information on the cache and the object stores and the continuations. + </sample> + <sample name="Status Page (with continuations - XML)" href="status-with-continuations.xml"> + This page shows the current internal status of cocoon, along with + information on the cache and the object stores and the continuations. + </sample> <sample name="Clear Cache" href="clearcache.html"> Empties the Cocoon in-memory cache. </sample> Modified: cocoon/trunk/src/webapp/samples/sitemap.xmap URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/webapp/samples/sitemap.xmap?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/webapp/samples/sitemap.xmap (original) +++ cocoon/trunk/src/webapp/samples/sitemap.xmap Fri Apr 22 06:54:29 2005 @@ -137,12 +137,27 @@ </map:match> <map:match pattern="status.html"> - <map:generate src="status" type="status"/> + <map:generate type="status"/> <map:transform src="context://stylesheets/system/status2html.xslt"> <map:parameter name="contextPath" value="{request:contextPath}"/> </map:transform> <map:serialize/> </map:match> + + <map:match pattern="status-with-continuations.xml"> + <map:generate type="status"> + <map:parameter name="show-cont" value="true"/> + </map:generate> + <map:serialize type="xml"/> + </map:match> + + <map:match pattern="status-with-continuations.html"> + <map:generate src="cocoon:/status-with-continuations.xml"/> + <map:transform src="context://stylesheets/system/status2html.xslt"> + <map:parameter name="contextPath" value="{request:contextPath}"/> + </map:transform> + <map:serialize/> + </map:match> <map:match pattern="clearcache.html"> <map:act type="clear-cache"> Modified: cocoon/trunk/src/webapp/stylesheets/system/status2html.xslt URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/webapp/stylesheets/system/status2html.xslt?rev=164239&r1=164238&r2=164239&view=diff ============================================================================== --- cocoon/trunk/src/webapp/stylesheets/system/status2html.xslt (original) +++ cocoon/trunk/src/webapp/stylesheets/system/status2html.xslt Fri Apr 22 06:54:29 2005 @@ -47,6 +47,25 @@ <h2><xsl:value-of select="@status:name"/></h2> <ul><xsl:apply-templates select="status:value"/></ul> <xsl:apply-templates select="status:group"/> + <xsl:if test="status:cont"> + <ul> + <xsl:apply-templates select="status:cont"/> + </ul> + </xsl:if> + </xsl:template> + + <xsl:template match="status:cont"> + <li> + <xsl:for-each select="@*"> + <span class="description"><xsl:value-of select="name()"/>:<xsl:text> </xsl:text> </span><xsl:value-of select="."/> + <xsl:if test="position() != last()">, </xsl:if> + </xsl:for-each> + </li> + <xsl:if test="status:cont"> + <ul> + <xsl:apply-templates select="status:cont"/> + </ul> + </xsl:if> </xsl:template> <xsl:template match="status:value">