/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

CXF WS-Addressing Example
=========================

Purpose
-------
Use CXF to create a web service enabled for WS-Addressing and
expose it through the OSGi HTTP Service.


Explanation
-----------
This example is based on the WS-Addressing sample in Apache CXF
(http://cxf.apache.org/). There is a more complete explanation
of WS-Addressing in that sample's README.

The WS-Addressing functionality is implemented as interceptors.
It is configured in the beans.xml file, which is located in the
src/main/resources/META-INF/spring directory of this example.
The configuration can be explained as follows:

1. The following entry adds the addressing interceptors (org.apache.
   cxf.ws.addressing.MAPAggregator and org.apache.cxf.ws.addressing.
   soap.MAPCodec) to the inbound and outbound interceptor chains.
   The interceptors add the appropriate WS-Addressing headers to the
   SOAP messages and remove them at the service end.

  <bean id="mapAggregator" class="org.apache.cxf.ws.addressing.MAPAggregator"/>
  <bean id="mapCodec" class="org.apache.cxf.ws.addressing.soap.MAPCodec"/>

    <!--bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
        <property name="inInterceptors">
            <list>
                <ref bean="mapAggregator"/>
                <ref bean="mapCodec"/>
            </list>
        </property>
        <property name="inFaultInterceptors">
            <list>
                <ref bean="mapAggregator"/>
                <ref bean="mapCodec"/>
                <ref bean="logInbound"/>
            </list>
        </property>
        <property name="outInterceptors">
            <list>
                <ref bean="mapAggregator"/>
                <ref bean="mapCodec"/>
            </list>
        </property>
        <property name="outFaultInterceptors">
            <list>
                <ref bean="mapAggregator"/>
                <ref bean="mapCodec"/>
            </list>
        </property>
    </bean--> 

2. The following entry enables WS-Addressing for all services
   on the bus:

   <cxf:bus>
       <cxf:features>
           <wsa:addressing/>
       </cxf:features>
   </cxf:bus>

In addition, the service WSDL, hello_world_addr.wsdl, includes
WS-Addressing configuration as shown below:

    <wsdl:service ... >
        <wsdl:port ...>
            <soap:address ... />
            <wswa:UsingAddressing xmlns:wswa="http://www.w3.org/2005/02/addressing/wsdl"/>
        </wsdl:port>
    </wsdl:service>

The WSDL file is located in the src/main/resources/wsdl
directory of this example.

The various clients send the request.xml file, located in src/main/
resources/org/apache/servicemix/examples/cxf/wsaddressing. It
contains SOAP request with some WS-Addressing headers set in it.


Prerequisites for Running the Example
-------------------------------------
1. You must have the following installed on your machine:

   - JDK 1.6 or higher
   
   - Maven 2.2.1 or higher
   
  For more information, see the README in the top-level examples
  directory.


2. Start ServiceMix by running the following command:

  <servicemix_home>/bin/servicemix          (on UNIX)
  <servicemix_home>\bin\servicemix          (on Windows)


Running the Example
-------------------
You can run the example in two ways:

- A. Using a Prebuilt Deployment Bundle: Quick and Easy
This option is useful if you want to see the example up and
running as quickly as possible.

- B. Building the Example Bundle Yourself
This option is useful if you want to change the example in any
way. It tells you how to build and deploy the example. This
option might be slower than option A because, if you do not
already have the required bundles in your local Maven
repository, Maven will have to download the bundles it needs.

A. Using a Prebuilt Deployment Bundle: Quick and Easy
-----------------------------------------------------
To install and run a prebuilt version of this example, enter
the following command in the ServiceMix console:

  features:install examples-cxf-ws-addressing
  
This command makes use of the ServiceMix features facility. For
more information about the features facility, see the README.txt
file in the examples parent directory.

To view the service WSDL, open your browser and go to the following
URL:

  http://localhost:8181/cxf/SoapContext/SoapPort?wsdl

Note, if you use Safari, right click the window and select
'Show Source'.

Running a Client
----------------
To run the web client:

1. Open the client.html, which is located in the same directory as
   this README file, in your favorite browser.

2. Click the Send button to send a request.

   Once the request has been successfully sent, you should receive
   a SOAP message similar to the following as a response. It should
   appear in the right-hand panel of the web page:
   
   STATUS: 200
   <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Header>
       <Action xmlns="http://www.w3.org/2005/08/addressing">
       http://apache.org/hello_world_soap_http/Greeter/sayHiResponse
       </Action>
       <MessageID xmlns="http://www.w3.org/2005/08/addressing">
       urn:uuid:4352861b-3451-4ae8-b97f-11f7e2535807</MessageID>
       <To xmlns="http://www.w3.org/2005/08/addressing">
       http://www.w3.org/2005/08/addressing/anonymous</To>
       <RelatesTo xmlns="http://www.w3.org/2005/08/addressing">
       urn:uuid:10fb2ee6-43db-4d88-a3e5-6316f1763669</RelatesTo>
     </soap:Header>
     <soap:Body>
       <sayHiResponse xmlns="http://apache.org/hello_world_soap_http/types">
       <responseType>Bonjour</responseType>
       </sayHiResponse>
     </soap:Body>
   </soap:Envelope>


To run the java code client:

1. Change to the <servicemix_home>/examples/cxf/cxf-ws-addressing
   directory.

2. Run the following command:

     mvn compile exec:java

   It makes an invocation with WS-Addressing headers and displays,
   in the ServiceMix console, a response similar to that shown 
   in the web client (see above).

Changing /cxf servlet alias
---------------------------
By default CXF Servlet is assigned a '/cxf' alias. You can
change it in a couple of ways:

a. Add org.apache.cxf.osgi.cfg to the /etc directory and
   set the 'org.apache.cxf.servlet.context' property, for example:
   
     org.apache.cxf.servlet.context=/custom

b. Use shell config commands, for example:

     config:edit org.apache.cxf.osgi   
     config:propset org.apache.cxf.servlet.context /super
     config:update


B. Building the Example Bundle Yourself
---------------------------------------
To install and run the example where you build the example bundle
yourself, complete the following steps:

1. If you have already run the example using the prebuilt version as
   described above, you must first uninstall the
   examples-cxf-ws-addressing feature by entering the following
   command in the ServiceMix console:

     features:uninstall examples-cxf-ws-addressing

   
2. Build the example by opening a command prompt, changing directory
   to examples/cxf-ws-addressing (this example) and entering the
   following Maven command:

     mvn install
   
   If all of the required OSGi bundles are available in your local
   Maven repository, the example will build very quickly. Otherwise
   it may take some time for Maven to download everything it needs.
   
   The mvn install command builds the example deployment bundle and
   copies it to your local Maven repository and to the target directory
   of this example.
     
3. Install the example by entering the following command in
   the ServiceMix console:
   
     features:install examples-cxf-ws-addressing
       
   It makes use of the ServiceMix features facility. For more
   information about the features facility, see the README.txt file
   in the examples parent directory.

To view the service WSDL, open your browser and go to the following
URL:

    http://localhost:8181/cxf/SoapContext/SoapPort?wsdl

Note, if you use Safari, right click the window and select
'Show Source'.

You can try running a client against your service by following the
instructions in the "Running a Client" section above.


Stopping and Uninstalling the Example
-------------------------------------
To stop the example, you must first know the bundle ID that ServiceMix
has assigned to it. To get the bundle ID, enter the following command
in the ServiceMix console (Note, the text you are typing will
intermingle with the output being logged. This is nothing to worry
about.):

  osgi:list

At the end of the listing, you should see an entry similar to the
following:

  [171] [Active     ] [Started] [  60] Apache ServiceMix Example :: CXF WS-ADDRESSING OSGI (4.2.0)

In this case, the bundle ID is 171.

To stop the example, enter the following command in the ServiceMix
console:

  osgi:stop <bundle_id>

For example:

  osgi:stop 171

To uninstall the example, enter one of the following commands in
the ServiceMix console:

  features:uninstall examples-cxf-ws-addressing
 
or
 
  osgi:uninstall <bundle_id>
  

Viewing the Log Entries
-----------------------
You can view the entries in the log file in the data/log
directory of your ServiceMix installation, or by typing
the following command in the ServiceMix console:

  log:display
