<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
  <title>Apache Synapse Samples</title>
  <style type="text/css">
    .command {
        border: 1px dashed #3c78b5;
        text-align: left;
        background-color: #f0f0f0;
        padding: 3px;
        font-size: 11px;
        font-family: Courier;
        margin: 10px;
        line-height: 13px;
    }
    .consoleOutput {
        border: 1px dashed #3c78b5;
        font-size: 11px;
        font-family: Courier;
        margin: 10px;
        line-height: 13px;
        background-color: #f0f0f0;
        border-bottom: 1px dashed #3c78b5;
        padding: 3px;
        border-style: solid;
    }
    .info {
        border-style: solid;
        border-width: 1px;
        border-color: #090;
        background-color: #dfd;
        text-align:left;
        margin-top: 5px;
        margin-bottom: 5px;
    }
    li {
        font-family: Verdana, arial, sans-serif;
        font-size: 11px;
        line-height: 16px;
        color: #000000;
        font-weight: normal;
    }
    p {
        font-family: Verdana, arial, sans-serif;
        font-size: 11px;
        line-height: 16px;
        color: #000000;
        font-weight: normal;
    }
    pre {
        padding: 0px;
        margin-top: 5px;
        margin-left: 15px;
        margin-bottom: 5px;
        margin-right: 5px;
        text-align: left;
        background-color: #f0f0f0;
        padding: 3px;
        border: 1px dashed #3c78b5;
        font-size: 11px;
        font-family: Courier;
        margin: 10px;
        line-height: 13px;
    }
    h1 {
        font-size: 24px;
        line-height: normal;
        font-weight: bold;
        background-color: #f0f0f0;
        color: #003366;
        border-bottom: 1px solid #3c78b5;
        padding: 2px;
        margin: 36px 0px 4px 0px;
    }
    h2 {
        font-size: 18px;
        line-height: normal;
        font-weight: bold;
        background-color: #f0f0f0;
        border-bottom: 1px solid #3c78b5;
        padding: 2px;
        margin: 27px 0px 4px 0px;
    }
    h3 {
        font-size: 14px;
        line-height: normal;
        font-weight: bold;
        background-color: #f0f0f0;
        padding: 2px;
        margin: 21px 0px 4px 0px;
    }
    h4 {
        font-size: 12px;
        line-height: normal;
        font-weight: bold;
        background-color: #f0f0f0;
        padding: 2px;
        margin: 18px 0px 4px 0px;
    }</style>
</head>

<body>
<h1>Overview</h1>

<p></p>

<p>Synapse ships with a set of working examples that demonstrate some of the
basic features and capabilities of Synapse. A set of sample clients and
services are provided in addition to the sample configurations. Scripts are
provided to execute the sample scenarios as explained below. </p>

<h4>Prerequisites</h4>

<p>To try out the samples you will need Java development kit version 1.5.x or
later and Apache Ant version 1.6.5 or later. Ant can be downloaded from
http://ant.apache.org. The JMS examples can be executed against an ActiveMQ
installation by default (or another JMS provider with relevant configuration
changes.)</p>

<p></p>

<p>Note*: The samples and the documentation assume that you are running
Synapse in DEBUG mode. You can switch from the default INFO log messages to
DEBUG log messages by changing the line
"log4j.category.org.apache.synapse=INFO" as
"log4j.category.org.apache.synapse=DEBUG" in the lib/log4j.properties
file.</p>

<h2>Understanding the Samples</h2>

<table border="1" style="width: 100%">
  <caption></caption>
  <tbody>
    <tr>
      <td>Client</td>
      <td>Synapse</td>
      <td>Service</td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>ant stockquote</td>
      <td>./synapse.sh -sample &lt;n&gt;</td>
      <td>SimpleStockQuoteService</td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td>SecureStockQuoteService etc.</td>
    </tr>
  </tbody>
</table>

<p>The above diagram depicts the interactions between the clients, Synapse
and the services at a higher level. The Clients are able to send SOAP/REST or
POX messages over transports such as http/s or JMS with WS-Addressing,
WS-Security or WS-Reliable messaging. They can send binary optimized content
using MTOM or SwA or binary or plain text JMS messages. After mediation
through Synapse, the requests are passed over to the sample services. The
sample clients and services are explained below.</p>

