Author: gertv
Date: Tue Aug 19 22:34:41 2008
New Revision: 687245
URL: http://svn.apache.org/viewvc?rev=687245&view=rev
Log:
Committing patch by Vladislav -- improving design on JcrAuditor/SlingAuditor
and adding message flow archiving
Added:
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditorStrategy.java
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingJcrAuditorStrategy.java
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/html.esp
Removed:
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingAuditor.java
Modified:
servicemix/sandbox/gertv/smx-sling/ (props changed)
servicemix/sandbox/gertv/smx-sling/README.TXT
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditor.java
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/html.esp
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/exchanges/tr.esp
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/content/servicemix.json
Propchange: servicemix/sandbox/gertv/smx-sling/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Aug 19 22:34:41 2008
@@ -0,0 +1 @@
+target
Modified: servicemix/sandbox/gertv/smx-sling/README.TXT
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/README.TXT?rev=687245&r1=687244&r2=687245&view=diff
==============================================================================
--- servicemix/sandbox/gertv/smx-sling/README.TXT (original)
+++ servicemix/sandbox/gertv/smx-sling/README.TXT Tue Aug 19 22:34:41 2008
@@ -20,7 +20,16 @@
- servicemix-audit-jcr-1.0-SNAPSHOT.jar
6. Reconfigure ServiceMix
- - add <bean class="org.apache.servicemix.audit.jcr.SlingAuditor"/> to the
<services/> section in conf/servicemix.xml
+ - modify conf/servicemix.xml
+ - add <bean id="JcrClientFactory"
class="org.apache.jackrabbit.rmi.client.ClientRepositoryFactory"/>
+ - add <bean id="JcrRepository" factory-bean="JcrClientFactory"
factory-method="getRepository"><constructor-arg
value="rmi://localhost:1099/jackrabbit"/></bean>
+ - add to the <services/> section:
+ <bean class="org.apache.servicemix.audit.jcr.SlingAuditor">
+ <property name="repository" ref="JcrRepository"/>
+ <property name="strategy">
+ <bean
class="org.apache.servicemix.audit.jcr.SlingJcrAuditorStrategy">
+ </property>
+ </bean>
- change the rmi.port in conf/servicemix.properties to avoid the conflict
with the Sling RMI registry
Modified:
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditor.java
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditor.java?rev=687245&r1=687244&r2=687245&view=diff
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditor.java
(original)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditor.java
Tue Aug 19 22:34:41 2008
@@ -1,41 +1,48 @@
package org.apache.servicemix.audit.jcr;
-import java.net.MalformedURLException;
-import java.rmi.NotBoundException;
-import java.rmi.RemoteException;
-
import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
import javax.jcr.LoginException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
-import org.apache.jackrabbit.rmi.client.ClientRepositoryFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.jbi.audit.AbstractAuditor;
+import org.apache.servicemix.jbi.audit.AuditorException;
+import org.apache.servicemix.jbi.event.ExchangeEvent;
-public abstract class JcrAuditor extends AbstractAuditor {
+/**
+ *
+ * JCR auditor
+ *
+ * @author vkrejcirik
+ *
+ */
+public class JcrAuditor extends AbstractAuditor {
+
+ private static final Log LOG = LogFactory.getLog(JcrAuditor.class);
private Repository repository;
private ThreadLocal<Session> session = new ThreadLocal<Session>();
-
+ private JcrAuditorStrategy strategy;
+
@Override
protected void doStart() throws JBIException {
+ if (repository == null) {
+ throw new JBIException("No repository configured,
unable to start JCR auditor");
+ }
+ if (strategy == null) {
+ throw new JBIException("No JcrAuditorStrategy
configure, unable to start JCR auditor");
+ }
super.doStart();
- ClientRepositoryFactory factory = new ClientRepositoryFactory();
- try {
- repository =
factory.getRepository("rmi://localhost:1099/jackrabbit");
- } catch (MalformedURLException e) {
- throw new JBIException("Unable to connect to JCR
repository", e);
- } catch (ClassCastException e) {
- throw new JBIException("Unable to connect to JCR
repository", e);
- } catch (RemoteException e) {
- throw new JBIException("Unable to connect to JCR
repository", e);
- } catch (NotBoundException e) {
- throw new JBIException("Unable to connect to JCR
repository", e);
- }
}
+ /**
+ * Open a session with the JCR Repository
+ */
protected Session getSession() throws LoginException,
RepositoryException {
if (session .get() == null) {
Session session = repository.login(new
SimpleCredentials("admin", "admin".toCharArray()));
@@ -44,10 +51,56 @@
return session.get();
}
+ public void exchangeSent(ExchangeEvent event) {
+ try {
+ strategy.processExchange(event.getExchange(),
getSession());
+ getSession().save();
+ LOG.info("Successfully stored information about message
exchange " + event.getExchange().getExchangeId() + " in the JCR repository");
+ } catch (Exception e) {
+ LOG.error("Unable to store information about message
exchange " + event.getExchange().getExchangeId(), e);
+ }
+ }
+
public String getDescription() {
return "ServiceMix JCR Auditor";
}
+
+ // just some setters and getters
+ /**
+ * Configure the JCR Repository to connect to
+ */
+ public void setRepository(Repository repository) {
+ this.repository = repository;
+ }
+
+ /**
+ * Configure the [EMAIL PROTECTED] JcrAuditorStrategy} to use
+ * @param strategy
+ */
+ public void setStrategy(JcrAuditorStrategy strategy) {
+ this.strategy = strategy;
+ }
+
+ //to be implemented
+ @Override
+ public int deleteExchangesByIds(String[] arg0) throws AuditorException {
+ return 0;
+ }
+ @Override
+ public int getExchangeCount() throws AuditorException {
+ return 0;
+ }
+ @Override
+ public String[] getExchangeIdsByRange(int arg0, int arg1)
+ throws AuditorException {
+ return null;
+ }
+ @Override
+ public MessageExchange[] getExchangesByIds(String[] arg0)
+ throws AuditorException {
+ return null;
+ }
}
Added:
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditorStrategy.java
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditorStrategy.java?rev=687245&view=auto
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditorStrategy.java
(added)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/JcrAuditorStrategy.java
Tue Aug 19 22:34:41 2008
@@ -0,0 +1,28 @@
+package org.apache.servicemix.audit.jcr;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jcr.ItemExistsException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
+import javax.xml.transform.TransformerException;
+
+/**
+ *
+ * Interface to store an exchange on behalf of the [EMAIL PROTECTED]
JcrAuditor}
+ *
+ * @author vkrejcirik
+ *
+ */
+public interface JcrAuditorStrategy {
+
+ public abstract void processExchange(MessageExchange messageExchange,
+ Session session) throws ItemExistsException,
PathNotFoundException,
+ VersionException, ConstraintViolationException,
LockException,
+ RepositoryException, MessagingException,
TransformerException;
+
+}
Added:
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingJcrAuditorStrategy.java
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingJcrAuditorStrategy.java?rev=687245&view=auto
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingJcrAuditorStrategy.java
(added)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/SlingJcrAuditorStrategy.java
Tue Aug 19 22:34:41 2008
@@ -0,0 +1,224 @@
+package org.apache.servicemix.audit.jcr;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.ValueFormatException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
+import javax.xml.transform.TransformerException;
+
+import org.apache.jackrabbit.value.DateValue;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.util.MessageUtil;
+
+/**
+ *
+ * Class for processing message exchange based on correlation id
+ *
+ * @author vkrejcirik
+ *
+ */
+public class SlingJcrAuditorStrategy implements JcrAuditorStrategy {
+
+ public static final String RESOURCE_TYPE = "sling:resourceType";
+ public static final String EXCHANGES_RESOURCE_TYPE =
"servicemix/exchanges";
+ public static final String EXCHANGE_RESOURCE_TYPE =
"servicemix/exchange";
+ public static final String MESSAGE_FLOW_RESOURCE_TYPE =
"servicemix/message_flow";
+ public static final String NORMALIZED_MESSAGE_RESOURCE_TYPE =
"servicemix/normalizedmessage";
+ public static final String CONTENT_EXCHANGES_TYPE =
"content/servicemix/exchanges";
+
+ private static final SourceTransformer TRANSFORMER = new
SourceTransformer();
+
+ // let's time slice our message exchange archive on an hourly basis
+ private static final DateFormat FORMAT = new
SimpleDateFormat("yyyy-MM-dd hha");
+
+ public void processExchange(MessageExchange messageExchange, Session
session)
+ throws ItemExistsException, PathNotFoundException,
+ VersionException, ConstraintViolationException,
LockException,
+ RepositoryException, MessagingException,
TransformerException {
+
+ Node node = getNodeForExchange(messageExchange, session);
+
+ node.setProperty("ExchangeStatus", messageExchange.getStatus()
+ .toString());
+ node.setProperty("Pattern",
messageExchange.getPattern().toString());
+
+ if (messageExchange.getEndpoint() != null) {
+ node.setProperty("Endpoint",
messageExchange.getEndpoint()
+ .getEndpointName());
+ }
+
+ if (messageExchange.getService() != null) {
+ node
+ .setProperty("Service",
messageExchange.getService()
+ .toString());
+ }
+
+ for (Object key : messageExchange.getPropertyNames()) {
+ String name = (String) key;
+
+ node
+ .setProperty(name,
messageExchange.getProperty(name)
+ .toString());
+ }
+
+ addNormalizedMessages(node, messageExchange);
+ node.setProperty("Updated", new DateValue(new
GregorianCalendar()));
+
+ }
+
+ private Node getNodeForExchange(MessageExchange exchange, Session
session)
+ throws ItemExistsException, PathNotFoundException,
+ VersionException, ConstraintViolationException,
LockException,
+ RepositoryException {
+
+ String id = exchange.getExchangeId().replaceAll(":", "_");
+ String corr_id = exchange.getProperty(
+
"org.apache.servicemix.correlationId").toString().replaceAll(":", "_");
+
+ // node with date
+ Node parent = getExchangeBaseNode(session);
+
+ // node with correlation id
+ Node parent_corr = getCorrelationIdNode(parent, corr_id, id);
+
+ try {
+ return parent_corr.getNode(id);
+
+ } catch (PathNotFoundException e) {
+ Node node = parent_corr.addNode(id);
+ node.setProperty(RESOURCE_TYPE, EXCHANGE_RESOURCE_TYPE);
+
+ node.setProperty("Created", new DateValue(new
GregorianCalendar()));
+
+ node.addMixin("mix:versionable");
+ return node;
+ }
+ }
+
+ private synchronized Node getCorrelationIdNode(Node parent, String
corr_id,
+ String id) throws RepositoryException,
ValueFormatException,
+ VersionException, LockException,
ConstraintViolationException {
+
+ //first exchange of the flow
+ if (corr_id == null) {
+ Node node = parent.addNode(id);
+ node.setProperty(RESOURCE_TYPE,
EXCHANGES_RESOURCE_TYPE);
+
+ node.setProperty("Created", new DateValue(new
GregorianCalendar()));
+ node.setProperty("CorrelationId", corr_id);
+ return node;
+ }
+
+ try {
+ return parent.getNode(corr_id);
+
+ } catch (PathNotFoundException e) {
+
+ Node node = parent.addNode(id);
+ node.setProperty(RESOURCE_TYPE,
EXCHANGES_RESOURCE_TYPE);
+
+ node.setProperty("Created", new DateValue(new
GregorianCalendar()));
+ node.setProperty("CorrelationId", corr_id);
+
+ return node;
+ }
+ }
+
+ /**
+ *
+ * Get base node for message exchange
+ *
+ * @param session
+ * @return Node
+ * @throws RepositoryException
+ */
+ private Node getExchangeBaseNode(Session session)
+ throws RepositoryException {
+ Node exchanges =
session.getRootNode().getNode(CONTENT_EXCHANGES_TYPE);
+
+ return createOrGet(exchanges, FORMAT.format(new Date()));
+ }
+
+ /**
+ *
+ * Create or get node with the path
+ *
+ * @param exchanges
+ * @param path
+ * @return Node
+ * @throws ValueFormatException
+ * @throws VersionException
+ * @throws LockException
+ * @throws ConstraintViolationException
+ * @throws RepositoryException
+ */
+ private synchronized Node createOrGet(Node exchanges, String path)
+ throws ValueFormatException, VersionException,
LockException,
+ ConstraintViolationException, RepositoryException {
+ try {
+ return exchanges.getNode(path);
+
+ } catch (PathNotFoundException e) {
+ Node node = exchanges.addNode(path);
+ node.setProperty(RESOURCE_TYPE,
MESSAGE_FLOW_RESOURCE_TYPE);
+
+ node.setProperty("Created", new DateValue(new
GregorianCalendar()));
+ return node;
+ }
+ }
+
+ private void addNormalizedMessages(Node node, MessageExchange exchange)
+ throws ItemExistsException, PathNotFoundException,
+ VersionException, ConstraintViolationException,
LockException,
+ MessagingException, RepositoryException,
TransformerException {
+ if (exchange.getMessage("in") != null) {
+ addNormalizedMessages(node, "In",
exchange.getMessage("in"));
+ }
+ if (exchange.getMessage("out") != null) {
+ addNormalizedMessages(node, "Out",
exchange.getMessage("out"));
+ }
+ if (exchange.getMessage("fault") != null) {
+ addNormalizedMessages(node, "Fault",
exchange.getMessage("fault"));
+ }
+ }
+
+ private void addNormalizedMessages(Node parent, String type,
+ NormalizedMessage message) throws ItemExistsException,
+ PathNotFoundException, VersionException,
+ ConstraintViolationException, LockException,
RepositoryException,
+ MessagingException, TransformerException {
+ if (message != null) {
+ Node node;
+ try {
+ node = parent.getNode(type);
+ } catch (PathNotFoundException e) {
+ node = parent.addNode(type);
+ }
+ node.setProperty("Content",
getNormalizedMessageContent(message));
+ for (Object key : message.getPropertyNames()) {
+ String name = (String) key;
+ node.setProperty(name,
message.getProperty(name).toString());
+ }
+ node.setProperty(RESOURCE_TYPE,
NORMALIZED_MESSAGE_RESOURCE_TYPE);
+ }
+ }
+
+ private String getNormalizedMessageContent(NormalizedMessage message)
+ throws MessagingException, TransformerException {
+ MessageUtil.enableContentRereadability(message);
+ return TRANSFORMER.toString(message.getContent());
+ }
+}
Modified:
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/html.esp
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/html.esp?rev=687245&r1=687244&r2=687245&view=diff
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/html.esp
(original)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/html.esp
Tue Aug 19 22:34:41 2008
@@ -24,26 +24,7 @@
}
%>
</ul>
- </div>
-
- <div id="portlet">
- <h2>Recent exchange archives based on correlation id</h2>
- <ul>
- <%
- var iter =
request.resourceResolver.findResources("content/servicemix/exchanges-corr-id/*
order by @Created descending",
- Packages.javax.jcr.query.Query.XPATH);
- var i = 0;
- while (iter.hasNext() && ++i <= 10) {
- var resource = iter.next();
- var name =
resource.getPath().substr(resource.getPath().lastIndexOf("/")+1)
- %>
- <li><a href="<%= resource.getPath() + ".html" %>"><%=name%></a></li>
-<%
- }
- %>
- </ul>
- </div>
-
+ </div>
</div>
<% sling.include("/servicemix/navigation.div"); %>
Modified:
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/exchanges/tr.esp
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/exchanges/tr.esp?rev=687245&r1=687244&r2=687245&view=diff
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/exchanges/tr.esp
(original)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/exchanges/tr.esp
Tue Aug 19 22:34:41 2008
@@ -1,7 +1,10 @@
<tr>
- <td><a href="<%=currentNode%>.html">+</a></td>
+ <!-- <td><a href="<%=currentNode%>.html">+</a></td>
<td><%=currentNode['org.apache.servicemix.datestamp'] %></td>
<td><%=currentNode.Service == undefined ? "n/a" : currentNode.Service%></td>
<td><%=currentNode.Endpoint == undefined ? "n/a" :
currentNode.Endpoint%></td>
- <td><%=currentNode.ExchangeStatus%></td>
+ <td><%=currentNode.ExchangeStatus%></td> -->
+
+ <td><a href="<%=currentNode%>.html">+ <%=currentNode['CorrelationId']
%></a></td>
+
</tr>
Added:
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/html.esp
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/html.esp?rev=687245&view=auto
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/html.esp
(added)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/message_flow/html.esp
Tue Aug 19 22:34:41 2008
@@ -0,0 +1,23 @@
+<html>
+<head>
+<title>ServiceMix :: Dashboard</title>
+<link rel="stylesheet" type="text/css" href="theme/master.css"/>
+</head>
+<body>
+<div id="page">
+<h1>Servicemix :: Message flow</h1>
+
+<div id="content">
+ <div id="portlet">
+ <h2>Recent exchange archives</h2>
+ <ul>
+
+ </ul>
+ </div>
+</div>
+
+<% sling.include("/servicemix/navigation.div"); %>
+
+</div>
+</body>
+</html>
Modified:
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/content/servicemix.json
URL:
http://svn.apache.org/viewvc/servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/content/servicemix.json?rev=687245&r1=687244&r2=687245&view=diff
==============================================================================
---
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/content/servicemix.json
(original)
+++
servicemix/sandbox/gertv/smx-sling/servicemix-sling-console/src/main/resources/initial-content/content/servicemix.json
Tue Aug 19 22:34:41 2008
@@ -6,6 +6,11 @@
"jcr:primaryType":"nt:unstructured",
"sling:resourceType":"servicemix/exchanges"
},
+
+ "message_flow":{
+ "jcr:primaryType":"nt:unstructured",
+ "sling:resourceType":"servicemix/message_flow"
+ },
"navigation":{
"jcr:primaryType":"nt:unstructured",