You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/10/21 01:55:23 UTC
svn commit: r827842 - in /labs/magma/trunk/devtools-domain: ./ src/
src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/magma/ src/main/java/org/apache/magma/tools/
src/main/java/org/apache/magma/tools/devtool...
Author: simoneg
Date: Tue Oct 20 23:55:22 2009
New Revision: 827842
URL: http://svn.apache.org/viewvc?rev=827842&view=rev
Log:
New tracing tool domain
Added:
labs/magma/trunk/devtools-domain/ (with props)
labs/magma/trunk/devtools-domain/pom.xml
labs/magma/trunk/devtools-domain/src/
labs/magma/trunk/devtools-domain/src/main/
labs/magma/trunk/devtools-domain/src/main/java/
labs/magma/trunk/devtools-domain/src/main/java/org/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/EmptyHandler.java
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Trace.java
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEvent.java
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventHandler.java
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventPriority.java
labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Traced.java
labs/magma/trunk/devtools-domain/src/main/resources/
labs/magma/trunk/devtools-domain/src/test/
labs/magma/trunk/devtools-domain/src/test/java/
labs/magma/trunk/devtools-domain/src/test/resources/
Propchange: labs/magma/trunk/devtools-domain/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Oct 20 23:55:22 2009
@@ -0,0 +1,7 @@
+.classpath
+.project
+.settings
+bin
+classes
+target
+target-eclipse
Added: labs/magma/trunk/devtools-domain/pom.xml
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/pom.xml?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/pom.xml (added)
+++ labs/magma/trunk/devtools-domain/pom.xml Tue Oct 20 23:55:22 2009
@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <artifactId>magma-parent</artifactId>
+ <groupId>org.apache.magma</groupId>
+ <version>3</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.magma.tools</groupId>
+ <artifactId>devtools-domain</artifactId>
+ <name>Magma Developer Tools Domain</name>
+ <version>0.0.3-SNAPSHOT</version>
+ <description>Contains classes used by both the client and the server part of the Developer Tools</description>
+ <packaging>magma</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>foundation-basics</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+</project>
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/EmptyHandler.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/EmptyHandler.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/EmptyHandler.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/EmptyHandler.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,29 @@
+package org.apache.magma.tools.devtools.domain;
+
+import org.aspectj.lang.JoinPoint;
+
+/**
+ * An empty {@link TraceEventHandler} that returns the event passed
+ * without any modifications.
+ *
+ * Can be used as a superclass for other handlers, and is used
+ * by {@link EventCollector} in the case that the required handler
+ * cannot be instantiated.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public class EmptyHandler implements TraceEventHandler {
+
+ public TraceEvent handleEntering(TraceEvent event, JoinPoint enterjp) {
+ return event;
+ }
+
+ public TraceEvent handleError(TraceEvent event, Throwable error,JoinPoint exitjp) {
+ return event;
+ }
+
+ public TraceEvent handleReturning(TraceEvent event, Object retValue, JoinPoint exitjp) {
+ return event;
+ }
+
+}
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Trace.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Trace.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Trace.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Trace.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,56 @@
+package org.apache.magma.tools.devtools.domain;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * A sequence of events, with a unique id and a user name and eventually
+ * dependent referreds traces.
+ *
+ * For example, in a web environment, a page request will generate a
+ * trace, having its own id and having, eventually, the requested
+ * URL as a name.
+ *
+ * The name can be used both for human presentation and for finding
+ * the trace again to add referred ones, which are for example images
+ * the browser is requesting to display the page.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public class Trace {
+
+ private static long lastid = System.currentTimeMillis();
+
+ private long id = lastid++;
+ private long timestamp = System.currentTimeMillis();
+ private String name = null;
+
+ private List<TraceEvent> events = new LinkedList<TraceEvent>();
+
+ private List<Trace> referreds = new LinkedList<Trace>();
+
+ public Trace(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public long getId() {
+ return id;
+ }
+ public List<TraceEvent> getEvents() {
+ return events;
+ }
+ public void addReferred(Trace t) {
+ referreds.add(t);
+ }
+ public List<Trace> getReferreds() {
+ return referreds;
+ }
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+
+}
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEvent.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEvent.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEvent.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEvent.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,325 @@
+package org.apache.magma.tools.devtools.domain;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A single event captured during a {@link Trace}.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public class TraceEvent {
+
+ private static long lastid = System.currentTimeMillis();
+
+ /**
+ * Unique id of this event
+ */
+ private long id = lastid++;
+
+ /**
+ * Location in code of where this event happened.
+ *
+ * Format is filename>classname:line.
+ */
+ private String codeLocation;
+
+ /**
+ * String representation of the raw joinpoint
+ */
+ private String rawJoinPoint;
+
+ /**
+ * String representation of parameters.
+ *
+ * Format is fqn>toString
+ */
+ private String[] parameters;
+
+ /**
+ * String representation of return value, if any
+ *
+ * Format is fwn>toString
+ */
+ private String returnValue;
+
+ /**
+ * The stack trace of an error if occurred.
+ */
+ private String stackTrace;
+
+ /**
+ * Subsystem the event is pertaining to, should be a "/" separated path.
+ */
+ private String subSystem = "";
+
+ /**
+ * Subsystem specific type of event.
+ */
+ private String type = "";
+
+ /**
+ * Priority of the event, used to gain user attention.
+ */
+ private TraceEventPriority priority = TraceEventPriority.DEBUG;
+
+ /**
+ * Start time in nanoseconds
+ */
+ private long started = System.nanoTime();
+
+ /**
+ * End time in nanoseconds, this will include all events happenend "inside" this.
+ */
+ private long ended;
+
+ /**
+ * Whether this events should be located or not in the output.
+ */
+ private boolean located;
+
+ /**
+ * The parent (or eclosing) event, or null for root events.
+ */
+ private TraceEvent parent;
+
+ /**
+ * An optional bag of properties
+ */
+ private Map<String, String> dataBag;
+
+ public TraceEvent(TraceEvent parent, String codeLocation) {
+ this.parent = parent;
+ this.codeLocation = codeLocation;
+ }
+
+ /**
+ * @return the unique id of this event.
+ */
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * @return the start time of this event in nanoseconds.
+ */
+ public long getStarted() {
+ return started;
+ }
+ /**
+ * Marks this event as ended, to correctly compute execution times.
+ */
+ public void ended() {
+ ended = System.nanoTime();
+ }
+ /**
+ * @return the end time of this event in nanoseconds.
+ */
+ public long getEnded() {
+ return ended;
+ }
+
+ /**
+ * @return the total execution time of this event (including child/enclosed events).
+ */
+ public long getElapsed() {
+ return ended - started;
+ }
+
+ /**
+ * Adds some data to the optional bag of properties.
+ * @param name The name of the property to add.
+ * @param value The value of the property to add.
+ */
+ public void addData(String name, String value) {
+ if (dataBag == null) dataBag = new HashMap<String, String>();
+ dataBag.put(name, value);
+ }
+ /**
+ * Removes data from the optional bag of properties.
+ * @param name The name of the property to remove.
+ */
+ public void removeData(String name) {
+ if (dataBag == null) return;
+ dataBag.remove(name);
+ }
+ /**
+ * Retrieves data from the optional bag of properties.
+ * @param name The name of the property to retrieve.
+ * @return the value of the property.
+ */
+ public String getData(String name) {
+ if (dataBag == null) return null;
+ return dataBag.get(name);
+ }
+ /**
+ * @return the names of the properties currently in the optional bag of properties.
+ */
+ public Set<String> getDataNames() {
+ if (dataBag == null) return Collections.emptySet();
+ return dataBag.keySet();
+ }
+
+ /**
+ * @return the sub system this event pertains to, a slash ('/') separated string like "Magma/I18n".
+ */
+ public String getSubSystem() {
+ return subSystem;
+ }
+
+ /**
+ * @param subSystem the sub system this events pertains to.
+ */
+ public void setSubSystem(String subSystem) {
+ assert(subSystem != null);
+ this.subSystem = subSystem;
+ }
+
+ /**
+ * @return the sub type specific event type.
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @param type the sub system specific event type.
+ */
+ public void setType(String type) {
+ assert(type != null);
+ this.type = type;
+ }
+
+ /**
+ * @return the priority of this event.
+ */
+ public TraceEventPriority getPriority() {
+ return priority;
+ }
+
+ /**
+ * @param priority the priority of this event.
+ */
+ public void setPriority(TraceEventPriority priority) {
+ assert(priority != null);
+ this.priority = priority;
+ }
+
+ /**
+ * @return whether this event should be located on the output
+ */
+ public boolean isLocated() {
+ return located;
+ }
+
+ /**
+ * @param located whether this event should be located on the output
+ */
+ public void setLocated(boolean located) {
+ this.located = located;
+ }
+
+ /**
+ * @return the parent (enclosing) event, if any.
+ */
+ public TraceEvent getParent() {
+ return parent;
+ }
+
+ /**
+ * @return the location in code of this event, format is filename>classname:line
+ */
+ public String getCodeLocation() {
+ return codeLocation;
+ }
+
+ /**
+ * @return the raw join point representation, as obtained from AspectJ
+ */
+ public String getRawJoinPoint() {
+ return rawJoinPoint;
+ }
+
+ /**
+ * @param rawJoinPoint the raw join point representation, as obtained from AspectJ
+ */
+ public void setRawJoinPoint(String rawJoinPoint) {
+ this.rawJoinPoint = rawJoinPoint;
+ }
+
+ /**
+ * @return String representations of parameters, if any, null or empty array otherwise. Format is fqn>toString
+ */
+ public String[] getParameters() {
+ return parameters;
+ }
+
+ /**
+ * @return String representation of the return value, format is fqn>toString
+ */
+ public String getReturnValue() {
+ return returnValue;
+ }
+
+ /**
+ * @param obj An object
+ * @return A string representation fqn>toString
+ */
+ private String objectString(Object obj) {
+ if (obj == null) {
+ return "null";
+ } else {
+ return obj.getClass().getName() + ">" + obj.toString();
+ }
+ }
+
+ /**
+ * Notifies that this event returned a value
+ * @param retVal The returned value
+ */
+ public void returned(Object retVal) {
+ returnValue = objectString(retVal);
+ }
+
+ /**
+ * Notifies that this event took parameters.
+ * @param params the parameters.
+ */
+ public void withParameters(Object... params) {
+ if (params == null) return;
+ if (params.length == 0) return;
+ this.parameters = new String[params.length];
+ for (int i = 0; i < params.length; i++) {
+ this.parameters[i] = objectString(params[i]);
+ }
+ }
+
+ /**
+ * @return The stacktrace of an error, if occurred.
+ */
+ public String getStackTrace() {
+ return stackTrace;
+ }
+
+ /**
+ * @return true is this event registered an exception stack trace
+ */
+ public boolean hasStackTrace() {
+ return this.stackTrace != null;
+ }
+
+ public void exception(Throwable t) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ t.printStackTrace(pw);
+ pw.close();
+ this.stackTrace = pw.toString();
+ }
+
+
+
+}
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventHandler.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventHandler.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventHandler.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventHandler.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,71 @@
+package org.apache.magma.tools.devtools.domain;
+
+import org.aspectj.lang.JoinPoint;
+
+/**
+ * Handler for events decoration by sub systems.
+ *
+ * Each sub system can annotate which methods or fields deserve to
+ * generate events using the {@link Traced} annotation, and specify
+ * which handler should handle event decoration.
+ *
+ * When such a method is executed (or field accessed) a {@link TraceEvent}
+ * is created and passed to the handler {@link #handleEntering(TraceEvent, JoinPoint)}
+ * method.
+ *
+ * This method can then setup the event correctly, like setting the sub system
+ * name, the event type and optional properties in the property bag of the event.
+ * It can gather data from the {@link JoinPoint}.
+ *
+ * It can return the same event modified, or eventually, in the future, return
+ * a specific subclass.
+ *
+ * Same happens for {@link #handleReturning(TraceEvent, Object, JoinPoint)} and
+ * {@link #handleError(TraceEvent, Throwable, JoinPoint)} methods.
+ *
+ * Classes implementing this interface MUST be thread safe and MUST have
+ * a no arg constructor.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public interface TraceEventHandler {
+
+ /**
+ * Called when execution is entering a joinpoint (method execution or
+ * field get/set) annotated with {@link Traced} having as a value this
+ * handler.
+ * @param event The event this handler can modify.
+ * @param enterjp The join point this handler can use to gather data.
+ * @return The same event or, in the future, a specific subclass.
+ */
+ public TraceEvent handleEntering(TraceEvent event, JoinPoint enterjp);
+
+ /**
+ * Called when execution is exiting correctly from a joinpoint
+ * (method execution or field get/set) annotated with {@link Traced}
+ * having as a value this handler.
+ *
+ * Depending on the kind of joinpoint, the value can be the value
+ * returned from the method (or null if void), the value of the field
+ * accessed when reading, or null if the field was accessed for writing it.
+ *
+ * @param event The event this handler can modify.
+ * @param retValue The value returned by the join point.
+ * @param exitjp The join point this handler can use to gather data.
+ * @return The same event or, in the future, a specific subclass.
+ */
+ public TraceEvent handleReturning(TraceEvent event, Object retValue, JoinPoint exitjp);
+
+ /**
+ * Called when execution is exiting with an exception from a joinpoint
+ * (method execution or field get/set) annotated with {@link Traced}
+ * having as a value this handler.
+ *
+ * @param event The event this handler can modify.
+ * @param error The error that happened.
+ * @param exitjp The join point this handler can use to gather data.
+ * @return The same event or, in the future, a specific subclass.
+ */
+ public TraceEvent handleError(TraceEvent event, Throwable error, JoinPoint exitjp);
+
+}
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventPriority.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventPriority.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventPriority.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/TraceEventPriority.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,32 @@
+package org.apache.magma.tools.devtools.domain;
+
+/**
+ * {@link TraceEvent} priority, used to gain user attention.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public enum TraceEventPriority {
+
+ /**
+ * DEBUG is normally used to trace normal events
+ */
+ DEBUG,
+ /**
+ * INFO denotes something the user may seriously be interested in,
+ * but not vital for execution.
+ */
+ INFO,
+ /**
+ * WARN denotes something the user should seriously consider.
+ */
+ WARN,
+ /**
+ * ERROR denotes that an error has happened and it must be fixed
+ */
+ ERROR,
+ /**
+ * FATAL is for real emergencies
+ */
+ FATAL
+
+}
Added: labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Traced.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Traced.java?rev=827842&view=auto
==============================================================================
--- labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Traced.java (added)
+++ labs/magma/trunk/devtools-domain/src/main/java/org/apache/magma/tools/devtools/domain/Traced.java Tue Oct 20 23:55:22 2009
@@ -0,0 +1,28 @@
+package org.apache.magma.tools.devtools.domain;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation to be placed on methods, fields and constructors
+ * that generates {@link TraceEvent}s.
+ *
+ * Each subsystem can place this annotations where needed, and/or
+ * inject them using aspects. A specific {@link TraceEventHandler} can
+ * be specified, that will act as a factory/decorator for the event.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
+public @interface Traced {
+
+ Class<? extends TraceEventHandler> handler() default EmptyHandler.class;
+ boolean located() default false;
+ String subsystem();
+ String type() default "";
+ TraceEventPriority priority() default TraceEventPriority.DEBUG;
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org