Java Client

You should have deployed instantsoap-ws-echotest.war to Tomcat as described in the section Deploying the Echotest WAR . If you have worked through Using the JSP Management Interface then you will also have invoked exposed applications through the web interface.

In this section, we will develop a Java command-line application that accesses the available applications, build it using Maven and run it to invoke the application.

Before you start this section, you should ensure that you have a working deployment of instantsoap-ws-echotest.war as described in Deploying the Echotest WAR . You must also have Maven 2 installed and configured on your system, as described in requirements .

Firstly, we will set up a maven project with the source code for a client and a pom.xml file to tell maven how to build it.

  1. Create a new directory called echo-client and change directory into it.
  2. Create a pom.xml file in this directory containing the following text.
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>uk.ac.ncl.cs.instantsoap.examples</groupId>
      <artifactId>gettingStartedCommandLineClient</artifactId>
      <packaging>jar</packaging>
      <name>Test Client for instantsoap</name>
      <version>1.0</version>
    
      <dependencies>
        <dependency>
          <groupId>uk.ac.ncl.cs.instantsoap</groupId>
          <artifactId>instantsoap-api</artifactId>
          <version>1.0</version>
        </dependency>
        <!-- CXF -->
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
          <version>2.1</version>
        </dependency>
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
          <version>2.1</version>
        </dependency>
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http-jetty</artifactId>
          <version>2.1</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.5</source>
              <target>1.5</target>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <configuration>
              <mainClass>Client</mainClass>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>java</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
              <descriptors>
                <descriptor>src/assemble/src.xml</descriptor>
              </descriptors>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
      <repositories>
        <repository>
          <id>fluxion</id>
          <name>Fluxion repository</name>
          <url>http://metagenome.ncl.ac.uk/fluxions/repo</url>
        </repository>
        <repository>
          <id>apache-snapshots</id>
          <name>Apache SNAPSHOT Repository</name>
          <url>http://people.apache.org/repo/m2-snapshot-repository/</url>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>apache-incubating</id>
          <name>Apache Incubating Repository</name>
          <url>http://people.apache.org/repo/m2-incubating-repository/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>fluxion</id>
          <name>Fluxion repository</name>
          <url>http://metagenome.ncl.ac.uk/fluxions/repo</url>
        </pluginRepository>
      </pluginRepositories>
    
      <distributionManagement>
        <repository>
          <id>fluxions</id>
          <name>Fluxion repository</name>
          <url>scp://metagenome.ncl.ac.uk/var/www/fluxions/repo/</url>
        </repository>
        <snapshotRepository>
          <id>fluxions-snapshot</id>
          <name>Fluxion snapshot repository</name>
          <url>scp://metagenome.ncl.ac.uk/var/www/fluxions/repo-snapshot/</url>
        </snapshotRepository>
      </distributionManagement>
    </project>
    
  3. Now, create a directory under echo-client called src/main/java and copy the following text into a file in that directory called Client.java.
    import org.springframework.context.support.*;
    import uk.ac.ncl.cs.instantsoap.wsapi.*;
    import static uk.ac.ncl.cs.instantsoap.wsapi.Wsapi.*;
    
    import java.util.*;
    
    public class Client
    {
      public static void main(String[] args)
              throws Throwable
      {
        ClassPathXmlApplicationContext context
                = new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});
    
        WebServiceDispatcher dispatcher = (WebServiceDispatcher) context.getBean("client");
    
        JobSpecification js = jobSpecification(
                "stringEcho",
                pair("messageIn", "Hi Mum!"));
    
        Map<String, String> results = invoke(dispatcher, js);
        System.out.println("The message was: " + results.get("messageOut"));
      }
    }
    
  4. Now, create a directory under echo-client called src/main/resources and copy the following text into a file in that directory called client-beans.xml.
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxws="http://cxf.apache.org/jaxws"
           xsi:schemaLocation="
              http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
              http://cxf.apache.org/jaxws
              http://cxf.apache.org/schema/jaxws.xsd">
    
      <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property
                name="serviceClass"
                value="uk.ac.ncl.cs.instantsoap.wsapi.WebServiceDispatcher"/>
        <property
                name="address"
                value="http://localhost:8080/instantsoap-ws-echotest-1.0/services/instantsoap/applications"/>
      </bean>
    
      <bean id="client" class="uk.ac.ncl.cs.instantsoap.wsapi.WebServiceDispatcher"
            factory-bean="clientFactory" factory-method="create"/>
      
    </beans>
    
  5. Lastly, build the project by running these commands from echo-client.
    mvn install exec:java

    If this has gone as expected, maven should build the project and run the client. In amongst the logging information (lines starting with INFO:) there should be the output

    The message was: Hi Mum!

    If instead there was some error, try running maven with -X to get it to display verbose information including stack-traces.

    mvn -X install exec:java

    Also, ensure that you have a running instantsoap installation, and that the client-beans.xml file is pointing to the right URL for it.

You can obtain the compete source for this example in tar.gz or zip formats.