Author: asankha
Date: Tue Jul 18 01:08:17 2006
New Revision: 423006

URL: http://svn.apache.org/viewvc?rev=423006&view=rev
Log:
add to svn from wiki

Added:
    incubator/synapse/trunk/java/xdocs/Synapse_Configuration_Language.html

Added: incubator/synapse/trunk/java/xdocs/Synapse_Configuration_Language.html
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/xdocs/Synapse_Configuration_Language.html?rev=423006&view=auto
==============================================================================
--- incubator/synapse/trunk/java/xdocs/Synapse_Configuration_Language.html 
(added)
+++ incubator/synapse/trunk/java/xdocs/Synapse_Configuration_Language.html Tue 
Jul 18 01:08:17 2006
@@ -0,0 +1,466 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <meta content="text/html; charset=ISO-8859-1"
+ http-equiv="content-type">
+  <title>Synapse Configuration Language</title>
+</head>
+<body>
+<h1>Synapse Configuration Language<br>
+</h1>
+<p>The Synapse configuration language is designed to support a
+processing model where messages come into Synapse, are processed via
+some number of mediators and then delivered to an endpoint somewhere.
+This design currently does not support the concept of "service
+mediation." It is also currently direction agnostic, but directionality
+can easily be added as a selection mechanism for mediators (see below
+for details). </p>
+<h2>Overall Structure</h2>
+<p>A Synapse configuration looks like the following at the top level: </p>
+<pre> &lt;synapse&gt;<br>   &lt;definitions&gt;<br>     (sequencedef | 
endpointdef | literalpropertydef | extensiondef)+<br>   
&lt;definitions&gt;?<br> &lt;proxies&gt;<br>   proxyservice+<br> 
&lt;/proxies&gt;?<br> &lt;rules&gt;<br>   mediator+<br> &lt;/rules&gt;<br> 
&lt;/synapse&gt;<br>
+</pre>
+<h3>Definitions</h3>
+<p>The &lt;definitions&gt; section defines reusable elements that can
+be used from within the rules, and the &lt;rules&gt; section contains
+the sequence of mediators that every message passes through during
+mediation. </p>
+<h3>Proxy services</h3>
+<p>The &lt;proxies&gt; section defines Synapse Proxy services, which
+are real Axis2 services hosted on Synapse, which allows WSDL mediation
+as well as the ability to expose existing services on Synapse, with
+possibly different semantics, such as WS-Security, WS-RM and Transport
+switching etc. </p>
+<p>A proxyservice token represents a &lt;proxy&gt; element which is
+used to define a Synapse Proxy service. </p>
+<pre> &lt;proxy name="string" [description="string"] 
[transports="(http|https|jms)+|all"]&gt;<br>   &lt;target sequence="name" | 
endpoint="name"/&gt;? // default is main sequence<br>   &lt;wsdl 
url="url"&gt;?<br>   &lt;schema url="url"&gt;*<br>   &lt;policy 
url="url"&gt;*<br>   &lt;property name="string" value="string"/&gt;*<br> 
&lt;/proxy&gt;<br>
+</pre>
+<p>A proxy service is created and exposed on the specified transports
+through the underlying Axis2 instance, exposing service EPR's as per
+the standard Axis2 conventions. (Note: that currently Axis2 does not
+allow custom URI's to be set for services on some transports.) The
+Proxy service could be exposed over all enabled Axis2 transports such
+as http, https, JMS etc. or on a subset of these. Each service could
+define the target for received messages as a named sequence or a direct
+endpoint. If a target is not supplied, the default Synapse rules will
+apply for message mediation. Any supplied policies would apply as
+service level policies, and any properties could be passed into the
+proxy services' AxisService instance (e.g.
+the JMS destination etc) </p>
+<h4>Sequences</h4>
+<p>A sequencedef token represents a &lt;sequence&gt; element which is
+used to define a named sequence of mediators that can be invoked later
+by name as a sequence of mediators. </p>
+<pre> &lt;sequence name="string"&gt;<br>   mediator+<br> &lt;/sequence&gt;<br>
+</pre>
+<h4>Endpoints</h4>
+<p>An endpointdef token represents an &lt;endpoint&gt; element which is
+used to give a logical name to an endpoint address. If the address is
+not just a simple URL, then extensibility elements may be used to
+indicate the address (i.e. to compute the address at runtime). </p>
+<pre> &lt;endpoint name="string" [address="url"]&gt;<br><br>   .. 
extensibility ..<br><br>   &lt;parameter name="OutflowSecurity"&gt;<br>     
...<br>   &lt;/parameter&gt;<br><br>   &lt;wsp:Policy 
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy";..<br>     
xmlns:wsrm="http://ws.apache.org/sandesha2/policy"; wsu:Id="RMPolicy"&gt;<br>    
 ...<br>   &lt;/Policy&gt;<br><br>   .. extensibility ..<br><br> 
&lt;/endpoint&gt;<br>
+</pre>
+<p>An Axis2 Parameter element within an endpoint definition with the
+name " OutflowSecurity"
+describes the Apache Rampart security configuration to be used for
+messages flowing to this endpoint. Please see Rampart/Axis2
+documentation for more details. </p>
+<p>A Policy element within an endpoint definition with an Id of
+"RMPolicy" describes the Apache Sandesha2 RM configuration (or any
+overrides against the default) to be used for messages flowing to this
+endpoint. Please see Sandesha2/Axis2 documentation for more details. </p>
+<h4>Extensions</h4>
+<p>An extensiondef token represents an extension element that extends
+the core Synapse configuration. An extension provider must create an
+ExtensionFactory
+implementation that defines the type of element that the factory
+handles. At runtime the configuration builder loads any extensions
+through the Java service provider model, and then passes any unknown
+elements to the extension factory finder which will return the
+registered factory, if any. Then the factory is requested to process
+the extension element and create the extension, and this could be set
+as a 'property' into the SynapseConfiguration
+object. The Spring configuration extension operates in this manner and
+creates the Spring application contexts and sets it to the
+configuration as a property. </p>
+<p>See 'Extensibility of Synapse' below for more details. </p>
+<p>Note: The supported extensions are loaded through the J2SE Service
+Provider model. (<a rel="nofollow"
+ 
href="http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider";><img
+ src="file:///wiki/modern/img/moin-www.png" alt="[WWW]" height="11"
+ width="11">
+http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider</a>)
+</p>
+<h4>Properties</h4>
+<p>The token literalpropertydef refers to a &lt;set-property&gt;
+element as follows: </p>
+<pre> &lt;set-property name="string" value="string"/&gt;<br>
+</pre>
+<p>which is used to set a global property with a constant value. </p>
+<p>These properties are top level properties which are set globally for
+the entire system. Values of these properties can be retrieved via the
+extension XPath function called "synapse:get-property(prop-name)". </p>
+<h3>Mediators</h3>
+<p>A mediator token refers to any of the following tokens: </p>
+<pre>send | drop | log | makefault | transform | header | filter | switch | 
class | validate | setproperty | sequenceref | in | out <br>
+</pre>
+<p>In addition to the above, Synapse will be able to load mediators via
+the J2SE Service Provider model. Mediator extensions must implement the
+MediatorFactory interface, similarly to the configuration extensions
+mentioned
+previously. </p>
+<h4>Send</h4>
+<p>The send token represents a &lt;send&gt; element. The &lt;send&gt;
+element is used to send messages out of Synapse to some endpoint, and
+stop further mediation of the message. The send mediator also copies
+any message context properties named "correlate/*" from the current
+message context to the reply message received on the execution of the
+send operation. This allows the reply messages to be correlated to the
+original messages in a flexible manner. Messages may be correlated by
+WS-A MessageID, or even simple custom text labels. See example 1 for
+more details. </p>
+<p>In the simplest case, the place to send the message to is implicit
+in the message (via a property of the message itself)- that is
+indicated by the following: </p>
+<pre> &lt;send/&gt;<br>
+</pre>
+<p>If the message is to be sent to one or more endpoints, then the
+following is used: </p>
+<pre> &lt;send&gt;<br>   (endpointref | endpoint)+<br> &lt;/send&gt;<br>
+</pre>
+<p>where the endpointref token refers to the following: </p>
+<pre> &lt;endpoint ref="name"/&gt;<br>
+</pre>
+<p>and the endpoint token refers to an anonymous endpoint defined
+inline: </p>
+<pre> &lt;endpoint address="url"/&gt;<br>
+</pre>
+<p>If the message is to be sent to an endpoint selected by load
+balancing across a set of endpoints, then it is indicated by the
+following: </p>
+<pre> &lt;send&gt;<br>   &lt;load-balance algorithm="uri"&gt;<br>     
(endpointref | endpoint)+<br>   &lt;/load-balance&gt;<br> &lt;/send&gt;<br>
+</pre>
+<p>Similarly, if the message is to be sent to an endpoint with failover
+semantics, then it is indicated by the following: </p>
+<pre> &lt;send&gt;<br>   &lt;failover&gt;<br>     (endpointref | 
endpoint)+<br>   &lt;/failover&gt;<br> &lt;/send&gt;<br>
+</pre>
+<p>Once the &lt;send&gt; mediator executes, further processing of the
+current message stops. </p>
+<p>Note: Synapse does not yet support the load balancing or failover
+semantics, and supports only a single endpoint reference. </p>
+<h4>Drop</h4>
+<p>The drop token refers to a &lt;drop&gt; element which is used to
+drop a message: </p>
+<pre> &lt;drop/&gt;<br>
+</pre>
+<p>Once the &lt;drop&gt; mediator executes, further processing of the
+current message stops. </p>
+<h4>Log</h4>
+<p>The log token refers to a &lt;log&gt; element which may be used to
+log messages being mediated: </p>
+<pre> &lt;log [level="string"] [seperator="string"]&gt;<br>   &lt;property 
name="string" (value="literal" | expression="xpath")/&gt;*<br> &lt;/log&gt;<br>
+</pre>
+<p>The optional level attribute selects a pre-defined subset of
+properties to be logged. e.g. simple = To, From, WSAction, SOAPAction,
+ReplyTo,
+MessageID and any properties </p>
+<ul>
+  <li style="list-style-type: none;">
+    <p>headers = All SOAP header blocks
+and any properties full = all attributes included in log level 'simple'
+and the SOAP envelope and any properties custom = Only properties
+specified to the Log mediator </p>
+  </li>
+</ul>
+<p>A seperator if defined will be used to seperate the attributes being
+logged. The default seperator is the ',' comma. </p>
+<h4>Transforms</h4>
+<h5>Faults</h5>
+<pre> &lt;makefault [version="soap11|soap12"]&gt;<br>   &lt;code 
(value="literal" | expression="xpath")/&gt;<br>   &lt;reason (value="literal" | 
expression="xpath")&gt;<br>   &lt;node&gt;?<br>   &lt;role&gt;?<br>   
&lt;detail&gt;?<br> &lt;/makefault&gt;<br>
+</pre>
+<p>The &lt;makefault&gt; mediator transforms the current message into a
+fault message, but does NOT send it. The &lt;send&gt; mediator needs to
+be invoked to send a fault message created this way. The fault message
+"to" header is set to the "faultTo" of the original message if such a
+header existed on the original message, else it is set it to the
+"replyTo" of the original message. </p>
+<h5>XSLT/XQuery</h5>
+<pre> &lt;transform xslt|xquery="url" [source="xpath"]&gt;<br>   &lt;property 
name="string" (value="literal" | expression="xpath")/&gt;*<br> 
&lt;/transform&gt;<br>
+</pre>
+<p>The &lt;transform&gt; mediator applies the specified XSLT or XQuery
+transformation to the given element. If the source element is not
+specified, it defaults to the soap body content. Optionally parameters
+(XSLT) or variables (XQuery) could be passed into the transformations
+through the &lt;property&gt; elements. </p>
+<p>Note: Synapse does not currently support XQuery transformations </p>
+<h5>Headers</h5>
+<pre> &lt;header name="qname" (value="literal" | expression="xpath") 
[action="set"]/&gt;<br> &lt;header name="qname" action="remove"/&gt;<br>
+</pre>
+<p>The &lt;header&gt; mediator sets or removes a specified header from
+the current soap message. Currently the set header only supports simple
+valued headers. In the future we may extend this to have XML structured
+headers by embedding the XML content within the element itself. The
+optional action attribute specifies whether the mediator should set or
+remove the header. If omitted, it defaults to a set-header. </p>
+<h4>Selection</h4>
+<h5>Filters</h5>
+<pre> &lt;filter (source="xpath" regex="string") | xpath="xpath"&gt;<br>   
mediator+<br> &lt;/filter&gt;<br>
+</pre>
+<p>The &lt;filter&gt; mediator either test the given xpath expression
+as a boolean expression, or match the evaluation result of a source
+xpath expression against the given regular expression. If the test
+succeeds, the filter mediator will execute the enclosed mediators in
+sequence. </p>
+<h5>Switch</h5>
+<pre> &lt;switch source="xpath"&gt;<br>   &lt;case regex="string"&gt;<br>     
mediator+<br>   &lt;/case&gt;+<br>   &lt;default&gt;<br>     mediator+<br>   
&lt;/default&gt;?<br> &lt;/switch&gt;<br>
+</pre>
+<p>The &lt;switch&gt; mediator will evaluate the given source xpath
+expression into its string value, and match it against the given
+regular expressions. If the specified cases does not match and a
+default case exists, it will be executed. </p>
+<h4>Validation</h4>
+<pre> &lt;validate schema="url" [source="xpath"]&gt;<br>   &lt;on-fail&gt;<br> 
    mediator+<br>   &lt;/on-fail&gt;<br> &lt;/validate&gt;<br>
+</pre>
+<p>The &lt;validate&gt; mediator validates the result of the evaluation
+of the source xpath expression, against the schema specified. If the
+source attribute is not specified, the validation is performed against
+the soap body content of the current message. If the validation fails,
+the on-fail sequence of mediators is executed. </p>
+<p>Note: As the validation mediator is strongly dependent on the Xerces
+2.8.0 parser, it is bundled with the Synapse extensions, so that the
+Synapse core will remain simple and lightweight. </p>
+<h4>Properties</h4>
+<pre> &lt;set-property name="string" (value="literal" | 
expression="xpath")/&gt;<br>
+</pre>
+<p>The setproperty token refers to a &lt;set-property&gt; element which
+is a mediator that has no direct impact on the message but rather on
+the message context flowing through Synapse. The properties thus set on
+the message context applies only to the current message and can be
+later retrieved through the synapse:get-property(prop-name) extension
+function. </p>
+<h4>Class Mediators</h4>
+<pre> &lt;class name="class-name"&gt;<br>   &lt;property name="string" 
(value="literal" | expression="xpath")/&gt;*<br> &lt;/class&gt; <br>
+</pre>
+<p>The class mediator creates an instance of the specified class and
+sets it as a mediator. The class must implement the
+org.apache.synapse.api.Mediator interface. If any properties are
+specified, the corresponding setter methods are invoked on the class.
+However, Synapse will only support String properties. </p>
+<h4>Reusing Sequences</h4>
+<pre> &lt;sequence ref="name"/&gt;<br>
+</pre>
+<p>A sequenceref token refers to a &lt;sequence&gt; element which is
+used to invoke a named sequence of mediators. </p>
+<h3>Extensibility of Synapse</h3>
+<p>The Synapse configuration language could be easily extended, with
+configuration extensions as well as mediation extensions. The Spring
+mediator and Spring Configuration are such examples. </p>
+<h4>Spring Configuration</h4>
+<p>The &lt;spring:config&gt; element could be used to define a reusable
+Spring ApplicationContext (BeanFactory).
+This could be referred subsequently by Spring mediator instances which
+will use this context. </p>
+<pre> &lt;spring:config name="string" src="file"/&gt;<br>
+</pre>
+<p>The name attribute specifies a unique name for the configuration,
+and the src attribute specifies the Spring configuration file. </p>
+<p>Note: the &lt;spring:config&gt; element belongs to the <a
+ rel="nofollow" href="http://ws.apache.org/ns/synapse/spring";><img
+ src="file:///wiki/modern/img/moin-www.png" alt="[WWW]" height="11"
+ width="11"> http://ws.apache.org/ns/synapse/spring</a> namespace. </p>
+<h4>Spring mediator</h4>
+<pre> &lt;spring:spring bean="exampleBean1" (config="spring1" | 
src="spring.xml)"/&gt;<br>
+</pre>
+<p>The &lt;spring&gt; element creates an instance of a mediator, which
+is managed by Spring. This Spring bean must implement the Mediator
+interface for it to act as a Mediator. If a config attribute is
+specified, the bean will refer to the Spring configuration with the
+given name as its bean factory. If a src attribute specifies the Spring
+configuration file, the required application context is created inline
+and will be used by the mediator instance. </p>
+<h2>Examples</h2>
+<p>The following illustrates the hypothetical example used to
+illustrate the new Synapse configuration language syntax. However,
+features such as load balancing and failover etc are still not
+available with Synapse. </p>
+<p>The sample configuration presented below applies in the following
+hypothetical scenario. Assume that two web service endpoints exists,
+where registration requests could be processed. Requests may fall into
+Gold and Silver categories, and a specialized endpoint exists to
+process the Gold requests. If the Gold endpoint cannot be reached for
+whatever reason, requests should be processed via the Silver endpoint
+(i.e. failover). </p>
+<p>Once message arrive at Synapse, the 'to' address is looked up and
+different mediation rules applied depending on it. For registration
+messages, first we need to validate the incoming message against a
+schema, and if the validation fails, a log entry should be made and a
+fault reply should be sent back. For valid messages, we determine its
+category and attempt to use the Gold endpoint, failing which the Silver
+endpoint is tried. For requests that does not fall into the Gold
+category the default silver endpoint is used always. </p>
+<pre> &lt;synapse&gt;<br> &lt;definitions&gt;<br> &lt;sequence 
name="registration_flow"&gt;<br> &lt;validate 
schema="http://registry/xsd/registration.xsd"; source="//regRequest"&gt;<br> 
&lt;on-fail&gt;<br> &lt;set-property name="error-code" value="100"/&gt;<br> 
&lt;set-property name="error-reason" value="validation failed"/&gt;<br> 
&lt;sequence ref="fault_flow"/&gt;<br> &lt;/on-fail&gt;<br> &lt;/validate&gt; 
<br> &lt;filter xpath="/[EMAIL PROTECTED]'GOLD']"&gt;<br> &lt;send&gt;<br> 
&lt;failover&gt;<br> &lt;endpoint ref="gold_registration"/&gt;<br> &lt;endpoint 
ref="silver_registration"/&gt;<br> &lt;/failover&gt;<br> &lt;/send&gt;<br> 
&lt;filter&gt; <br> &lt;send&gt;<br> &lt;endpoint 
ref="silver_registration"/&gt;<br> &lt;/send&gt;<br> &lt;sequence&gt;<br> <br>
+ &lt;sequence name="fault_flow"&gt;<br> &lt;log level="simple"&gt;<br> 
&lt;property name="application" 
value="synapse:get-property('reg-app')"/&gt;<br> &lt;/log&gt;<br> &lt;makefault 
version="soap11"&gt;<br> &lt;code 
value="synapse:get-property('error-code')"/&gt;<br> &lt;reason 
expression="synapse:get-property('error-reason')"&gt;<br> &lt;makefault&gt;<br> 
&lt;send/&gt;<br> &lt;sequence&gt;<br> <br>
+ &lt;endpoint name="gold_registration" 
address="http://gold/registration"/&gt;<br> &lt;endpoint 
name="silver_registration" address="http://silver/registration"/&gt;<br> <br>
+ &lt;set-property name="reg_app" value="Registration Application"/&gt; <br> 
&lt;/definitions&gt;<br> <br>
+ &lt;rules&gt;<br> &lt;switch source="synapse:get-property('to')"&gt;<br> 
&lt;case regex="/registration"&gt;<br> &lt;sequence 
ref="registration_flow"/&gt;<br> &lt;/case&gt;<br> &lt;case 
regex="someother"&gt;<br> ...<br> &lt;/case&gt;<br> &lt;default&gt;<br> 
&lt;drop/&gt;<br> &lt;/default&gt;<br> &lt;/rules&gt;<br> <br>
+ &lt;/synapse&gt; 
+<br></pre>
+<h3>Example 0. </h3>
+<pre><br>&lt;synapse xmlns="http://ws.apache.org/ns/synapse"&gt;<br>  <br>  
&lt;definitions&gt;<br>    <br>    &lt;sequence name="stockquote"&gt;<br>       
   &lt;!-- set the To address to the real endpoint --&gt;<br>      &lt;header 
name="To" value="http://ws.invesbot.com/stockquotes.asmx"/&gt;<br>    <br>      
     &lt;!-- check if the symbol is MSFT --&gt;<br>      &lt;filter 
xpath="//*[wsx:symbol='MSFT']" xmlns:wsx="http://ws.invesbot.com/"&gt;<br>      
 &lt;!-- if it is throw a fault --&gt;<br>       &lt;makefault&gt;<br>          
         &lt;code value="tns:Receiver" 
xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;<br>                    
  &lt;reason value="Isn't there a Windows API for that?"/&gt;<br>         
&lt;/makefault&gt;<br>      &lt;/filter&gt;<br>    &lt;/sequence&gt;<br><br>  
&lt;/definitions&gt;<br><br>  &lt;rules&gt;<br>   &lt;!-- now log the message 
using log4j --&gt;<br>      &lt;log level="full"/&gt;<br>   <br>    &lt;!-- 
Check if the URL matches the stockquote gateway/dumb case --&gt;<
 br>    &lt;filter source="get-property('To')" regex=".*/StockQuote.*"&gt;<br>  
                &lt;sequence ref="stockquote"/&gt;<br>          
&lt;/filter&gt;<br>     <br>    &lt;!-- check if the URL matches the virtual 
url - either the proxy or ws-add case --&gt;<br>           &lt;filter 
source="get-property('To')" regex="http://.*stockquotes.*"&gt;<br>           
&lt;sequence ref="stockquote"/&gt;<br>          &lt;/filter&gt;<br>     <br>    
&lt;!-- send the message on --&gt;<br>          &lt;send/&gt;<br>  
&lt;/rules&gt;<br><br>&lt;/synapse&gt;  <br>
+</pre>
+<p>The above configuration is available with the Synapse distribution
+and illustrates the usual Stock quote examples. The client code for
+these are available with the Synapse samples, and the README.txt of the
+samples defines these in detail. </p>
+<h3>Example 1. </h3>
+&lt;synapse xmlns="http://ws.apache.org/ns/synapse"&gt;<br>
+&nbsp; <br>
+&nbsp; &lt;definitions&gt;<br>
+<br>
+&nbsp;&nbsp;&nbsp; &lt;sequence name="customrequest"&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- set the To address to the
+real endpoint --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;header name="To"
+value="http://ws.invesbot.com/stockquotes.asmx"/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- set correlation field to
+custom label --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;set-property
+name="correlate/label" value="customquote"/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- transform the custom
+quote into a standard quote requst --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;transform
+xslt="file:synapse_repository/conf/sample/transform.xslt"/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- send message to real
+endpoint and stop --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;send/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>
+<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;sequence
+name="customresponse"&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- transform the custom
+quote into a standard quote requst --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;transform
+xslt="file:synapse_repository/conf/sample/transform_back.xslt"/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- now send the custom
+response back to the client and stop --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;send/&gt;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>
+&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp;&nbsp; &lt;sequence name="stockquote"&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- set the To address to the
+real endpoint --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;header name="To"
+value="http://ws.invesbot.com/stockquotes.asmx"/&gt;<br>
+&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- check if the symbol is
+MSFT --&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter
+xpath="//*[wsx:symbol='MSFT']"
+xmlns:wsx="http://www.webserviceX.NET/"&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- if it is
+throw a fault --&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;makefault&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;code value="tns:Receiver"
+xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;reason value="Isn't there a Windows API for that?"/&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/makefault&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;send/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>
+&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp;&nbsp; &lt;sequence name="standardrequest"&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- now log the
+message using log4j --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;log level="full"/&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- Check if the URL
+matches the stockquote gateway/dumb case --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter
+source="get-property('To')" regex=".*/StockQuote.*"&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;sequence ref="stockquote"/&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- check if the URL
+matches the virtual url - either the proxy or ws-add case --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter
+source="get-property('To')" regex="http://stockquote.*"&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;sequence ref="stockquote"/&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- send the message
+on --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;send/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>
+<br>
+&nbsp; &lt;/definitions&gt;<br>
+<br>
+&nbsp; &lt;rules&gt;<br>
+&nbsp; &nbsp;&nbsp; &nbsp;&lt;in&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- is this a custom
+stock quote message? --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter
+xpath="//m0:CheckPriceRequest"
+xmlns:m0="http://www.apache-synapse.org/test"&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;sequence ref="customrequest"/&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- else, proceed as
+usual with the standard processing rules --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;sequence
+ref="standardrequest"/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/in&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;out&gt;<br>
+&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- is this a custom
+stock quote reply? --&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter
+source="get-property('correlate/label')" regex="customquote"&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&lt;sequence ref="customresponse"/&gt;<br>
+&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br>
+<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;!-- just
+let the message flow through --&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;send/&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/out&gt;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;<br>
+&nbsp; &lt;/rules&gt;<br>
+<br>
+&lt;/synapse&gt; <br>
+<p>This example illustrates the correlation of incoming and outgoing
+messages and the use of the &lt;in&gt; and &lt;out&gt; mediators that
+simplify the mediation configuration. This example also shows how an
+XSLT transformation of a message may be performed on receipt or reply,
+and also how a SOAP fault message may be created when required. </p>
+<h3>Example 2. </h3>
+<pre>&lt;synapse xmlns="http://ws.apache.org/ns/synapse"&gt;<br>  <br>  
&lt;definitions&gt;<br>  <br>          &lt;!-- define global properties 
--&gt;<br>     &lt;set-property name="version" value="0.1"/&gt;<br>  <br>      
&lt;!-- define a reuseable endpoint definition and use it within config 
--&gt;<br>      &lt;endpoint name="invesbot" 
address="http://ws.invesbot.com/stockquotes.asmx"/&gt;<br><br>    &lt;sequence 
name="customrequest"&gt;<br>        &lt;!-- is this a valid custom request ? 
--&gt;<br>     &lt;validate 
schema="file:synapse_repository/conf/sample/validate.xsd"&gt;<br>              
&lt;on-fail&gt;<br>                 &lt;!-- if the request does not validate 
againt schema throw a fault --&gt;<br>         &lt;makefault&gt;<br>            
       &lt;code value="tns:Receiver" 
xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;<br>                    
  &lt;reason value="Invalid custom quote request"/&gt;<br>                
&lt;/makefault&gt;<br>          <br>            &lt;!-- send the fault and stop 
processing --&gt;<br>           &lt
 ;send/&gt;<br>             &lt;/on-fail&gt;<br>                  
&lt;/validate&gt;<br><br>             &lt;switch 
source="//m0:CheckPriceRequest/m0:Code" 
xmlns:m0="http://www.apache-synapse.org/test"&gt;<br>                    
&lt;case regex="IBM"&gt;<br>                        &lt;set-property 
name="symbol" value="Great stock - IBM"/&gt;<br>                   
&lt;/case&gt;<br>               &lt;case regex="MSFT"&gt;<br>                   
  &lt;set-property name="symbol" value="Are you sure? - MSFT"/&gt;<br>          
        &lt;/case&gt;<br>               &lt;default&gt;<br>               
&lt;set-property name="symbol" expression="fn:concat('Normal Stock - ', 
//m0:CheckPriceRequest/m0:Code)" 
xmlns:m0="http://www.apache-synapse.org/test"/&gt;<br>               
&lt;/default&gt;<br>                  &lt;/switch&gt;<br>             <br>      
      &lt;!-- set a dynamic (local) message property --&gt;<br>               
<br>    <br>          &lt;!-- set correlation field to custom label --&gt;<br>  
      &lt;set-property name="correlate/label" value="customquote"/&gt;<br>      
      <br>            &lt;!-- transform the custom quote into a standard quote 
requst --&gt;<br> 
        &lt;transform 
xslt="file:synapse_repository/conf/sample/transform.xslt"/&gt;<br>        <br>  
          &lt;log level="custom"&gt;<br>                  &lt;property 
name="Text" value="Sending quote request"/&gt;<br>                 &lt;property 
name="version" expression="get-property('version')"/&gt;<br>               
&lt;property name="symbol" expression="get-property('symbol')"/&gt;<br>         
&lt;/log&gt;<br>        <br>            &lt;!-- send message to real endpoint 
referenced by name "invesbot" and stop --&gt;<br>         &lt;send&gt;<br>      
          &lt;endpoint ref="invesbot"/&gt;<br>            &lt;/send&gt;<br>    
&lt;/sequence&gt;<br><br>          &lt;sequence name="customresponse"&gt;<br>   
   &lt;!-- transform the custom quote into a standard quote requst --&gt;<br>   
   &lt;transform 
xslt="file:synapse_repository/conf/sample/transform_back.xslt"/&gt;<br>         
  <br>            &lt;!-- now send the custom response back to the client and 
stop --&gt;<br>     &lt;send/&gt;           <br>    &lt;/sequence&gt;<br>    
<br>    &lt;sequence name="stockquote"&gt;
 <br>           &lt;!-- set the To address to the real endpoint --&gt;<br>      
&lt;header name="To" value="http://ws.invesbot.com/stockquotes.asmx"/&gt;<br>   
 <br>           &lt;!-- check if the symbol is MSFT --&gt;<br>      &lt;filter 
xpath="//*[wsx:symbol='MSFT']" xmlns:wsx="http://www.webserviceX.NET/"&gt;<br>  
         &lt;!-- if it is throw a fault --&gt;<br>       &lt;makefault&gt;<br>  
                 &lt;code value="tns:Receiver" 
xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;<br>                    
  &lt;reason value="Isn't there a Windows API for that?"/&gt;<br>         
&lt;/makefault&gt;<br>      &lt;/filter&gt;<br>      <br>      
&lt;send/&gt;<br>    &lt;/sequence&gt;<br>    <br>    &lt;sequence 
name="standardrequest"&gt;<br>                &lt;!-- now log the message using 
log4j --&gt;<br>              &lt;log level="full"/&gt;<br>           <br>      
      &lt;!-- Check if the URL matches the stockquote gateway/dumb case 
--&gt;<br>            &lt;filter source="get-property('To')" 
regex=".*/StockQuote.*"&gt;<br>                  &lt;sequence ref="st
 ockquote"/&gt;<br>             &lt;/filter&gt;<br>             <br>            
&lt;!-- check if the URL matches the virtual url - either the proxy or ws-add 
case --&gt;<br>                   &lt;filter source="get-property('To')" 
regex="http://stockquote.*"&gt;<br>                      &lt;sequence 
ref="stockquote"/&gt;<br>          &lt;/filter&gt;<br>                          
   <br>            &lt;!-- send the message on --&gt;<br>          
&lt;send/&gt;<br>    &lt;/sequence&gt;<br><br>  &lt;/definitions&gt;<br><br>  
&lt;rules&gt;<br>         &lt;in&gt;<br>          &lt;!-- is this a custom 
stock quote message? --&gt;<br>                &lt;filter 
xpath="//m0:CheckPriceRequest" 
xmlns:m0="http://www.apache-synapse.org/test"&gt;<br>                 
&lt;sequence ref="customrequest"/&gt;<br>               &lt;/filter&gt;<br>     
        <br>            &lt;!-- else, proceed as usual with the standard 
processing rules --&gt;<br>            &lt;sequence 
ref="standardrequest"/&gt;<br>             &lt;/in&gt;<br>         <br>         
   &lt;out&gt;<br>                 &lt;!-- is this a custom stock quote reply? 
--&gt;<br>          &lt;filter source="get-property('correlate/label')" 
regex="custom
 quote"&gt;<br>                 &lt;sequence ref="customresponse"/&gt;<br>      
        &lt;/filter&gt;<br><br>                 &lt;!-- just let the message 
flow through --&gt;<br>              &lt;send/&gt;<br>             &lt;/out&gt; 
           <br>  &lt;/rules&gt;<br><br>&lt;/synapse&gt;  <br>
+</pre>
+<p>This example adds onto the example 2 shown above and shows how the
+validate mediator could be used to perform message validation. This
+also illustrates the use of custom properties with the log mediator,
+global properties and message context properties and how they may be
+queried via the synapse:get-property(name) XPath extension function.
+See the Synapse samples for more information on this example and to try
+it out for real with the given test client. You will need to place the
+Xerces 2.8.0 jars into your &lt;JAVA_HOME&gt;/lib/endorsed directory,
+and the synapse-extensions.jar into the &lt;SYNAPSE&gt;/lib folder for
+this excersice as the validation mediator extension is dependent on the
+Xerces parser. </p>
+<h3>Example 3. </h3>
+<pre>&lt;synapse xmlns="http://ws.apache.org/ns/synapse"; 
xmlns:spring="http://ws.apache.org/ns/synapse/spring"&gt;
+ &lt;definitions&gt;<br> &lt;spring:config name="springconfig" 
src="./../../repository/conf/sample/springsample.xml"/&gt;<br> 
&lt;/definitions&gt;<br>
+ &lt;rules&gt;<br> &lt;spring:spring bean="springtest" 
config="springconfig"/&gt;<br> &lt;spring:spring bean="springtest" 
src="./../../repository/conf/sample/springsample.xml"/&gt;<br> 
&lt;/rules&gt;<br>&lt;/synapse&gt;<br>
+</pre>
+</body>
+</html>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to