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",


Reply via email to