Author: davsclaus Date: Wed Jan 14 06:06:19 2009 New Revision: 734401 URL: http://svn.apache.org/viewvc?rev=734401&view=rev Log: CAMEL-1255: Jpa based trace event message for storing trace events in a database. All jpa entity have CAMEL_ as prefix in table names.
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventMessage.java - copied, changed from r734343, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java (with props) activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/ activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java (with props) activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/ activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java (contents, props changed) - copied, changed from r734343, activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaIdempotentConsumerTest.java activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/ activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml (with props) Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventExchange.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceFormatterTest.java activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceInterceptorDestinationTest.java activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityDefinition.java activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityState.java activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessDefinition.java activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessInstance.java activemq/camel/trunk/components/camel-jpa/pom.xml activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/idempotent/jpa/MessageProcessed.java activemq/camel/trunk/components/camel-jpa/src/main/resources/META-INF/persistence.xml activemq/camel/trunk/components/camel-jpa/src/test/resources/META-INF/persistence.xml Copied: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventMessage.java (from r734343, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java) URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventMessage.java?p2=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventMessage.java&p1=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java&r1=734343&r2=734401&rev=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventMessage.java Wed Jan 14 06:06:19 2009 @@ -17,6 +17,7 @@ package org.apache.camel.processor.interceptor; import java.io.Serializable; +import java.util.Date; import org.apache.camel.Exchange; import org.apache.camel.Message; @@ -25,14 +26,13 @@ import org.apache.camel.util.MessageHelper; /** - * A trace event message that contains decomposited information about the traced - * {...@link Exchange} at the point of interception. The information is stored as snapshot copies - * using String types. + * Default JPA based {...@link TraceEventMessage}. */ -public final class TraceEventMessage implements Serializable { +public final class DefaultTraceEventMessage implements Serializable, TraceEventMessage { - private String fromEndpointUri; + private Date timestamp; private String previousNode; + private String fromEndpointUri; private String toNode; private String exchangeId; private String shortExchangeId; @@ -43,22 +43,23 @@ private String bodyType; private String outBody; private String outBodyType; - private String exception; + private String causedByException; /** - * Creates a {...@link TraceEventMessage} based on the given node it was traced while processing + * Creates a {...@link DefaultTraceEventMessage} based on the given node it was traced while processing * the current {...@link Exchange} * * @param toNode the node where this trace is intercepted * @param exchange the current {...@link Exchange} */ - public TraceEventMessage(final ProcessorType toNode, final Exchange exchange) { + public DefaultTraceEventMessage(final Date timestamp, final ProcessorType toNode, final Exchange exchange) { Message in = exchange.getIn(); // false because we don't want to introduce side effects Message out = exchange.getOut(false); // need to use defensive copies to avoid Exchange altering after the point of interception + this.timestamp = timestamp; this.fromEndpointUri = exchange.getFromEndpoint() != null ? exchange.getFromEndpoint().getEndpointUri() : null; this.previousNode = extractPreviousNode(exchange); this.toNode = extractNode(toNode); @@ -71,7 +72,7 @@ this.bodyType = MessageHelper.getBodyTypeName(in); this.outBody = MessageHelper.extractBodyAsString(out); this.outBodyType = MessageHelper.getBodyTypeName(out); - this.exception = exchange.getException() != null ? exchange.getException().toString() : null; + this.causedByException = exchange.getException() != null ? exchange.getException().toString() : null; } // Implementation @@ -96,28 +97,18 @@ // Properties //--------------------------------------------------------------- - /** - * Uri of the endpoint that started the {...@link Exchange} currently being traced. - */ + public Date getTimestamp() { + return timestamp; + } + public String getFromEndpointUri() { return fromEndpointUri; } - /** - * Gets the previous node. - * <p/> - * Will return <tt>null</tt> if this is the first node, then you can use the from endpoint uri - * instread to indicate the start - */ public String getPreviousNode() { return previousNode; } - /** - * Gets the current node that just have been intercepted and processed - * <p/> - * Is never null. - */ public String getToNode() { return toNode; } @@ -126,9 +117,6 @@ return exchangeId; } - /** - * Gets the exchange id without the leading hostname - */ public String getShortExchangeId() { return shortExchangeId; } @@ -161,12 +149,68 @@ return outBodyType; } - public String getException() { - return exception; + public String getCausedByException() { + return causedByException; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + public void setFromEndpointUri(String fromEndpointUri) { + this.fromEndpointUri = fromEndpointUri; + } + + public void setPreviousNode(String previousNode) { + this.previousNode = previousNode; + } + + public void setToNode(String toNode) { + this.toNode = toNode; + } + + public void setExchangeId(String exchangeId) { + this.exchangeId = exchangeId; + } + + public void setShortExchangeId(String shortExchangeId) { + this.shortExchangeId = shortExchangeId; + } + + public void setExchangePattern(String exchangePattern) { + this.exchangePattern = exchangePattern; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public void setHeaders(String headers) { + this.headers = headers; + } + + public void setBody(String body) { + this.body = body; + } + + public void setBodyType(String bodyType) { + this.bodyType = bodyType; + } + + public void setOutBody(String outBody) { + this.outBody = outBody; + } + + public void setOutBodyType(String outBodyType) { + this.outBodyType = outBodyType; + } + + public void setCausedByException(String causedByException) { + this.causedByException = causedByException; } @Override public String toString() { - return "TraceEventMessage[" + exchangeId + "] to node: " + toNode; + return "TraceEventMessage[" + exchangeId + "] on node: " + toNode; } } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventExchange.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventExchange.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventExchange.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventExchange.java Wed Jan 14 06:06:19 2009 @@ -26,7 +26,7 @@ * Represents a trace of an {...@link org.apache.camel.Exchange}, intercepted at the given node * that occured during routing. * <p/> - * The IN body contains {...@link TraceEventMessage} with trace details of the original IN message. + * The IN body contains {...@link DefaultTraceEventMessage} with trace details of the original IN message. */ public class TraceEventExchange extends DefaultExchange { private String nodeId; @@ -83,6 +83,6 @@ @Override public String toString() { - return "TraceEventExchange[" + tracedExchange.getExchangeId() + "] on node: " + nodeId; + return "TraceEventExchange[" + tracedExchange.getExchangeId() + "] on node id: " + nodeId; } } Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java?rev=734401&view=auto ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java (added) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java Wed Jan 14 06:06:19 2009 @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.camel.processor.interceptor; + +import java.util.Date; + +/** + * A trace event message that contains decomposited information about the traced + * {...@link org.apache.camel.Exchange} at the point of interception. The information is stored as snapshot copies + * using String types. + */ +public interface TraceEventMessage { + + /** + * Gets the timestamp when the interception occured + */ + Date getTimestamp(); + + /** + * Uri of the endpoint that started the {...@link org.apache.camel.Exchange} currently being traced. + */ + String getFromEndpointUri(); + + /** + * Gets the previous node. + * <p/> + * Will return <tt>null</tt> if this is the first node, then you can use the from endpoint uri + * instread to indicate the start + */ + String getPreviousNode(); + + /** + * Gets the current node that just have been intercepted and processed + * <p/> + * Is never null. + */ + String getToNode(); + + String getExchangeId(); + + /** + * Gets the exchange id without the leading hostname + */ + String getShortExchangeId(); + + String getExchangePattern(); + + String getProperties(); + + String getHeaders(); + + String getBody(); + + String getBodyType(); + + String getOutBody(); + + String getOutBodyType(); + + /** + * Gets the caused by exception (ie {...@link org.apache.camel.Exchange#getException() Exchange#getException()}. + */ + String getCausedByException(); +} Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceEventMessage.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java Wed Jan 14 06:06:19 2009 @@ -17,6 +17,8 @@ package org.apache.camel.processor.interceptor; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Processor; @@ -27,6 +29,8 @@ import org.apache.camel.processor.Logger; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.TraceableUnitOfWork; +import org.apache.camel.util.IntrospectionSupport; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.ServiceHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,12 +42,14 @@ */ public class TraceInterceptor extends DelegateProcessor implements ExchangeFormatter { private static final transient Log LOG = LogFactory.getLog(TraceInterceptor.class); + private static final String JPA_TRACE_EVENT_MESSAGE = "org.apache.camel.processor.interceptor.JpaTraceEventMessage"; private static final String TRACE_EVENT = "CamelTraceEvent"; private Logger logger; private Producer traceEventProducer; private final ProcessorType node; private final Tracer tracer; private TraceFormatter formatter; + private Class jpaTraceEventMessageClass; public TraceInterceptor(ProcessorType node, Processor target, TraceFormatter formatter, Tracer tracer) { super(target); @@ -91,7 +97,6 @@ // okay this is a regular exchange being routed we might need to log and trace try { - // before if (shouldLog) { logExchange(exchange); @@ -150,13 +155,43 @@ if (tracer.getDestinationUri() != null) { // create event and add it as a property on the original exchange TraceEventExchange event = new TraceEventExchange(exchange); + Date timestamp = new Date(); event.setNodeId(node.getId()); - event.setTimestamp(new Date()); + event.setTimestamp(timestamp); event.setTracedExchange(exchange); // create event message to send in body - TraceEventMessage msg = new TraceEventMessage(node, exchange); - event.getIn().setBody(msg); + TraceEventMessage msg = new DefaultTraceEventMessage(timestamp, node, exchange); + + // should we use ordinay or jpa objects + if (tracer.isUseJpa()) { + LOG.trace("Using class: " + JPA_TRACE_EVENT_MESSAGE + " for tracing event messages"); + + // load the jpa event class + synchronized (this) { + if (jpaTraceEventMessageClass == null) { + jpaTraceEventMessageClass = ObjectHelper.loadClass(JPA_TRACE_EVENT_MESSAGE); + if (jpaTraceEventMessageClass == null) { + throw new IllegalArgumentException("Cannot find class: " + JPA_TRACE_EVENT_MESSAGE + + ". Make sure camel-jpa.jar is on the classpath."); + } + } + } + + Object jpa = ObjectHelper.newInstance(jpaTraceEventMessageClass); + + // copy options from event to jpa + Map options = new HashMap(); + IntrospectionSupport.getProperties(msg, options, null); + IntrospectionSupport.setProperties(jpa, options); + // and set the timestamp as its not a String type + IntrospectionSupport.setProperty(jpa, "timestamp", msg.getTimestamp()); + + event.getIn().setBody(jpa); + } else { + event.getIn().setBody(msg); + } + // marker property to indicate its a tracing event being routed in case // new Exchange instances is created during trace routing so we can check // for this marker when interceptor also kickins in during routing of trace events Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java Wed Jan 14 06:06:19 2009 @@ -42,6 +42,7 @@ private boolean traceExceptions = true; private boolean traceOutExchanges; private String destinationUri; + private boolean useJpa; /** * A helper method to return the Tracer instance for a given {...@link CamelContext} if one is enabled @@ -174,4 +175,18 @@ this.destinationUri = destinationUri; } + public boolean isUseJpa() { + return useJpa; + } + + /** + * Sets whether we should use a JpaTraceEventMessage instead of + * an ordinary {...@link org.apache.camel.processor.interceptor.DefaultTraceEventMessage} + * <p/> + * Use this to allow persistence of trace events into a database using JPA. + * This requires camel-jpa in the classpath. + */ + public void setUseJpa(boolean useJpa) { + this.useJpa = useJpa; + } } \ No newline at end of file Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java Wed Jan 14 06:06:19 2009 @@ -126,7 +126,7 @@ public static Map extractProperties(Map properties, String optionPrefix) { ObjectHelper.notNull(properties, "properties"); - HashMap rc = new HashMap(properties.size()); + HashMap rc = new LinkedHashMap(properties.size()); for (Iterator iter = properties.keySet().iterator(); iter.hasNext();) { String name = (String)iter.next(); @@ -189,8 +189,10 @@ } catch (IllegalArgumentException e) { typeConvertionFailed = e; } - LOG.trace("Setter \"" + setter + "\" with parameter type \"" - + setter.getParameterTypes()[0] + "\" could not be used for type conversions of " + value); + if (LOG.isTraceEnabled()) { + LOG.trace("Setter \"" + setter + "\" with parameter type \"" + + setter.getParameterTypes()[0] + "\" could not be used for type conversions of " + value); + } } } // we did not find a setter method to use, and if we did try to use a type converter then throw Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceFormatterTest.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceFormatterTest.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceFormatterTest.java (original) +++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceFormatterTest.java Wed Jan 14 06:06:19 2009 @@ -102,7 +102,7 @@ public void process(Exchange exchange) throws Exception { // take a snapshot at current time for assertion later // after mock assertions in unit test method - TraceEventMessage event = exchange.getIn().getBody(TraceEventMessage.class); + TraceEventMessage event = exchange.getIn().getBody(DefaultTraceEventMessage.class); tracedBodies.add(new String(event.getBody())); } } Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceInterceptorDestinationTest.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceInterceptorDestinationTest.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceInterceptorDestinationTest.java (original) +++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/TraceInterceptorDestinationTest.java Wed Jan 14 06:06:19 2009 @@ -137,7 +137,7 @@ // take a snapshot at current time for assertion later // after mock assertions in unit test method - TraceEventMessage msg = exchange.getIn().getBody(TraceEventMessage.class); + TraceEventMessage msg = exchange.getIn().getBody(DefaultTraceEventMessage.class); tracedBodies.add(msg.getBody()); if (msg.getHeaders() != null) { tracedHeaders.add(msg.getHeaders()); @@ -150,7 +150,7 @@ public void process(Exchange exchange) throws Exception { // here we can transform the message how we like want it - TraceEventMessage msg = exchange.getIn().getBody(TraceEventMessage.class); + TraceEventMessage msg = exchange.getIn().getBody(DefaultTraceEventMessage.class); // we want to store it as a CSV with from;to;exchangeId;body String s = msg.getFromEndpointUri() + ";" + msg.getToNode() + ";" + msg.getExchangeId() + ";" + msg.getBody(); Modified: activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityDefinition.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityDefinition.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityDefinition.java (original) +++ activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityDefinition.java Wed Jan 14 06:06:19 2009 @@ -30,7 +30,7 @@ */ @Entity @Table( - name = "ACTIVITYDEFINITION", + name = "CAMEL_ACTIVITYDEFINITION", uniqueConstraints = @UniqueConstraint(columnNames = {"name"}) ) public class ActivityDefinition extends EntitySupport { Modified: activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityState.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityState.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityState.java (original) +++ activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ActivityState.java Wed Jan 14 06:06:19 2009 @@ -27,6 +27,8 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; import org.apache.camel.bam.processor.ProcessContext; import org.apache.camel.bam.rules.ActivityRules; @@ -40,6 +42,9 @@ * @version $Revision$ */ @Entity +...@table( + name = "CAMEL_ACTIVITYSTATE" +) public class ActivityState extends TemporalEntity { private static final transient Log LOG = LogFactory.getLog(ActivityState.class); private ProcessInstance processInstance; Modified: activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessDefinition.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessDefinition.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessDefinition.java (original) +++ activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessDefinition.java Wed Jan 14 06:06:19 2009 @@ -35,7 +35,7 @@ */ @Entity @Table( - name = "PROCESSDEFINITION", + name = "CAMEL_PROCESSDEFINITION", uniqueConstraints = @UniqueConstraint(columnNames = {"name"}) ) public class ProcessDefinition extends EntitySupport { Modified: activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessInstance.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessInstance.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessInstance.java (original) +++ activemq/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/model/ProcessInstance.java Wed Jan 14 06:06:19 2009 @@ -29,6 +29,7 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; +import javax.persistence.Table; import org.apache.camel.bam.rules.ActivityRules; import org.apache.commons.logging.Log; @@ -40,6 +41,9 @@ * @version $Revision$ */ @Entity +...@table( + name = "CAMEL_PROCESSINSTANCE" +) public class ProcessInstance { private static final transient Log LOG = LogFactory.getLog(ProcessInstance.class); private ProcessDefinition processDefinition; Modified: activemq/camel/trunk/components/camel-jpa/pom.xml URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/pom.xml?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-jpa/pom.xml (original) +++ activemq/camel/trunk/components/camel-jpa/pom.xml Wed Jan 14 06:06:19 2009 @@ -35,7 +35,8 @@ <properties> <camel.osgi.export.pkg>org.apache.camel.component.jpa.*, - org.apache.camel.processor.idempotent.jpa.*</camel.osgi.export.pkg> + org.apache.camel.processor.idempotent.jpa.* + org.apache.camel.processor.interceptor.*</camel.osgi.export.pkg> </properties> <dependencies> @@ -135,7 +136,8 @@ <openjpac directory="${basedir}/target/jpa-classes"> <classpath refid="cp"/> <fileset dir="${basedir}/target/classes"> - <include name="org/apache/camel/processor/**/M*.class"/> + <include name="org/apache/camel/processor/**/MessageProcessed.class"/> + <include name="org/apache/camel/processor/**/JpaTraceEventMessage.class"/> </fileset> <config propertiesFile="${basedir}/src/main/resources/META-INF/persistence.xml"/> </openjpac> Modified: activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/idempotent/jpa/MessageProcessed.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/idempotent/jpa/MessageProcessed.java?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/idempotent/jpa/MessageProcessed.java (original) +++ activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/idempotent/jpa/MessageProcessed.java Wed Jan 14 06:06:19 2009 @@ -27,7 +27,7 @@ */ @Entity @Table( - name = "MESSAGEPROCESSED", + name = "CAMEL_MESSAGEPROCESSED", uniqueConstraints = @UniqueConstraint(columnNames = {"processorName", "messageId"}) ) public class MessageProcessed { Added: activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java?rev=734401&view=auto ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java (added) +++ activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java Wed Jan 14 06:06:19 2009 @@ -0,0 +1,181 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.camel.processor.interceptor; + +import java.util.Date; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A JPA based {...@link org.apache.camel.processor.interceptor.TraceEventMessage} that is capable of persisting + * trace event into a database. + */ +...@entity +...@table( + name = "CAMEL_MESSAGETRACED" +) +public class JpaTraceEventMessage implements TraceEventMessage { + + protected Long id; + protected Date timestamp; + protected String previousNode; + protected String fromEndpointUri; + protected String toNode; + protected String exchangeId; + protected String shortExchangeId; + protected String exchangePattern; + protected String properties; + protected String headers; + protected String body; + protected String bodyType; + protected String outBody; + protected String outBodyType; + protected String causedByException; + + public JpaTraceEventMessage() { + } + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Date getTimestamp() { + return timestamp; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + public String getPreviousNode() { + return previousNode; + } + + public void setPreviousNode(String previousNode) { + this.previousNode = previousNode; + } + + public String getFromEndpointUri() { + return fromEndpointUri; + } + + public void setFromEndpointUri(String fromEndpointUri) { + this.fromEndpointUri = fromEndpointUri; + } + + public String getToNode() { + return toNode; + } + + public void setToNode(String toNode) { + this.toNode = toNode; + } + + public String getExchangeId() { + return exchangeId; + } + + public void setExchangeId(String exchangeId) { + this.exchangeId = exchangeId; + } + + public String getShortExchangeId() { + return shortExchangeId; + } + + public void setShortExchangeId(String shortExchangeId) { + this.shortExchangeId = shortExchangeId; + } + + public String getExchangePattern() { + return exchangePattern; + } + + public void setExchangePattern(String exchangePattern) { + this.exchangePattern = exchangePattern; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public String getHeaders() { + return headers; + } + + public void setHeaders(String headers) { + this.headers = headers; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public String getBodyType() { + return bodyType; + } + + public void setBodyType(String bodyType) { + this.bodyType = bodyType; + } + + public String getOutBody() { + return outBody; + } + + public void setOutBody(String outBody) { + this.outBody = outBody; + } + + public String getOutBodyType() { + return outBodyType; + } + + public void setOutBodyType(String outBodyType) { + this.outBodyType = outBodyType; + } + + public String getCausedByException() { + return causedByException; + } + + public void setCausedByException(String causedByException) { + this.causedByException = causedByException; + } + + @Override + public String toString() { + return "TraceEventMessage[" + exchangeId + "] on node: " + toNode; + } + +} Propchange: activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: activemq/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/processor/interceptor/JpaTraceEventMessage.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: activemq/camel/trunk/components/camel-jpa/src/main/resources/META-INF/persistence.xml URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/main/resources/META-INF/persistence.xml?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/main/resources/META-INF/persistence.xml (original) +++ activemq/camel/trunk/components/camel-jpa/src/main/resources/META-INF/persistence.xml Wed Jan 14 06:06:19 2009 @@ -20,6 +20,7 @@ <persistence-unit name="camel-jpa" transaction-type="RESOURCE_LOCAL"> <class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class> + <class>org.apache.camel.processor.interceptor.JpaTraceEventMessage</class> </persistence-unit> </persistence> Copied: activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java (from r734343, activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaIdempotentConsumerTest.java) URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java?p2=activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java&p1=activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaIdempotentConsumerTest.java&r1=734343&r2=734401&rev=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaIdempotentConsumerTest.java (original) +++ activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java Wed Jan 14 06:06:19 2009 @@ -14,17 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.processor.jpa; +package org.apache.camel.processor.interceptor; import java.util.List; import org.apache.camel.CamelContext; +import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.processor.IdempotentConsumerTest; -import org.apache.camel.processor.idempotent.jpa.MessageProcessed; +import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.spring.SpringCamelContext; import org.apache.camel.spring.SpringRouteBuilder; - import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.orm.jpa.JpaTemplate; @@ -34,37 +33,56 @@ import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; -import static org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository.jpaMessageIdRepository; - /** * @version $Revision$ */ -public class JpaIdempotentConsumerTest extends IdempotentConsumerTest { - protected static final String SELECT_ALL_STRING = "select x from " + MessageProcessed.class.getName() + " x where x.processorName = ?1"; - protected static final String PROCESSOR_NAME = "myProcessorName"; +public class JpaTraceEventMessageTest extends ContextTestSupport { + protected static final String SELECT_ALL_STRING = "select x from " + JpaTraceEventMessage.class.getName() + " x"; protected ApplicationContext applicationContext; protected JpaTemplate jpaTemplate; + public void testSendTraceMessage() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + assertEntityInDB(); + } + @Override protected CamelContext createCamelContext() throws Exception { - applicationContext = new ClassPathXmlApplicationContext("org/apache/camel/processor/jpa/spring.xml"); + applicationContext = new ClassPathXmlApplicationContext("org/apache/camel/processor/interceptor/springJpaTraveEvent.xml"); cleanupRepository(); return SpringCamelContext.springCamelContext(applicationContext); } @Override protected RouteBuilder createRouteBuilder() { - // START SNIPPET: idempotent return new SpringRouteBuilder() { public void configure() { - from("direct:start").idempotentConsumer( - header("messageId"), - jpaMessageIdRepository(bean(JpaTemplate.class), PROCESSOR_NAME) - ).to("mock:result"); + Tracer tracer = new Tracer(); + tracer.setDestinationUri("jpa://" + JpaTraceEventMessage.class.getName() + "?persistenceUnit=trace"); + tracer.setUseJpa(true); + getContext().addInterceptStrategy(tracer); + + from("direct:start").to("mock:result"); } }; - // END SNIPPET: idempotent + } + + private void assertEntityInDB() throws Exception { + jpaTemplate = (JpaTemplate)applicationContext.getBean("jpaTemplate", JpaTemplate.class); + + List list = jpaTemplate.find(SELECT_ALL_STRING); + assertEquals(1, list.size()); + + JpaTraceEventMessage db = (JpaTraceEventMessage) list.get(0); + assertNotNull(db.getId()); + assertEquals("direct:start", db.getFromEndpointUri()); + assertEquals("to(mock:result)", db.getToNode()); } protected void cleanupRepository() { @@ -76,7 +94,7 @@ transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus arg0) { - List list = jpaTemplate.find(SELECT_ALL_STRING, PROCESSOR_NAME); + List list = jpaTemplate.find(SELECT_ALL_STRING); for (Object item : list) { jpaTemplate.remove(item); } @@ -85,4 +103,4 @@ } }); } -} +} \ No newline at end of file Propchange: activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: activemq/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/interceptor/JpaTraceEventMessageTest.java ------------------------------------------------------------------------------ svn:mergeinfo = Modified: activemq/camel/trunk/components/camel-jpa/src/test/resources/META-INF/persistence.xml URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/test/resources/META-INF/persistence.xml?rev=734401&r1=734400&r2=734401&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/test/resources/META-INF/persistence.xml (original) +++ activemq/camel/trunk/components/camel-jpa/src/test/resources/META-INF/persistence.xml Wed Jan 14 06:06:19 2009 @@ -69,4 +69,18 @@ </properties> </persistence-unit> <!-- END SNIPPET: e1 --> + + <!-- START SNIPPET: e2 --> + <persistence-unit name="trace" transaction-type="RESOURCE_LOCAL"> + <class>org.apache.camel.processor.interceptor.JpaTraceEventMessage</class> + + <properties> + <property name="openjpa.ConnectionURL" value="jdbc:derby:target/trace;create=true"/> + <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/> + <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> + <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> + </properties> + </persistence-unit> + <!-- END SNIPPET: e2 --> + </persistence> Added: activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml?rev=734401&view=auto ============================================================================== --- activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml (added) +++ activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml Wed Jan 14 06:06:19 2009 @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + + <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> + <property name="transactionManager"> + <bean class="org.springframework.orm.jpa.JpaTransactionManager"> + <property name="entityManagerFactory" ref="entityManagerFactory"/> + </bean> + </property> + </bean> + + <!-- START SNIPPET: e1 --> + <!-- this is standard spring JPA configuration --> + <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> + <property name="entityManagerFactory" ref="entityManagerFactory"/> + </bean> + + <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> + <!-- we use trace as the persitence unit name defined in the persistence.xml file --> + <property name="persistenceUnitName" value="trace"/> + </bean> + <!-- END SNIPPET: e1 --> + +</beans> Propchange: activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: activemq/camel/trunk/components/camel-jpa/src/test/resources/org/apache/camel/processor/interceptor/springJpaTraveEvent.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml