[savara-commits] savara SVN: r392 - in trunk: validators/jboss/common/src/main/configs/models and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Sep 6 12:53:50 EDT 2010


Author: objectiser
Date: 2010-09-06 12:53:49 -0400 (Mon, 06 Sep 2010)
New Revision: 392

Added:
   trunk/validators/jboss/common/src/main/configs/models/PurchaseGoods.cdm
   trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/JBossESBInterceptor.java
   trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/AbstractJBossWSNativeInterceptor.java
Removed:
   trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeInterceptorUtil.java
Modified:
   trunk/samples/purchasing/PurchaseGoods.cdm
   trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/ServiceValidator.java
   trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceRecorder.java
   trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceValidator.java
   trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/ValidatorFilter.java
   trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeClientInterceptor.java
   trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeServerInterceptor.java
Log:
Hooked jbossws-native interceptors into service validator. Producing some initial validation events, but currently flagging some messages as unexpected. PurchaseGoods.cdm has been added to models folder with the necessary annotations.

Modified: trunk/samples/purchasing/PurchaseGoods.cdm
===================================================================
--- trunk/samples/purchasing/PurchaseGoods.cdm	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/samples/purchasing/PurchaseGoods.cdm	2010-09-06 16:53:49 UTC (rev 392)
@@ -53,26 +53,38 @@
     <variableDefinitions description="Channel to facilitate interaction to Supplier" name="SupplierChannel" type="//@typeDefinitions/@channelTypes.1"/>
     <variableDefinitions description="This is the variable buy" name="buy" type="//@typeDefinitions/@informationTypes.2"/>
     <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyRequest" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
-      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction BuyRequest" name="BuyRequestRequestExchange" type="//@typeDefinitions/@informationTypes.2"/>
+      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction BuyRequest" name="BuyRequestRequestExchange" type="//@typeDefinitions/@informationTypes.2">
+        <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+      </exchangeDetails>
     </activities>
     <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheck" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
-      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction CreditCheck" name="CreditCheckRequestExchange" type="//@typeDefinitions/@informationTypes.5"/>
+      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction CreditCheck" name="CreditCheckRequestExchange" type="//@typeDefinitions/@informationTypes.5">
+        <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+      </exchangeDetails>
     </activities>
     <activities xsi:type="org.pi4soa.cdl:Choice" description="Is credit ok?">
       <activities xsi:type="org.pi4soa.cdl:Sequence" description="Credit Valid">
         <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheckOk" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
-          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckOk" name="CreditCheckOkRespondExchange" type="//@typeDefinitions/@informationTypes.4" action="Respond"/>
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckOk" name="CreditCheckOkRespondExchange" type="//@typeDefinitions/@informationTypes.4" action="Respond">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
         </activities>
         <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyConfirmed" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
-          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyConfirmed" name="BuyConfirmedRespondExchange" type="//@typeDefinitions/@informationTypes.0" action="Respond"/>
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyConfirmed" name="BuyConfirmedRespondExchange" type="//@typeDefinitions/@informationTypes.0" action="Respond">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
         </activities>
       </activities>
       <activities xsi:type="org.pi4soa.cdl:Sequence" description="Credit Invalid">
         <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheckFailed" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
-          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckFailed" name="CreditCheckFailedRespondExchange" type="//@typeDefinitions/@informationTypes.3" action="Respond" faultName="CreditCheckFailed"/>
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckFailed" name="CreditCheckFailedRespondExchange" type="//@typeDefinitions/@informationTypes.3" action="Respond" faultName="CreditCheckFailed">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
         </activities>
         <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyFailed" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
-          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyFailed" name="BuyFailedRespondExchange" type="//@typeDefinitions/@informationTypes.1" action="Respond" faultName="BuyFailed"/>
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyFailed" name="BuyFailedRespondExchange" type="//@typeDefinitions/@informationTypes.1" action="Respond" faultName="BuyFailed">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
         </activities>
       </activities>
     </activities>

Added: trunk/validators/jboss/common/src/main/configs/models/PurchaseGoods.cdm
===================================================================
--- trunk/validators/jboss/common/src/main/configs/models/PurchaseGoods.cdm	                        (rev 0)
+++ trunk/validators/jboss/common/src/main/configs/models/PurchaseGoods.cdm	2010-09-06 16:53:49 UTC (rev 392)
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<org.pi4soa.cdl:Package xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.pi4soa.cdl="http:///org/pi4soa/cdl.ecore" description="The choreography description for PurchaseGoods" name="PurchaseGoods" author="gary" version="0.1" targetNamespace="http://www.jboss.org/savara/examples">
+  <typeDefinitions>
+    <nameSpaces description="Target Namespace for PurchaseGoods" prefix="tns" uRI="http://www.jboss.org/savara/examples"/>
+    <nameSpaces description="XML Schema Namespace" prefix="xsd" uRI="http://www.w3.org/2001/XMLSchema"/>
+    <nameSpaces prefix="sto" uRI="http://www.jboss.org/examples/store" schemaLocation="store.xsd"/>
+    <nameSpaces prefix="ca" uRI="http://www.jboss.org/examples/creditAgency" schemaLocation="creditAgency.xsd"/>
+    <informationTypes description="This is the information type BuyConfirmed" name="BuyConfirmed" typeName="" elementName="sto:BuyConfirmed"/>
+    <informationTypes description="This is the information type BuyFailed" name="BuyFailed" typeName="" elementName="sto:BuyFailed"/>
+    <informationTypes description="This is the information type BuyRequest" name="BuyRequest" typeName="" elementName="sto:BuyRequest"/>
+    <informationTypes description="This is the information type CreditCheckInvalid" name="CreditCheckInvalid" typeName="" elementName="ca:CreditCheckInvalid"/>
+    <informationTypes description="This is the information type CreditCheckOk" name="CreditCheckOk" typeName="" elementName="ca:CreditCheckOk"/>
+    <informationTypes description="This is the information type CreditCheckRequest" name="CreditCheckRequest" typeName="" elementName="ca:CreditCheckRequest"/>
+    <informationTypes description="This is the information type IDType" name="IDType" typeName="xsd:string"/>
+    <informationTypes description="This is the information type URITokenType" name="URITokenType" typeName="xsd:anyURI"/>
+    <tokens description="This is the token ID" name="ID" informationType="//@typeDefinitions/@informationTypes.6"/>
+    <tokens description="This is the token URIToken" name="URIToken" informationType="//@typeDefinitions/@informationTypes.7"/>
+    <tokenLocators description="This is the token locator BuyFailedIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.1" query="//@id" name="BuyFailedIDLocator"/>
+    <tokenLocators description="This is the token locator BuyRequestIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.2" query="//@id" name="BuyRequestIDLocator"/>
+    <tokenLocators description="This is the token locator BuyResponseIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.0" query="//@id" name="BuyResponseIDLocator"/>
+    <tokenLocators description="This is the token locator CreditCheckInvalidIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.3" query="//@id" name="CreditCheckInvalidIDLocator"/>
+    <tokenLocators description="This is the token locator CreditCheckRequestIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.5" query="//@id" name="CreditCheckRequestIDLocator"/>
+    <tokenLocators description="This is the token locator CreditCheckResponseIDLocator" token="//@typeDefinitions/@tokens.0" informationType="//@typeDefinitions/@informationTypes.4" query="//@id" name="CreditCheckResponseIDLocator"/>
+    <roleTypes description="This is the role type Buyer" name="Buyer">
+      <behaviors description="This is the behavior BuyerBehavior" name="BuyerBehavior"/>
+    </roleTypes>
+    <roleTypes description="This is the role type CreditAgency" name="CreditAgency">
+      <behaviors description="This is the behavior CreditAgencyBehavior" name="CreditAgencyBehavior" interface="ca:CreditAgencyInterface"/>
+    </roleTypes>
+    <roleTypes description="This is the role type Store" name="Store">
+      <behaviors description="This is the behavior StoreBehavior" name="StoreBehavior" interface="sto:StoreInterface"/>
+    </roleTypes>
+    <relationshipTypes description="Relationship between Buyer and Store" name="BuyerToStoreRel" firstRoleType="//@typeDefinitions/@roleTypes.0" secondRoleType="//@typeDefinitions/@roleTypes.2"/>
+    <relationshipTypes description="Relationship between Store and CreditAgency" name="StoreToCreditAgencyRel" firstRoleType="//@typeDefinitions/@roleTypes.2" secondRoleType="//@typeDefinitions/@roleTypes.1"/>
+    <participantTypes description="This is the participant type Buyer" name="Buyer" roleTypes="//@typeDefinitions/@roleTypes.0">
+      <semanticAnnotations annotation="savara.samples.Purchasing at Buyer" name="conversationType"/>
+    </participantTypes>
+    <participantTypes description="This is the participant type ca:CreditAgency" name="ca:CreditAgency" roleTypes="//@typeDefinitions/@roleTypes.1">
+      <semanticAnnotations annotation="savara.samples.Common at CreditAgency" name="conversationType"/>
+    </participantTypes>
+    <participantTypes description="This is the participant type sto:Store" name="sto:Store" roleTypes="//@typeDefinitions/@roleTypes.2">
+      <semanticAnnotations annotation="savara.samples.Purchasing at Store" name="conversationType"/>
+    </participantTypes>
+    <channelTypes description="This is the channel type CreditAgencyChannelType" name="CreditAgencyChannelType" referenceToken="//@typeDefinitions/@tokens.1" roleType="//@typeDefinitions/@roleTypes.1">
+      <identities description="ID" tokens="//@typeDefinitions/@tokens.0"/>
+    </channelTypes>
+    <channelTypes description="This is the channel type StoreChannelType" name="StoreChannelType" referenceToken="//@typeDefinitions/@tokens.1" roleType="//@typeDefinitions/@roleTypes.2">
+      <identities description="ID" tokens="//@typeDefinitions/@tokens.0"/>
+    </channelTypes>
+  </typeDefinitions>
+  <choreographies description="Choreography flow for the PurchaseGoods process" name="PurchaseGoodsProcess" root="true">
+    <variableDefinitions description="Channel to facilitate interaction to CreditAgency" name="CreditAgencyChannel" type="//@typeDefinitions/@channelTypes.0"/>
+    <variableDefinitions description="Channel to facilitate interaction to Supplier" name="SupplierChannel" type="//@typeDefinitions/@channelTypes.1"/>
+    <variableDefinitions description="This is the variable buy" name="buy" type="//@typeDefinitions/@informationTypes.2"/>
+    <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyRequest" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
+      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction BuyRequest" name="BuyRequestRequestExchange" type="//@typeDefinitions/@informationTypes.2">
+        <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+      </exchangeDetails>
+    </activities>
+    <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheck" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
+      <exchangeDetails description="This is the exchange details for the request exchange associated with interaction CreditCheck" name="CreditCheckRequestExchange" type="//@typeDefinitions/@informationTypes.5">
+        <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+      </exchangeDetails>
+    </activities>
+    <activities xsi:type="org.pi4soa.cdl:Choice" description="Is credit ok?">
+      <activities xsi:type="org.pi4soa.cdl:Sequence" description="Credit Valid">
+        <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheckOk" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckOk" name="CreditCheckOkRespondExchange" type="//@typeDefinitions/@informationTypes.4" action="Respond">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
+        </activities>
+        <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyConfirmed" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyConfirmed" name="BuyConfirmedRespondExchange" type="//@typeDefinitions/@informationTypes.0" action="Respond">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
+        </activities>
+      </activities>
+      <activities xsi:type="org.pi4soa.cdl:Sequence" description="Credit Invalid">
+        <activities xsi:type="org.pi4soa.cdl:Interaction" name="CreditCheckFailed" operation="checkCredit" channelVariable="//@choreographies.0/@variableDefinitions.0" relationship="//@typeDefinitions/@relationshipTypes.1">
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction CreditCheckFailed" name="CreditCheckFailedRespondExchange" type="//@typeDefinitions/@informationTypes.3" action="Respond" faultName="CreditCheckFailed">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/creditAgency}CreditAgencyService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
+        </activities>
+        <activities xsi:type="org.pi4soa.cdl:Interaction" name="BuyFailed" operation="buy" channelVariable="//@choreographies.0/@variableDefinitions.1" relationship="//@typeDefinitions/@relationshipTypes.0">
+          <exchangeDetails description="This is the exchange details for the respond exchange associated with interaction BuyFailed" name="BuyFailedRespondExchange" type="//@typeDefinitions/@informationTypes.1" action="Respond" faultName="BuyFailed">
+            <semanticAnnotations annotation="&lt;validator>&#xD;&#xA;&#x9;&lt;destination name=&quot;{{Destination;The URI for the destination;string;;{http://www.jboss.org/examples/store}StoreService}}&quot;&#xD;&#xA;&#x9;&#x9;dynamicReplyTo=&quot;{{Dynamic ReplyTo;Whether the replyTo destination is dynamic;boolean;;false}}&quot; />&#xD;&#xA;&lt;/validator>&#xD;&#xA;" name="validator"/>
+          </exchangeDetails>
+        </activities>
+      </activities>
+    </activities>
+  </choreographies>
+</org.pi4soa.cdl:Package>

Modified: trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/ServiceValidator.java
===================================================================
--- trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/ServiceValidator.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/ServiceValidator.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -34,19 +34,21 @@
 	 * This method processes a sent message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process sent message 
 	 */
-	public void messageSent(java.io.Serializable msg) throws Exception;
+	public void messageSent(String mesgType, java.io.Serializable msg) throws Exception;
 	
 	/**
 	 * This method processes a received message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process received message 
 	 */
-	public void messageReceived(java.io.Serializable msg) throws Exception;
+	public void messageReceived(String mesgType, java.io.Serializable msg) throws Exception;
 	
 	/**
 	 * This method is called to update the model associated

Modified: trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceRecorder.java
===================================================================
--- trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceRecorder.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceRecorder.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -94,16 +94,19 @@
 	 * This method processes a sent message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process sent message 
 	 */
-	public void messageSent(java.io.Serializable msg) throws Exception {
+	public void messageSent(String mesgType, java.io.Serializable msg) throws Exception {
      	
     	if (msg == null) {
     		throw new ServiceException("Failed to obtain value from message: "+msg);
     	}
     	
-    	String mesgType=MessageUtil.getMessageType(msg);
+    	if (mesgType == null) {
+    		mesgType = MessageUtil.getMessageType(msg);
+    	}
 
     	org.pi4soa.service.Message mesg=
     			m_monitor.createMessage(mesgType,
@@ -118,16 +121,19 @@
 	 * This method processes a received message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process received message 
 	 */
-	public void messageReceived(java.io.Serializable msg) throws Exception {
+	public void messageReceived(String mesgType, java.io.Serializable msg) throws Exception {
      	
     	if (msg == null) {
     		throw new ServiceException("Failed to obtain value from message: "+msg);
     	}
     	
-    	String mesgType=MessageUtil.getMessageType(msg);
+    	if (mesgType == null) {
+    		mesgType = MessageUtil.getMessageType(msg);
+    	}
 
     	org.pi4soa.service.Message mesg=
     			m_monitor.createMessage(mesgType,

Modified: trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceValidator.java
===================================================================
--- trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceValidator.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/common/src/main/java/org/jboss/savara/validator/pi4soa/Pi4SOAServiceValidator.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -155,17 +155,20 @@
 	 * This method processes a sent message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process sent message 
 	 */
-	public void messageSent(java.io.Serializable msg) throws Exception {
+	public void messageSent(String mesgType, java.io.Serializable msg) throws Exception {
     	
     	if (msg == null) {
     		throw new ServiceException("Failed to obtain value from message: "+msg);
     	}
     	
-    	String mesgType=MessageUtil.getMessageType(msg);
-
+    	if (mesgType == null) {
+    		mesgType = MessageUtil.getMessageType(msg);
+    	}
+    	
     	org.pi4soa.service.Message mesg=
     			m_monitor.createMessage(mesgType,
     				null, null, msg, null, null);
@@ -179,16 +182,19 @@
 	 * This method processes a received message against a service
 	 * behavioural description.
 	 * 
+	 * @param mesgType The optional message type
 	 * @param msg The message
 	 * @throws Exception Failed to process received message 
 	 */
-	public void messageReceived(java.io.Serializable msg) throws Exception {
+	public void messageReceived(String mesgType, java.io.Serializable msg) throws Exception {
     	
     	if (msg == null) {
     		throw new ServiceException("Failed to obtain value from message: "+msg);
     	}
     	
-    	String mesgType=MessageUtil.getMessageType(msg);
+    	if (mesgType == null) {
+    		mesgType = MessageUtil.getMessageType(msg);
+    	}
 
     	org.pi4soa.service.Message mesg=
     			m_monitor.createMessage(mesgType,

Copied: trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/JBossESBInterceptor.java (from rev 378, trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/ValidatorFilter.java)
===================================================================
--- trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/JBossESBInterceptor.java	                        (rev 0)
+++ trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/JBossESBInterceptor.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -0,0 +1,285 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+package org.jboss.savara.validator.jbossesb;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.log4j.Logger;
+
+import org.jboss.savara.validator.Endpoint;
+import org.jboss.savara.validator.ServiceValidator;
+import org.jboss.savara.validator.ServiceValidatorManager;
+import org.jboss.soa.esb.message.*;
+import org.jboss.soa.esb.couriers.*;
+
+/**
+ * This class represents the filter used to intercept ESB
+ * messages an apply them to relevant Service Validators.
+ */
+public class JBossESBInterceptor extends org.jboss.soa.esb.filter.InputOutputFilter {
+	
+	private static final String TOPIC_PREFIX = "topic/";
+	private static final String QUEUE_PREFIX = "queue/";
+	private static final String JMS_PROTOCOL_PREFIX = "jms:";
+
+	private static final Logger logger = Logger.getLogger(JBossESBInterceptor.class);
+	
+	private ServiceValidatorManager m_serviceValidatorManager=null;
+	
+	/**
+	 * The default constructor.
+	 */
+	public JBossESBInterceptor() {
+	}
+	
+	/**
+	 * This method returns the service validator manager.
+	 * 
+	 * @return The service validator manager
+	 */
+	protected ServiceValidatorManager getServiceValidatorManager() {
+		if (m_serviceValidatorManager == null) {
+			try {
+				InitialContext ctx = new InitialContext();
+				m_serviceValidatorManager =
+					(ServiceValidatorManager)ctx.lookup("savara/ServiceValidatorManager");
+			} catch (NamingException e) {
+				throw new RuntimeException("Failed to locate Savara Service Validator Manager");
+			}
+		}
+		
+		return(m_serviceValidatorManager);
+	}
+	
+	/**
+	 * This method is invoked when a message is sent by an
+	 * ESB service.
+	 * 
+	 * @param msg The ESB message
+	 * @param params The parameters
+	 * @throws CourierException Failed to validate message
+	 */
+	public Message onOutput(Message msg, java.util.Map params)
+			throws CourierException {
+		
+		Endpoint endpoint=getEndpoint(msg);
+		
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getOutputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
+
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageSent(null, ESBUtil.getMessage(msg));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle sent message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid sent message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		throw new CourierException("Failed to handle sent message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames, ex);
+		        	}
+				} else {
+				
+					// Check whether a dynamic reply is expected
+					if (getServiceValidatorManager().isOutputDynamicReplyTo(endpoint)) {
+						
+						// Register interest in the 'reply-to' endpoint
+						Endpoint replyTo=getReplyToEndpoint(msg);
+						
+						if (replyTo != null) {
+							getServiceValidatorManager().registerInputReplyToValidators(replyTo,
+											validators);
+						} else {
+							logger.error("Unable to get 'reply-to' endpoint for message: "+msg);
+						}
+					}
+				}
+			}
+		}
+	        
+		return(msg);
+	}
+	
+	/**
+	 * This method is invoked when a message is received by an
+	 * ESB service.
+	 * 
+	 * @param msg The ESB message
+	 * @param params The parameters
+	 * @throws CourierException Failed to validate message
+	 */
+	public Message onInput(Message msg, java.util.Map params)
+			throws CourierException {
+		
+		Endpoint endpoint=getEndpoint(msg);
+		
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getInputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
+
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageReceived(null, ESBUtil.getMessage(msg));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid received message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		throw new CourierException("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames, ex);
+		        	}
+				} else {
+				
+					// Check whether a dynamic reply is expected
+					if (getServiceValidatorManager().isInputDynamicReplyTo(endpoint)) {
+						
+						// Register interest in the 'reply-to' endpoint
+						Endpoint replyTo=getReplyToEndpoint(msg);
+						
+						if (replyTo != null) {
+							getServiceValidatorManager().registerOutputReplyToValidators(replyTo,
+											validators);
+						} else {
+							logger.error("Unable to get 'reply-to' endpoint for message: "+msg);
+						}
+					}
+				}
+			}
+		}
+
+		return(msg);
+	}
+	
+	/**
+	 * This method returns an endpoint associated with the 'to'
+	 * destination of the supplied message.
+	 * 
+	 * @param msg The message
+	 * @return The endpoint, or null if not relevant
+	 */
+	protected Endpoint getEndpoint(Message msg) {
+		Endpoint ret=null;
+		
+		if (msg != null && msg.getHeader() != null && 
+				msg.getHeader().getCall() != null &&
+				msg.getHeader().getCall().getTo() != null &&
+				msg.getHeader().getCall().getTo().getAddr() != null) {
+				
+			String key=msg.getHeader().getCall().getTo().getAddr().getAddress();
+			int ind=-1;
+			
+			if (key.startsWith(JMS_PROTOCOL_PREFIX) && 
+					((ind=key.indexOf(QUEUE_PREFIX)) != -1 ||
+					(ind=key.indexOf(TOPIC_PREFIX)) != -1)) {
+				ret = new Endpoint(JMS_PROTOCOL_PREFIX+key.substring(ind));
+			}
+		}
+		
+		logger.debug("Destination for message '"+msg+"' is: "+ret);
+		
+		return(ret);
+	}
+	
+	/**
+	 * This method returns an endpoint associated with the 'to'
+	 * destination of the supplied message.
+	 * 
+	 * @param msg The message
+	 * @return The endpoint, or null if not relevant
+	 */
+	protected Endpoint getReplyToEndpoint(Message msg) {
+		Endpoint ret=null;
+		
+		if (msg != null && msg.getHeader() != null && 
+				msg.getHeader().getCall() != null &&
+				msg.getHeader().getCall().getReplyTo() != null &&
+				msg.getHeader().getCall().getReplyTo().getAddr() != null) {
+				
+			String key=msg.getHeader().getCall().getReplyTo().getAddr().getAddress();
+			int ind=-1;
+			
+			if (key.startsWith(JMS_PROTOCOL_PREFIX) && 
+					((ind=key.indexOf(QUEUE_PREFIX)) != -1 ||
+					(ind=key.indexOf(TOPIC_PREFIX)) != -1)) {
+				ret = new Endpoint(JMS_PROTOCOL_PREFIX+key.substring(ind));
+			}
+		}
+		
+		logger.debug("Reply-To Destination for message '"+msg+"' is: "+ret);
+
+		return(ret);
+	}
+}

Modified: trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/ValidatorFilter.java
===================================================================
--- trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/ValidatorFilter.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/esb/src/main/java/org/jboss/savara/validator/jbossesb/ValidatorFilter.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -1,285 +1,36 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and others contributors as indicated
- * by the @authors tag. All rights reserved.
- * See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License, v. 2.1.
- * This program is distributed in the hope that it will be useful, but WITHOUT A
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License,
- * v.2.1 along with this distribution; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA  02110-1301, USA.
- */
-package org.jboss.savara.validator.jbossesb;
-
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import org.apache.log4j.Logger;
-
-import org.jboss.savara.validator.Endpoint;
-import org.jboss.savara.validator.ServiceValidator;
-import org.jboss.savara.validator.ServiceValidatorManager;
-import org.jboss.soa.esb.message.*;
-import org.jboss.soa.esb.couriers.*;
-
-/**
- * This class represents the filter used to intercept ESB
- * messages an apply them to relevant Service Validators.
- */
-public class ValidatorFilter extends org.jboss.soa.esb.filter.InputOutputFilter {
-	
-	private static final String TOPIC_PREFIX = "topic/";
-	private static final String QUEUE_PREFIX = "queue/";
-	private static final String JMS_PROTOCOL_PREFIX = "jms:";
-
-	private static final Logger logger = Logger.getLogger(ValidatorFilter.class);
-	
-	private ServiceValidatorManager m_serviceValidatorManager=null;
-	
-	/**
-	 * The default constructor.
-	 */
-	public ValidatorFilter() {
-	}
-	
-	/**
-	 * This method returns the service validator manager.
-	 * 
-	 * @return The service validator manager
-	 */
-	protected ServiceValidatorManager getServiceValidatorManager() {
-		if (m_serviceValidatorManager == null) {
-			try {
-				InitialContext ctx = new InitialContext();
-				m_serviceValidatorManager =
-					(ServiceValidatorManager)ctx.lookup("savara/ServiceValidatorManager");
-			} catch (NamingException e) {
-				throw new RuntimeException("Failed to locate Savara Service Validator Manager");
-			}
-		}
-		
-		return(m_serviceValidatorManager);
-	}
-	
-	/**
-	 * This method is invoked when a message is sent by an
-	 * ESB service.
-	 * 
-	 * @param msg The ESB message
-	 * @param params The parameters
-	 * @throws CourierException Failed to validate message
-	 */
-	public Message onOutput(Message msg, java.util.Map params)
-			throws CourierException {
-		
-		Endpoint endpoint=getEndpoint(msg);
-		
-		if (endpoint != null) {
-			java.util.List<ServiceValidator> validators=
-					getServiceValidatorManager().getOutputServiceValidators(endpoint);
-			
-			if (validators != null && validators.size() > 0) {
-				boolean validated=false;
-				Exception ex=null;
-
-				for (int i=0; validators != null &&
-							i < validators.size(); i++) {
-			        try {
-			        	validators.get(i).messageSent(ESBUtil.getMessage(msg));
-			        	validated = true;
-			        } catch(Exception t) {
-			        	// Ignore
-			        	ex = t;
-			        }
-				}
-				
-				// Only raise exception if none of the service
-				// validators were able to validate the message
-				if (validated == false) {
-					String vnames="";
-					
-					for (int i=0; validators != null &&
-							i < validators.size(); i++) {
-						if (vnames.length() > 0) {
-							vnames += ", ";
-						}
-						vnames += validators.get(i).getValidatorName();
-					}
-					
-		        	logger.error("Failed to handle sent message on endpoint '"+
-		        			endpoint+"' validated against: "+vnames);
-		        	
-		        	if (logger.isDebugEnabled()) {
-		        		logger.debug("Invalid sent message", ex);
-		        	}
-		        	
-		        	if (getServiceValidatorManager().isManagedMode()) {
-		        		throw new CourierException("Failed to handle sent message on endpoint '"+
-		        			endpoint+"' validated against: "+vnames, ex);
-		        	}
-				} else {
-				
-					// Check whether a dynamic reply is expected
-					if (getServiceValidatorManager().isOutputDynamicReplyTo(endpoint)) {
-						
-						// Register interest in the 'reply-to' endpoint
-						Endpoint replyTo=getReplyToEndpoint(msg);
-						
-						if (replyTo != null) {
-							getServiceValidatorManager().registerInputReplyToValidators(replyTo,
-											validators);
-						} else {
-							logger.error("Unable to get 'reply-to' endpoint for message: "+msg);
-						}
-					}
-				}
-			}
-		}
-	        
-		return(msg);
-	}
-	
-	/**
-	 * This method is invoked when a message is received by an
-	 * ESB service.
-	 * 
-	 * @param msg The ESB message
-	 * @param params The parameters
-	 * @throws CourierException Failed to validate message
-	 */
-	public Message onInput(Message msg, java.util.Map params)
-			throws CourierException {
-		
-		Endpoint endpoint=getEndpoint(msg);
-		
-		if (endpoint != null) {
-			java.util.List<ServiceValidator> validators=
-					getServiceValidatorManager().getInputServiceValidators(endpoint);
-			
-			if (validators != null && validators.size() > 0) {
-				boolean validated=false;
-				Exception ex=null;
-
-				for (int i=0; validators != null &&
-							i < validators.size(); i++) {
-			        try {
-			        	validators.get(i).messageReceived(ESBUtil.getMessage(msg));
-			        	validated = true;
-			        } catch(Exception t) {
-			        	// Ignore
-			        	ex = t;
-			        }
-				}
-				
-				// Only raise exception if none of the service
-				// validators were able to validate the message
-				if (validated == false) {
-					String vnames="";
-					
-					for (int i=0; validators != null &&
-							i < validators.size(); i++) {
-						if (vnames.length() > 0) {
-							vnames += ", ";
-						}
-						vnames += validators.get(i).getValidatorName();
-					}
-					
-		        	logger.error("Failed to handle received message on endpoint '"+
-		        			endpoint+"' validated against: "+vnames);
-		        	
-		        	if (logger.isDebugEnabled()) {
-		        		logger.debug("Invalid received message", ex);
-		        	}
-		        	
-		        	if (getServiceValidatorManager().isManagedMode()) {
-		        		throw new CourierException("Failed to handle received message on endpoint '"+
-		        			endpoint+"' validated against: "+vnames, ex);
-		        	}
-				} else {
-				
-					// Check whether a dynamic reply is expected
-					if (getServiceValidatorManager().isInputDynamicReplyTo(endpoint)) {
-						
-						// Register interest in the 'reply-to' endpoint
-						Endpoint replyTo=getReplyToEndpoint(msg);
-						
-						if (replyTo != null) {
-							getServiceValidatorManager().registerOutputReplyToValidators(replyTo,
-											validators);
-						} else {
-							logger.error("Unable to get 'reply-to' endpoint for message: "+msg);
-						}
-					}
-				}
-			}
-		}
-
-		return(msg);
-	}
-	
-	/**
-	 * This method returns an endpoint associated with the 'to'
-	 * destination of the supplied message.
-	 * 
-	 * @param msg The message
-	 * @return The endpoint, or null if not relevant
-	 */
-	protected Endpoint getEndpoint(Message msg) {
-		Endpoint ret=null;
-		
-		if (msg != null && msg.getHeader() != null && 
-				msg.getHeader().getCall() != null &&
-				msg.getHeader().getCall().getTo() != null &&
-				msg.getHeader().getCall().getTo().getAddr() != null) {
-				
-			String key=msg.getHeader().getCall().getTo().getAddr().getAddress();
-			int ind=-1;
-			
-			if (key.startsWith(JMS_PROTOCOL_PREFIX) && 
-					((ind=key.indexOf(QUEUE_PREFIX)) != -1 ||
-					(ind=key.indexOf(TOPIC_PREFIX)) != -1)) {
-				ret = new Endpoint(JMS_PROTOCOL_PREFIX+key.substring(ind));
-			}
-		}
-		
-		logger.debug("Destination for message '"+msg+"' is: "+ret);
-		
-		return(ret);
-	}
-	
-	/**
-	 * This method returns an endpoint associated with the 'to'
-	 * destination of the supplied message.
-	 * 
-	 * @param msg The message
-	 * @return The endpoint, or null if not relevant
-	 */
-	protected Endpoint getReplyToEndpoint(Message msg) {
-		Endpoint ret=null;
-		
-		if (msg != null && msg.getHeader() != null && 
-				msg.getHeader().getCall() != null &&
-				msg.getHeader().getCall().getReplyTo() != null &&
-				msg.getHeader().getCall().getReplyTo().getAddr() != null) {
-				
-			String key=msg.getHeader().getCall().getReplyTo().getAddr().getAddress();
-			int ind=-1;
-			
-			if (key.startsWith(JMS_PROTOCOL_PREFIX) && 
-					((ind=key.indexOf(QUEUE_PREFIX)) != -1 ||
-					(ind=key.indexOf(TOPIC_PREFIX)) != -1)) {
-				ret = new Endpoint(JMS_PROTOCOL_PREFIX+key.substring(ind));
-			}
-		}
-		
-		logger.debug("Reply-To Destination for message '"+msg+"' is: "+ret);
-
-		return(ret);
-	}
-}
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.savara.validator.jbossesb;
+
+/**
+ * 
+ * @deprecated Use JBossESBInterceptor instead
+ */
+public class ValidatorFilter extends JBossESBInterceptor {
+
+	/**
+	 * The default constructor.
+	 */
+	public ValidatorFilter() {
+	}
+	
+}

Added: trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/AbstractJBossWSNativeInterceptor.java
===================================================================
--- trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/AbstractJBossWSNativeInterceptor.java	                        (rev 0)
+++ trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/AbstractJBossWSNativeInterceptor.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -0,0 +1,161 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.savara.validator.jbosswsnative;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFault;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.savara.validator.Endpoint;
+import org.jboss.savara.validator.ServiceValidatorManager;
+import org.jboss.ws.metadata.umdm.ParameterMetaData;
+import org.jboss.wsf.common.DOMWriter;
+import org.jboss.wsf.common.handler.GenericSOAPHandler;
+
+/**
+ * Common abstract base class for the client and server JBossWS
+ * native interceptors.
+ *
+ */
+public abstract class AbstractJBossWSNativeInterceptor extends GenericSOAPHandler {
+
+	private static Log logger = LogFactory.getLog(AbstractJBossWSNativeInterceptor.class);
+
+	private ServiceValidatorManager m_serviceValidatorManager=null;
+
+	/**
+	 * This method returns the service validator manager.
+	 * 
+	 * @return The service validator manager
+	 */
+	protected ServiceValidatorManager getServiceValidatorManager() {
+		if (m_serviceValidatorManager == null) {
+			try {
+				InitialContext ctx = new InitialContext();
+				m_serviceValidatorManager =
+					(ServiceValidatorManager)ctx.lookup("savara/ServiceValidatorManager");
+			} catch (NamingException e) {
+				throw new RuntimeException("Failed to locate Savara Service Validator Manager");
+			}
+		}
+		
+		return(m_serviceValidatorManager);
+	}
+	
+	/**
+	 * This method returns the message content.
+	 * 
+	 * @param soapCtx The SOAP message context
+	 * @return The message content
+	 * @throws Exception Failed to get the message content
+	 */
+	public static java.io.Serializable getMessage(SOAPMessageContext soapCtx) throws Exception {
+		java.io.Serializable ret=null;
+				
+		SOAPElement elem = getMessageBody(soapCtx);
+		if (elem != null) {
+			ret = DOMWriter.printNode(elem, true);
+		}
+		
+		return(ret);
+	}
+	
+	/**
+	 * This method determines the message type associated with the supplied SOAP
+	 * message context.
+	 * 
+	 * @param soapCtx The SOAP message context
+	 * @return The message type
+	 * @throws SOAPException Failed to determine the message type
+	 */
+	public static String getMessageType(SOAPMessageContext soapCtx) throws SOAPException {
+		String ret=null;
+		
+		if (soapCtx instanceof org.jboss.ws.core.jaxws.handler.MessageContextJAXWS) {
+			org.jboss.ws.core.jaxws.handler.MessageContextJAXWS mc=
+				(org.jboss.ws.core.jaxws.handler.MessageContextJAXWS)soapCtx;
+		    org.jboss.ws.metadata.umdm.OperationMetaData opmetadata=mc.getOperationMetaData();
+		    
+		    if (opmetadata.getInputParameters().size() == 1) {
+		    	ParameterMetaData pmd=opmetadata.getInputParameters().get(0);
+		    	
+		    	// TODO: Find out why 'genericParam' is generated when the parameter
+		    	// is a complex type
+				if (pmd.getXmlName().getLocalPart().equals("genericParam")) {
+					
+					// Extract message value
+		            SOAPElement elem=getMessageBody(soapCtx);
+		            
+		            ret = elem.getElementQName().toString();
+
+				} else {
+					ret = pmd.getXmlName().toString();
+				}
+		    }
+		}
+
+		return(ret);
+	}
+	
+	protected static SOAPElement getMessageBody(SOAPMessageContext soapCtx) throws SOAPException {
+		SOAPElement ret=null;
+		
+		// Extract message value
+        SOAPBody soapBody = soapCtx.getMessage().getSOAPPart().getEnvelope().getBody();
+		
+        ret = (SOAPElement)soapBody.getChildElements().next();
+        
+        if (ret instanceof SOAPFault) {
+        	SOAPFault fault=(SOAPFault)ret;
+        	
+        	ret = (SOAPElement)fault.getDetail().getChildElements().next();
+        }
+
+        return(ret);
+	}
+
+	/**
+	 * This method returns the endpoint associated with the supplied SOAP
+	 * message context.
+	 * 
+	 * @param soapCtx The SOAP message context
+	 * @return The endpoint
+	 */
+	public static Endpoint getEndpoint(SOAPMessageContext soapCtx) {
+		QName service=(QName)soapCtx.get(MessageContext.WSDL_SERVICE);
+        
+		if (logger.isDebugEnabled()) {
+			logger.debug("Service for endpoint = "+service);
+		}
+
+		return(new Endpoint(service.toString()));
+	}
+}

Modified: trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeClientInterceptor.java
===================================================================
--- trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeClientInterceptor.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeClientInterceptor.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -17,19 +17,16 @@
  */
 package org.jboss.savara.validator.jbosswsnative;
 
-import javax.xml.namespace.QName;
-import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.jboss.ws.metadata.umdm.ParameterMetaData;
-import org.jboss.wsf.common.DOMWriter;
-import org.jboss.wsf.common.handler.GenericSOAPHandler;
+import org.jboss.savara.validator.Endpoint;
+import org.jboss.savara.validator.ServiceValidator;
 
-public class JBossWSNativeClientInterceptor extends GenericSOAPHandler {
+public class JBossWSNativeClientInterceptor extends AbstractJBossWSNativeInterceptor {
 	
 	private static Log logger = LogFactory.getLog(JBossWSNativeClientInterceptor.class);
 
@@ -40,51 +37,113 @@
 	}
    
 	protected boolean handleInbound(MessageContext ctx) {
+		boolean ret=true;
 		SOAPMessageContext soapCtx = (SOAPMessageContext)ctx;
 
-		try {
-			Object service=ctx.get(MessageContext.WSDL_SERVICE);
-            
-			logger.info("Client: Inbound message for service="+service);
+		Endpoint endpoint=getEndpoint(soapCtx);
+		
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getOutputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
 
-			SOAPEnvelope soapEnv = soapCtx.getMessage().getSOAPPart().getEnvelope();
-			if (soapEnv != null) {
-				System.out.println(DOMWriter.printNode(soapEnv, true));
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageReceived(getMessageType(soapCtx), getMessage(soapCtx));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid received message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		ret = false;
+		        	}
+				}
 			}
-            
-			QName mesgType=JBossWSNativeInterceptorUtil.getMessageType(soapCtx);
-			
-			logger.info("Client: Inbound message type="+mesgType);
-
-		} catch (SOAPException ex) {
-			logger.error("Cannot trace SOAPMessage", ex);
 		}
 
-		return true;
+		return(ret);
 	}
 
 	protected boolean handleOutbound(MessageContext ctx) {
+		boolean ret=true;
 		SOAPMessageContext soapCtx = (SOAPMessageContext)ctx;
 
-		try {
-			Object service=ctx.get(MessageContext.WSDL_SERVICE);
-               
-			logger.info("Client: Outbound message for service="+service);
+		Endpoint endpoint=getEndpoint(soapCtx);
+		
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getOutputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
 
-			SOAPEnvelope soapEnv = soapCtx.getMessage().getSOAPPart().getEnvelope();
-			if (soapEnv != null) {
-				System.out.println(DOMWriter.printNode(soapEnv, true));
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageSent(getMessageType(soapCtx), getMessage(soapCtx));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid received message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		ret = false;
+		        	}
+				}
 			}
-            
-			QName mesgType=JBossWSNativeInterceptorUtil.getMessageType(soapCtx);
-			
-			logger.info("Client: Outbound message type="+mesgType);
-
-		} catch (SOAPException ex) {
-			logger.error("Cannot trace SOAPMessage", ex);
 		}
 
-		return true;
+		return(ret);
 	}
 
 	public boolean handleFault(MessageContext ctx) {

Deleted: trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeInterceptorUtil.java
===================================================================
--- trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeInterceptorUtil.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeInterceptorUtil.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -1,86 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.savara.validator.jbosswsnative;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.ws.handler.soap.SOAPMessageContext;
-
-import org.jboss.ws.metadata.umdm.ParameterMetaData;
-
-/**
- * This class provides utility functions for the JBossWS native interceptors.
- *
- */
-public class JBossWSNativeInterceptorUtil {
-
-	/**
-	 * This method determines the message type associated with the supplied SOAP
-	 * message context.
-	 * 
-	 * @param soapCtx The SOAP message context
-	 * @return The message type
-	 * @throws SOAPException Failed to determine the message type
-	 */
-	public static QName getMessageType(SOAPMessageContext soapCtx) throws SOAPException {
-		QName ret=null;
-		
-		if (soapCtx instanceof org.jboss.ws.core.jaxws.handler.MessageContextJAXWS) {
-			org.jboss.ws.core.jaxws.handler.MessageContextJAXWS mc=
-				(org.jboss.ws.core.jaxws.handler.MessageContextJAXWS)soapCtx;
-		    org.jboss.ws.metadata.umdm.OperationMetaData opmetadata=mc.getOperationMetaData();
-		    
-		    if (opmetadata.getInputParameters().size() == 1) {
-		    	ParameterMetaData pmd=opmetadata.getInputParameters().get(0);
-		    	
-		    	// TODO: Find out why 'genericParam' is generated when the parameter
-		    	// is a complex type
-				if (pmd.getXmlName().getLocalPart().equals("genericParam")) {
-					
-					// Extract message value
-		            SOAPBody soapBody = soapCtx.getMessage().getSOAPPart().getEnvelope().getBody();
-					
-		            SOAPElement elem=(SOAPElement)soapBody.getChildElements().next();
-		            
-		            if (elem instanceof SOAPFault) {
-		            	SOAPFault fault=(SOAPFault)elem;
-		            	
-		            	SOAPElement detail=(SOAPElement)fault.getDetail().getChildElements().next();
-		            	
-		            	ret = detail.getElementQName();
-		            	
-		            } else {
-		            	ret = elem.getElementQName();
-		            }
-				} else {
-					ret = pmd.getXmlName();
-				}
-		    }
-		}
-
-		return(ret);
-	}
-
-}

Modified: trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeServerInterceptor.java
===================================================================
--- trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeServerInterceptor.java	2010-09-06 14:37:42 UTC (rev 391)
+++ trunk/validators/jboss/wsnative/src/main/java/org/jboss/savara/validator/jbosswsnative/JBossWSNativeServerInterceptor.java	2010-09-06 16:53:49 UTC (rev 392)
@@ -17,22 +17,16 @@
  */
 package org.jboss.savara.validator.jbosswsnative;
 
-import javax.xml.namespace.QName;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.jboss.ws.metadata.umdm.ParameterMetaData;
-import org.jboss.wsf.common.DOMWriter;
-import org.jboss.wsf.common.handler.GenericSOAPHandler;
+import org.jboss.savara.validator.Endpoint;
+import org.jboss.savara.validator.ServiceValidator;
 
-public class JBossWSNativeServerInterceptor extends GenericSOAPHandler {
+public class JBossWSNativeServerInterceptor extends AbstractJBossWSNativeInterceptor {
 	
 	private static Log logger = LogFactory.getLog(JBossWSNativeServerInterceptor.class);
    
@@ -43,56 +37,113 @@
 	}
    
 	protected boolean handleInbound(MessageContext ctx) {
+		boolean ret=true;
 		SOAPMessageContext soapCtx = (SOAPMessageContext)ctx;
+
+		Endpoint endpoint=getEndpoint(soapCtx);
 		
-		try {
-			Object service=ctx.get(MessageContext.WSDL_SERVICE);
-               
-			logger.info("Server: Inbound message for service="+service);
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getInputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
 
-			SOAPEnvelope soapEnv = soapCtx.getMessage().getSOAPPart().getEnvelope();
-			if (soapEnv != null) {
-				System.out.println(DOMWriter.printNode(soapEnv, true));
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageReceived(getMessageType(soapCtx), getMessage(soapCtx));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid received message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		ret = false;
+		        	}
+				}
 			}
-			
-			//Object operation=soapCtx.get(MessageContext.WSDL_OPERATION);
-			//logger.info("Server: Inbound message for operation="+operation);
-            
-			QName mesgType=JBossWSNativeInterceptorUtil.getMessageType(soapCtx);
-
-			logger.info("Server: Inbound message type="+mesgType);
-		    
-		} catch (SOAPException ex) {
-			logger.error("Cannot trace SOAPMessage", ex);
 		}
 
-		return true;
+		return(ret);
 	}
 
 	protected boolean handleOutbound(MessageContext ctx) {
+		boolean ret=true;
 		SOAPMessageContext soapCtx = (SOAPMessageContext)ctx;
+
+		Endpoint endpoint=getEndpoint(soapCtx);
 		
-		try {
-            Object service=ctx.get(MessageContext.WSDL_SERVICE);
-            
-            logger.info("Server: Outbound message for service="+service);
-            
-            SOAPEnvelope soapEnv = soapCtx.getMessage().getSOAPPart().getEnvelope();
-            if (soapEnv != null) {
-            	System.out.println(DOMWriter.printNode(soapEnv, true));
-            }
-            
-			//Object operation=soapCtx.get(MessageContext.WSDL_OPERATION);
-			//logger.info("Server: Outbound message for operation="+operation);
+		if (endpoint != null) {
+			java.util.List<ServiceValidator> validators=
+					getServiceValidatorManager().getInputServiceValidators(endpoint);
+			
+			if (validators != null && validators.size() > 0) {
+				boolean validated=false;
+				Exception ex=null;
 
-			QName mesgType=JBossWSNativeInterceptorUtil.getMessageType(soapCtx);
-
-			logger.info("Server: Outbound message type="+mesgType);
-		} catch (SOAPException ex) {
-			logger.error("Cannot trace SOAPMessage", ex);
+				for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+			        try {
+			        	validators.get(i).messageSent(getMessageType(soapCtx), getMessage(soapCtx));
+			        	validated = true;
+			        } catch(Exception t) {
+			        	// Ignore
+			        	ex = t;
+			        }
+				}
+				
+				// Only raise exception if none of the service
+				// validators were able to validate the message
+				if (validated == false) {
+					String vnames="";
+					
+					for (int i=0; validators != null &&
+							i < validators.size(); i++) {
+						if (vnames.length() > 0) {
+							vnames += ", ";
+						}
+						vnames += validators.get(i).getValidatorName();
+					}
+					
+		        	logger.error("Failed to handle received message on endpoint '"+
+		        			endpoint+"' validated against: "+vnames);
+		        	
+		        	if (logger.isDebugEnabled()) {
+		        		logger.debug("Invalid received message", ex);
+		        	}
+		        	
+		        	if (getServiceValidatorManager().isManagedMode()) {
+		        		ret = false;
+		        	}
+				}
+			}
 		}
 
-		return true;
+		return(ret);
 	}
 
 	public boolean handleFault(MessageContext ctx) {



More information about the savara-commits mailing list