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