stephan 2002/09/03 00:46:14 Modified: src/java/org/apache/cocoon/generation ProfilerGenerator.java Log: Extend the profiler components to store intermediate SAX fragments, and also the some informations about the environment, thanks to Bruno Dumon. Revision Changes Path 1.2 +237 -50 xml-cocoon2/src/java/org/apache/cocoon/generation/ProfilerGenerator.java Index: ProfilerGenerator.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/generation/ProfilerGenerator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ProfilerGenerator.java 21 Aug 2002 06:15:31 -0000 1.1 +++ ProfilerGenerator.java 3 Sep 2002 07:46:13 -0000 1.2 @@ -52,35 +52,70 @@ import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; +import org.apache.avalon.framework.parameters.Parameters; +import org.apache.avalon.framework.parameters.ParameterException; +import org.apache.cocoon.ProcessingException; +import org.apache.cocoon.components.profiler.EnvironmentInfo; import org.apache.cocoon.components.profiler.Profiler; import org.apache.cocoon.components.profiler.ProfilerResult; +import org.apache.cocoon.components.sax.XMLDeserializer; +import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.environment.Request; +import org.apache.cocoon.environment.ObjectModelHelper; +import org.apache.cocoon.xml.IncludeXMLConsumer; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; +import java.io.IOException; import java.text.DateFormat; import java.util.Collection; import java.util.Date; import java.util.Iterator; +import java.util.Map; +import java.util.Set; /** * Generates an XML representation of the current status of Profiler. * * @author <a href="mailto:[EMAIL PROTECTED]">Vadim Gritsenko</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Bruno Dumon</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version CVS $Id$ */ public class ProfilerGenerator extends ComposerGenerator { /** - * The XML namespace for the output document. + * The XML PROFILER_NS for the output document. */ - protected static final String namespace = "http://apache.org/cocoon/profiler/1.0"; + protected static final String PROFILER_NS = "http://apache.org/cocoon/profiler/1.0"; + + protected static final String PROFILERINFO_ELEMENT = "profilerinfo"; + protected static final String RESULTS_ELEMENT = "pipeline"; + protected static final String RESULT_ELEMENT = "result"; + protected static final String AVERAGERESULT_ELEMENT = "average"; + protected static final String ENVIROMENTINFO_ELEMENT = "environmentinfo"; + protected static final String REQUESTPARAMETERS_ELEMENT = "request-parameters"; + protected static final String REQUESTPARAMETER_ELEMENT = "parameter"; + protected static final String SESSIONATTRIBUTES_ELEMENT = "session-attributes"; + protected static final String SESSIONATTRIBUTE_ELEMENT = "attribute"; + protected static final String COMPONENT_ELEMENT = "component"; + protected static final String FRAGMENT_ELEMENT = "fragment"; + private Profiler profiler; + // the key identifying the ProfilerResult + protected Long key = null; + + // Index of the result of latest results + protected int resultIndex = -1; + + // Index of the componen of the latest results + protected int componentIndex = -1; + /** * Composable */ @@ -90,6 +125,28 @@ this.profiler = (Profiler)super.manager.lookup(Profiler.ROLE); } + public void setup(SourceResolver resolver, Map objectModel, String soure, Parameters parameters) + throws ProcessingException, SAXException, IOException { + + super.setup(resolver, objectModel, source, parameters); + Request request = ObjectModelHelper.getRequest(objectModel); + + if (request.getParameter("key")!=null) + this.key = new Long(Long.parseLong(request.getParameter("key"))); + else + this.key = null; + + if ((request.getParameter("result")!=null) && (this.key!=null)) + this.resultIndex = Integer.parseInt(request.getParameter("result")); + else + this.resultIndex = -1; + + if ((request.getParameter("component")!=null) && (this.resultIndex!=-1)) + this.componentIndex = Integer.parseInt(request.getParameter("component")); + else + this.componentIndex = -1; + } + /** * Disposable */ @@ -108,11 +165,11 @@ */ public void generate() throws SAXException { - // Start the document and set the namespace. + // Start the document and set the PROFILER_NS. this.contentHandler.startDocument(); - this.contentHandler.startPrefixMapping("", namespace); + this.contentHandler.startPrefixMapping("", PROFILER_NS); - generate(this.contentHandler); + generateProfilerInfo(); // End the document. this.contentHandler.endPrefixMapping(""); @@ -120,86 +177,216 @@ } /** Generate the main status document. */ - private void generate(ContentHandler ch) throws SAXException { + private void generateProfilerInfo() throws SAXException { // Root element. // The current date and time. String dateTime = DateFormat.getDateTimeInstance().format(new Date()); AttributesImpl atts = new AttributesImpl(); - atts.addAttribute(namespace, "date", "date", "CDATA", dateTime); - ch.startElement(namespace, "profilerinfo", "profilerinfo", atts); + atts.addAttribute(PROFILER_NS, "date", "date", "CDATA", dateTime); + this.contentHandler.startElement(PROFILER_NS, PROFILERINFO_ELEMENT, PROFILERINFO_ELEMENT, atts); - Collection results = profiler.getResults(); - for(Iterator i = results.iterator(); i.hasNext();) - generateResult(ch, (ProfilerResult)i.next()); + Collection resultsKeys = profiler.getResultKeys(); + for(Iterator i = resultsKeys.iterator(); i.hasNext();) { + Long key = (Long)i.next(); + if ((this.key==null) || (this.key.equals(key))) + generateResults(key, profiler.getResult(key)); + } // End root element. - ch.endElement(namespace, "profilerinfo", "profilerinfo"); + this.contentHandler.endElement(PROFILER_NS, PROFILERINFO_ELEMENT, PROFILERINFO_ELEMENT); } - private void generateResult(ContentHandler ch, ProfilerResult result) throws SAXException { + private void generateResults(Long key, ProfilerResult result) throws SAXException { AttributesImpl atts = new AttributesImpl(); int count = result.getCount(); String[] roles = result.getRoles(); // Roles of the components - String[] source = result.getSources(); // Source of the components + String[] sources = result.getSources(); // Source of the components + + EnvironmentInfo[] environmentInfos = result.getLatestEnvironmentInfos(); long[] totalTime = result.getTotalTime(); // Total time of the requests - long totalTimeSum = 0; // Total time of all requests + long[][] timeOfComponents = result.getLastTimes(); // Time of each component + Object[][] fragments = result.getLatestSAXFragments(); // SAX Fragments of each component + + // Total time of all requests + long totalTimeSum = 0; for(int i=0; i < count; i++) totalTimeSum += totalTime[i]; - atts.addAttribute(namespace, "uri", "uri", "CDATA", result.getURI()); - atts.addAttribute(namespace, "count", "count", "CDATA", Integer.toString(result.getCount())); - atts.addAttribute(namespace, "time", "time", "CDATA", Long.toString(totalTimeSum)); - ch.startElement(namespace, "pipeline", "pipeline", atts); + atts.addAttribute(PROFILER_NS, "uri", "uri", "CDATA", result.getURI()); + atts.addAttribute(PROFILER_NS, "count", "count", "CDATA", Integer.toString(result.getCount())); + atts.addAttribute(PROFILER_NS, "time", "time", "CDATA", Long.toString(totalTimeSum)); + atts.addAttribute(PROFILER_NS, "key", "key", "CDATA", key.toString()); + this.contentHandler.startElement(PROFILER_NS, RESULTS_ELEMENT, RESULTS_ELEMENT, atts); atts.clear(); - if(count > 0){ - atts.addAttribute(namespace, "time", "time", "CDATA", Long.toString(totalTimeSum / count)); - ch.startElement(namespace, "average", "average", atts); + // Generate average result + if ((count > 0) && (this.resultIndex==-1)) { + atts.addAttribute(PROFILER_NS, "time", "time", "CDATA", Long.toString(totalTimeSum / count)); + this.contentHandler.startElement(PROFILER_NS, AVERAGERESULT_ELEMENT, AVERAGERESULT_ELEMENT, atts); atts.clear(); - long[][] timeOfComponents = result.getLastTimes(); // Time of each component - long[] totalTimeOfComponents = new long[roles.length]; // Time of each component for all requests + // Total time of each component for all requests + long[] totalTimeOfComponents = new long[roles.length]; - for(int j=0; j<count; j++){ - for(int i=0; i<roles.length; i++){ + for(int i=0; i<roles.length; i++) { + totalTimeOfComponents[i] = 0; + for(int j=0; j<count; j++) { totalTimeOfComponents[i] += timeOfComponents[j][i]; } } for(int i=0; i<roles.length; i++){ + atts.addAttribute(PROFILER_NS, "offset", "offset", "CDATA", String.valueOf(i)); + if(roles[i] != null) - atts.addAttribute(namespace, "role", "role", "CDATA", roles[i]); - if(source[i] != null) - atts.addAttribute(namespace, "source", "source", "CDATA", source[i]); - atts.addAttribute(namespace, "time", "time", "CDATA", Long.toString(totalTimeOfComponents[i] / count)); - ch.startElement(namespace, "element", "element", atts); + atts.addAttribute(PROFILER_NS, "role", "role", "CDATA", roles[i]); + + if(sources[i] != null) + atts.addAttribute(PROFILER_NS, "source", "source", "CDATA", sources[i]); + + atts.addAttribute(PROFILER_NS, "time", "time", "CDATA", + Long.toString(totalTimeOfComponents[i] / count)); + + this.contentHandler.startElement(PROFILER_NS, COMPONENT_ELEMENT, COMPONENT_ELEMENT, atts); atts.clear(); - ch.endElement(namespace, "element", "element"); + this.contentHandler.endElement(PROFILER_NS, COMPONENT_ELEMENT, COMPONENT_ELEMENT); } - ch.endElement(namespace, "average", "average"); + this.contentHandler.endElement(PROFILER_NS, AVERAGERESULT_ELEMENT, AVERAGERESULT_ELEMENT); + } - for(int j=0; j<count; j++){ - atts.addAttribute(namespace, "time", "time", "CDATA", Long.toString(totalTime[j])); - ch.startElement(namespace, "result", "result", atts); - atts.clear(); - for(int i=0; i<roles.length; i++){ - if(roles[i] != null) - atts.addAttribute(namespace, "role", "role", "CDATA", roles[i]); - if(source[i] != null) - atts.addAttribute(namespace, "source", "source", "CDATA", source[i]); - atts.addAttribute(namespace, "time", "time", "CDATA", Long.toString(timeOfComponents[j][i])); - ch.startElement(namespace, "element", "element", atts); - atts.clear(); - ch.endElement(namespace, "element", "element"); - } - ch.endElement(namespace, "result", "result"); + for(int j=0; j<count; j++) { + if ((this.resultIndex==-1) || (this.resultIndex==j)) + generateResult(j, roles, sources, environmentInfos[j], + totalTime[j], timeOfComponents[j], fragments[j]); + } + + this.contentHandler.endElement(PROFILER_NS, RESULTS_ELEMENT, RESULTS_ELEMENT); + } + + private void generateResult(int resultIndex, String[] roles, String[] sources, + EnvironmentInfo environmentInfo, + long totaltime, long[] times, Object[] fragments) throws SAXException { + + AttributesImpl atts = new AttributesImpl(); + atts.addAttribute(PROFILER_NS, "time", "time", "CDATA", Long.toString(totaltime)); + atts.addAttribute(PROFILER_NS, "index", "index", "CDATA", String.valueOf(resultIndex)); + this.contentHandler.startElement(PROFILER_NS, RESULT_ELEMENT, RESULT_ELEMENT, atts); + atts.clear(); + + if (this.resultIndex!=-1) + generateEnvironmentInfo(environmentInfo); + + for(int i=0; i<roles.length; i++) { + generateComponent(i, roles[i], sources[i], times[i], fragments[i]); + } + this.contentHandler.endElement(PROFILER_NS, RESULT_ELEMENT, RESULT_ELEMENT); + } + + private void generateComponent(int componentIndex, String role, String source, long time, Object fragment) + throws SAXException { + + AttributesImpl atts = new AttributesImpl(); + + atts.addAttribute(PROFILER_NS, "index", "index", "CDATA", String.valueOf(componentIndex)); + + if (role != null) + atts.addAttribute(PROFILER_NS, "role", "role", "CDATA", role); + + if (source != null) + atts.addAttribute(PROFILER_NS, "source", "source", "CDATA", source); + + atts.addAttribute(PROFILER_NS, "time", "time", "CDATA", Long.toString(time)); + + this.contentHandler.startElement(PROFILER_NS, COMPONENT_ELEMENT, COMPONENT_ELEMENT, atts); + atts.clear(); + + if (this.componentIndex==componentIndex) + generateSAXFragment(fragment); + + this.contentHandler.endElement(PROFILER_NS, COMPONENT_ELEMENT, COMPONENT_ELEMENT); + } + + private void generateEnvironmentInfo(EnvironmentInfo environmentInfo) throws SAXException { + this.contentHandler.startElement(PROFILER_NS, ENVIROMENTINFO_ELEMENT, ENVIROMENTINFO_ELEMENT, + new AttributesImpl()); + + if (environmentInfo != null) { + // Generate SAX events for the request parameters + this.contentHandler.startElement(PROFILER_NS, REQUESTPARAMETERS_ELEMENT, REQUESTPARAMETERS_ELEMENT, + new AttributesImpl()); + + Map requestParameters = environmentInfo.getRequestParameters(); + Set requestParamEntries = requestParameters.entrySet(); + Iterator requestParamEntriesIt = requestParamEntries.iterator(); + while (requestParamEntriesIt.hasNext()) { + AttributesImpl atts = new AttributesImpl(); + Map.Entry entry = (Map.Entry)requestParamEntriesIt.next(); + atts.addAttribute(PROFILER_NS, "name", "name", "CDATA", (String)entry.getKey()); + atts.addAttribute(PROFILER_NS, "value", "value", "CDATA", (String)entry.getValue()); + this.contentHandler.startElement(PROFILER_NS, REQUESTPARAMETER_ELEMENT, + REQUESTPARAMETER_ELEMENT, atts); + this.contentHandler.endElement(PROFILER_NS, REQUESTPARAMETER_ELEMENT, + REQUESTPARAMETER_ELEMENT); + } + this.contentHandler.endElement(PROFILER_NS, REQUESTPARAMETERS_ELEMENT, REQUESTPARAMETERS_ELEMENT); + + // Generate SAX events for the session attributes + this.contentHandler.startElement(PROFILER_NS, SESSIONATTRIBUTES_ELEMENT, SESSIONATTRIBUTES_ELEMENT, + new AttributesImpl()); + + Map sessionAttributes = environmentInfo.getSessionAttributes(); + Set sessionAttrEntries = sessionAttributes.entrySet(); + Iterator sessionAttrEntriesIt = sessionAttrEntries.iterator(); + while (sessionAttrEntriesIt.hasNext()) { + AttributesImpl atts = new AttributesImpl(); + Map.Entry entry = (Map.Entry)sessionAttrEntriesIt.next(); + atts.addAttribute(PROFILER_NS, "name", "name", "CDATA", (String)entry.getKey()); + atts.addAttribute(PROFILER_NS, "value", "value", "CDATA", (String)entry.getValue()); + this.contentHandler.startElement(PROFILER_NS, SESSIONATTRIBUTE_ELEMENT, + SESSIONATTRIBUTE_ELEMENT, atts); + this.contentHandler.endElement(PROFILER_NS, SESSIONATTRIBUTE_ELEMENT, + SESSIONATTRIBUTE_ELEMENT); } + this.contentHandler.endElement(PROFILER_NS, SESSIONATTRIBUTES_ELEMENT, SESSIONATTRIBUTES_ELEMENT); + + // And the rest + this.contentHandler.startElement(PROFILER_NS, "uri", "uri", new AttributesImpl()); + this.contentHandler.characters(environmentInfo.getURI().toCharArray(), 0, + environmentInfo.getURI().length()); + this.contentHandler.endElement(PROFILER_NS, "uri", "uri"); } - ch.endElement(namespace, "pipeline", "pipeline"); + this.contentHandler.endElement(PROFILER_NS, ENVIROMENTINFO_ELEMENT, ENVIROMENTINFO_ELEMENT); + } + + public void generateSAXFragment(Object fragment) throws SAXException { + + if (fragment!=null) { + + this.contentHandler.startElement(PROFILER_NS, FRAGMENT_ELEMENT, FRAGMENT_ELEMENT, + new AttributesImpl()); + + XMLDeserializer deserializer = null; + try { + deserializer = (XMLDeserializer)this.manager.lookup(XMLDeserializer.ROLE); + deserializer.setConsumer(new IncludeXMLConsumer(this.xmlConsumer)); + deserializer.deserialize(fragment); + } catch (ComponentException ce) { + getLogger().debug("Could not retrieve XMLDeserializer component", ce); + throw new SAXException("Could not retrieve XMLDeserializer component", ce); + } catch (Exception e) { + getLogger().debug("Could not serialize SAX fragment", e); + throw new SAXException("Could not serialize SAX fragment", e); + } finally { + if (deserializer!=null) + this.manager.release(deserializer); + } + + this.contentHandler.endElement(PROFILER_NS, FRAGMENT_ELEMENT, FRAGMENT_ELEMENT); + } } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]