You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2008/08/20 07:34:42 UTC
svn commit: r687245 - in /servicemix/sandbox/gertv/smx-sling: ./
servicemix-audit-jcr/src/main/java/org/apache/servicemix/audit/jcr/
servicemix-sling-console/src/main/resources/initial-content/apps/servicemix/dashboard/
servicemix-sling-console/src/mai...
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 {@link 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 {@link 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",