<p></p>

<h2>Using the Sample Clients</h2>

<p></p>

<p>The sample clients can be executed from the samples/axis2Client directory
through the provided ant script. Simply executing 'ant' displays the
available clients and some of the sample options used to configure them. The
sample clients available are listed below:</p>

<h3>1. Stock Quote Client</h3>

<p></p>

<p>This is a simple SOAP client that can send stock quote requests, and
receive and display the last sale price for a stock symbol. </p>
<pre>ant stockquote [-Dsymbol=IBM|MSFT|SUN|..]
  [-Dmode=quote | customquote | fullquote | placeorder | marketactivity]
  [-Daddurl=http://localhost:9000/soap/SimpleStockQuoteService]
  [-Dtrpurl=http://localhost:8080] [-Dprxurl=http://localhost:8080]
  [-Dpolicy=../../repository/conf/sample/resources/policy/policy_1.xml]</pre>

<p>The client is able to operate in the following modes, and send the
payloads listed below as SOAP messages:</p>
<ul>
  <li>quote - send a quote request for a single stock as follows. The
    response contains the last sales price for the stock which will be
    displayed
    <pre>&lt;m:getQuote xmlns:m="http://services.samples/xsd"&gt;
  &lt;m:request&gt;
    &lt;m:symbol&gt;IBM&lt;/m:symbol&gt;
  &lt;/m:request&gt;
&lt;/m:getQuote&gt;</pre>
  </li>
  <li>customquote - send a quote request in a custom format. Synapse will
    transform this custom request to the standard stock quote request format
    and send it to the service. Upon receipt of the response, it will be
    transformed again to a custom response format and returned to the client,
    which will then display the last sales price.
    <pre>&lt;m0:checkPriceRequest xmlns:m0="http://www.apache-synapse.org/test"&gt;
  &lt;m0:Code&gt;symbol&lt;/m0:Code&gt;
&lt;/m0:checkPriceRequest&gt;</pre>
  </li>
  <li>fullquote - get quote reports for the stock over a number of days (i.e.
    last 100 days of the year).
    <pre>&lt;m:getFullQuote xmlns:m="http://services.samples/xsd"&gt;
  &lt;m:request&gt;
    &lt;m:symbol&gt;IBM&lt;/m:symbol&gt;
  &lt;/m:request&gt;
&lt;/m:getFullQuote&gt;</pre>
  </li>
  <li>placeorder - place an order for stocks using a one way request
    <pre>&lt;m:placeOrder xmlns:m="http://services.samples/xsd"&gt;
  &lt;m:order&gt;
    &lt;m:price&gt;3.141593E0&lt;/m:price&gt;
    &lt;m:quantity&gt;4&lt;/m:quantity&gt;
    &lt;m:symbol&gt;IBM&lt;/m:symbol&gt;
  &lt;/m:order&gt;
&lt;/m:placeOrder&gt;</pre>
  </li>
  <li>marketactivity - get a market activity report for the day (i.e. quotes
    for multiple symbols)
    <pre>&lt;m:getMarketActivity xmlns:m="http://services.samples/xsd"&gt;
  &lt;m:request&gt;
    &lt;m:symbol&gt;IBM&lt;/m:symbol&gt;
    ...
    &lt;m:symbol&gt;MSFT&lt;/m:symbol&gt;
  &lt;/m:request&gt;
&lt;/m:getMarketActivity&gt;</pre>
  </li>
</ul>

<p>Note : See samples/axis2Client/src/samples/common/StockQuoteHandler.java
for sample responses expected by the clients.</p>

<h4>Smart Client Mode:</h4>

<p>The 'addurl' property sets the WS-Addressing EPR, and the 'trpurl' sets a
transport URL for a message. Thus by specifying both of these properties, the
client can operate in the 'smart client' mode, where the addressing EPR can
specify the ultimate receiver, while the transport URL set to Synapse will
ensure that any necessary mediation takes place before the message is
delivered to the ultimate receiver. </p>
<pre>e.g: ant stockquote -Daddurl=&lt;addressingEPR&gt; -Dtrpurl=&lt;synapse&gt;</pre>

<h4>Gateway / Dumb Client Mode:</h4>

<p>By specifying only a transport URL, the client operates in the 'dumb
client' mode, where it sends the message to Synapse and depends on the
Synapse rules for proper mediation and routing of the message to the ultimate
destination.</p>
<pre>e.g: ant stockquote -Dtrpurl=&lt;synapse&gt;</pre>

<h4>Proxy Client Mode:</h4>

<p>In this mode, the client uses the 'prxurl' as a http proxy to send the
request. Thus by setting the 'prxurl' to Synapse, the client can ensure that
the message will reach Synapse for mediation. The client can optionally set a
WS-Addressing EPR if required.</p>
<pre>e.g: ant stockquote -Dprxurl=&lt;synapse&gt; [-Daddurl=&lt;addressingEPR&gt;]</pre>

<p></p>

<p>Specifying a policy</p>

<p>By specifying a WS-Policy using the 'policy' property, QoS aspects such as
WS-Security can be enforced on the request. The policy can specify details
such as timestamps, signatures and encryption. See Apache Axis2 and Apache
Rampart documentation for more information.</p>

<p></p>

<h3>2. Generic JMS Client</h3>

<p></p>

<p>The JMS client is able to send plain text, plain binary content or POX
content by directly publishing a JMS message to the specified destination.
The JMS destination name should be specified with the 'jms_dest' property.
The 'jms_type' property can specify 'text', 'binary' or 'pox' to specify the
type of message payload. </p>

<p></p>

<p>The plain text payload for a 'text' message can be specified through the
'payload' property. For binary messages, the 'payload' property will contain
the path to the binary file. For POX messages, the 'payload' property will
hold a stock symbol name to be used within the POX request for stock order
placement request.</p>

<p>e.g: </p>
<pre>ant jmsclient -Djms_type=text -Djms_dest=dynamicQueues/JMSTextProxy -Djms_payload="24.34 100 IBM"
ant jmsclient -Djms_type=pox -Djms_dest=dynamicQueues/JMSPoxProxy -Djms_payload=MSFT
ant jmsclient -Djms_type=binary -Djms_dest=dynamicQueues/JMSFileUploadProxy
                     -Djms_payload=./../../repository/conf/sample/resources/mtom/asf-logo.gif</pre>

<p>Note: The JMS client assumes the existence of a default ActiveMQ (4.1.0 or
above) installation on the local machine.</p>

<p></p>

<h3>3. MTOM / SwA Client</h3>

<p></p>

<p>The MTOM / SwA client is able to send a binary image file as a MTOM or SwA
optimized message, and receive the same file again through the response and
save it as a temporary file. The 'opt_mode' can specify 'mtom' or 'swa'
respectively for the above mentioned optimizations. Optionally the path to a
custom file can be specified through the 'opt_file' property, and the
destination address can be changed through the 'opt_url' property if
required.</p>
<pre>e.g. ant optimizeclient -Dopt_mode=[mtom | swa]</pre>

<p></p>

<h2>Starting the Sample Services</h2>

<p></p>

<p>The sample services ship with a pre-configured Axis2 server and
demonstrates in-only and in-out SOAP/REST or POX messaging over http/s and
JMS transports, using WS-Addressing, WS-Security and WS-Reliable Messaging
and handling of binary content using MTOM and SwA.</p>

<p>The sample services can be found in the samples/axis2Server/src directory
and can be built and deployed using ant from within each service directory</p>
<pre>user@host:/tmp/synapse-1.1/samples/axis2Server/src/SimpleStockQuoteService$ ant
Buildfile: build.xml
...
build-service:
   ....
      [jar] Building jar: /tmp/synapse-1.1/samples/axis2Server/repository/services/SimpleStockQuoteService.aar

BUILD SUCCESSFUL
Total time: 3 seconds</pre>

<p></p>

<p>To start the Axis2 server, go to the samples/axis2Server directory and
execute the axis2server.sh or axis2server.bat script. This starts the Axis2
server with the http transport listener on port 9000 and https on 9002
respectively. To enable JMS transport, you will need to setup and start a JMS
provider. An ActiveMQ 4.0.1 or later JMS server on the local machine is
supported by default, and can be easily enabled by uncommenting the JMS
transport from the repository/conf/axis2.xml</p>

<p></p>

<h3>Sample services</h3>

<h4>1. SimpleStockQuoteService</h4>

<p>This service has four operations, getQuote (in-out), getFullQuote(in-out),
getMarketActivity(in-out) and placeOrder (in-only). The getQuote operation
will generate a sample stock quote for a given symbol. The getFullQuote
operation will generate a history of stock quotes for the symbol for a number
of days, and the getMarketActivity operation returns stock quotes for a list
of given symbols. The placeOrder operation will accept a one way message for
an order.</p>

<h4>2. SecureStockQuoteService </h4>

<p>This service is a clone of the SimpleStockQuoteService, but has
WS-Security enabled and an attached security policy for signing and
encryption of messages.</p>

<h4>3. MTOMSwASampleService</h4>

<p>This service has three operations uploadFileUsingMTOM(in-out),
uploadFileUsingSwA(in-out) and oneWayUploadUsingMTOM(in-only) and
demonstrates the use of MTOM and SwA. The uploadFileUsingMTOM and
uploadFileUsingSwA operations accept a binary image from the SOAP request as
MTOM and SwA, and returns this image back again as the response, while the
oneWayUploadUsingMTOM saves the request message to disk.</p>

<p></p>

<h3>Starting Sample Synapse Configurations</h3>

<p>To start Synapse with the sample default configuration, execute the
synapse.bat or synapse.sh script found in the /bin directory. This starts up
an instance of Synapse using the Synapse and Axis2 configuration files
located in the repository/conf directory. The repository/conf/samples
directory contains the sample configurations available as
synapse_sample_&lt;n&gt;.xml files. To start a specific sample configuration
of Synapse, use the '-sample &lt;n&gt;' switch as follows:</p>
<pre>synapse.bat -sample &lt;n&gt;
synapse.sh -sample &lt;n&gt;</pre>

<p></p>

<h2>Setting up the JMS Listener</h2>

<p></p>

<p>The samples used in this guide assumes the existence of a local ActiveMQ
(4.1.0 or higher) installation properly installed and started up. You also
need to copy the following client JAR files into the Synapse 'lib' folder to
support ActiveMQ. These files are found in the 'lib' directory of the
ActiveMQ installation.</p>
<ul>
  <li>activeio-core-3.0.0-incubator.jar</li>
  <li>activemq-core-4.1.0-incubator.jar</li>
  <li>geronimo-j2ee-management_1.0_spec-1.0.jar</li>
</ul>

<p>To enable the JMS transport, you need to uncomment the JMS transport
listener configuration. If you are using a JMS provider other than ActiveMQ
this configuration should be updated to reflect your environment. Once
uncommented, the default configuration should be as follows. To enable JMS
for synapse, the repository/conf/axis2.xml must be updated, while to enable
JMS support for the sample Axis2 server the
samples/axis2Server/repository/conf/axis2.xml file must be updated.</p>
<pre>    &lt;!--Uncomment this and configure as appropriate for JMS transport support, after setting up your JMS environment (e.g. ActiveMQ)--&gt;
    &lt;transportReceiver name="jms" class="org.apache.synapse.transport.jms.JMSListener"&gt;
        &lt;parameter name="myTopicConnectionFactory" locked="false"&gt;
                &lt;parameter name="java.naming.factory.initial" locked="false"&gt;org.apache.activemq.jndi.ActiveMQInitialContextFactory&lt;/parameter&gt;
                &lt;parameter name="java.naming.provider.url" locked="false"&gt;tcp://localhost:61616&lt;/parameter&gt;
                &lt;parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false"&gt;TopicConnectionFactory&lt;/parameter&gt;
        &lt;/parameter&gt;

        &lt;parameter name="myQueueConnectionFactory" locked="false"&gt;
                &lt;parameter name="java.naming.factory.initial" locked="false"&gt;org.apache.activemq.jndi.ActiveMQInitialContextFactory&lt;/parameter&gt;
                &lt;parameter name="java.naming.provider.url" locked="false"&gt;tcp://localhost:61616&lt;/parameter&gt;
                &lt;parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false"&gt;QueueConnectionFactory&lt;/parameter&gt;
        &lt;/parameter&gt;

        &lt;parameter name="default" locked="false"&gt;
                &lt;parameter name="java.naming.factory.initial" locked="false"&gt;org.apache.activemq.jndi.ActiveMQInitialContextFactory&lt;/parameter&gt;
                &lt;parameter name="java.naming.provider.url" locked="false"&gt;tcp://localhost:61616&lt;/parameter&gt;
                &lt;parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false"&gt;QueueConnectionFactory&lt;/parameter&gt;
        &lt;/parameter&gt;
    &lt;/transportReceiver&gt;</pre>

<p></p>

<h2 id="mailsender">Setting up Mail Transport Sender</h2>

<p>To enable the mail transport for samples, you need to uncomment the mail transport
sender configuration in the repository/conf/axis2.xml. Uncomment the
MailTransportSender sample configuration and make sure it points to a valid
SMTP configuration for any actual scenarios.</p>
<pre>    &lt;transportSender name="mailto" class="org.apache.synapse.transport.mail.MailTransportSender"&gt;
        &lt;parameter name="mail.smtp.host"&gt;smtp.gmail.com&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.port"&gt;587&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.starttls.enable"&gt;true&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.auth"&gt;true&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.user"&gt;synapse.demo.0&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.password"&gt;mailpassword&lt;/parameter&gt;
        &lt;parameter name="mail.smtp.from"&gt;synapse.demo.0@gmail.com&lt;/parameter&gt;
    &lt;/transportSender&gt;</pre>

<p></p>

<h2 id="script">Configuring Synapse for Script Mediator Support</h2>

<p></p>

<p>The Synapse Script Mediator is a Synapse extension, and thus all
prerequisites are not bundled by default with the Synapse distribution.
Before you use some script mediators you may need to manually add the
required jar files to the Synapse lib directory, and optionally perform other
installation tasks as may be required by the individual scripting language.
This is explained in the following sections.</p>

<h4>JavaScript Support</h4>

<p>The JavaScript/E4X support is enabled by default and comes ready-to-use
with the Synapse distribution.</p>

<h4>Ruby Support</h4>

<p>For Ruby support you need to download the 'jruby-complete.jar' from the
Maven repository for JRuby, and copy it into the 'lib' folder of Synapse .
The JRuby JAR can be downloaded from <a
href="http://repo1.maven.org/maven2/org/jruby/jruby-complete/">here</a>.</p>

<p></p>

<h2 id="derby">Setting up Derby database server</h2>

<p>You can download Apache Derby distribution from <a
href="http://db.apache.org/derby/">http://db.apache.org/derby/</a></p>
<ol>
  <li>Set up and start the Derby network server</li>
  <li>Create and open a connection to the database using the Derby client
    driver
    <p>CONNECT
    'jdbc:derby://localhost:1527/synapsedb;user=synapse;password=synapse;create=true';</p>
  </li>
  <li>Create a table using the following statement
    <p>create table company(name varchar(10), id varchar(10), price
    double);</p>
  </li>
  <li>Inserts some data using following statements
    <p>insert into company values ('IBM','c1',0.0);</p>
    <p>insert into company values ('SUN','c2',0.0);</p>
    <p>insert into company values ('MSFT','c3',0.0);</p>
  </li>
</ol>

<p>When using Derby, you need to add derby.jar, derbyclient.jar and
derbynet.jar to the classpath. This can be done by putting the above three
jars into the Synapse lib directory. For testing these samples Derby 10.3.2.1
binary distribution was used.</p>

<p>You can use any other database product instead of Derby. Then you have to
change the database connection details accordingly. Also you have to copy the
required database driver jars to the Synapse classpath.</p>

<p></p>
</body>
</html>