nmukhi      2002/12/27 14:12:09

  Modified:    java/doc samples.html
  Added:       java/samples/dslprovider README.html ServiceChecker.java
  Log:
  Added new sample: application that ties some smaller samples together
  
  Revision  Changes    Path
  1.6       +5 -0      xml-axis-wsif/java/doc/samples.html
  
  Index: samples.html
  ===================================================================
  RCS file: /home/cvs/xml-axis-wsif/java/doc/samples.html,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- samples.html      12 Dec 2002 14:41:01 -0000      1.5
  +++ samples.html      27 Dec 2002 22:12:09 -0000      1.6
  @@ -89,6 +89,11 @@
      <td>The samples/customfactory directory under your WSIF installation</td>
      <td><a href="../samples/customfactory/README.html">The Sample README</a></td>
   </tr>
  +<tr>
  +   <td>A sample application that builds on the EJB, JMS and complexsoap samples</td>
  +   <td>The samples/dslprovider directory under your WSIF installation</td>
  +   <td><a href="../samples/dslprovider/README.html">The Sample README</a></td>
  +</tr>
   </table>
   <hr width="100%">
   </body></html>
  
  
  
  1.1                  xml-axis-wsif/java/samples/dslprovider/README.html
  
  Index: README.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta name="Author" content="Nirmal Mukhi">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title>Web Services Invocation Framework: Samples</title>
  <link rel="stylesheet" href="wsif.css" type="text/css"></head>
  
    <body alink="#0000ff" bgcolor="#ffffff" leftmargin="2" topmargin="2" 
marginwidth="2" marginheight="2">
      
      <h1>
        Web Services Invocation Framework:<br>
        DSL Provider Sample Application</h1>
      <p>This is a sample application that shows how WSIF lets you write flexible 
applications through its WSDL-driven, protocol-independent APIs.</p>
      <p>The application lets users enter their names and addresses and then tells 
them whether DSL service is available in their area or not. It stores addresses once 
entered, so returning users need not reenter that information. It also verifies the 
validity of addresses.</p>
      <p>The application uses three separate pieces of software to do its job:
      <ul>
        <li>An address book service: this is capable of storing addresses and allowing 
lookup</li>
        <li>A zip code service: this is capable of looking up information pertaining 
to a particular zip code, and can be used to verify addresses</li>
        <li>An availability service : this checks if DSL service is available at a 
particular zip code</li>
      </ul>
    </p>
      <p>These three pieces of software are modeled as WSDL-described services. Once 
we do this, we can then access their functionality using the WSIF API, giving us a 
consistent view of the functionality being used, and allowing dynamic protocol 
switching and other WSIF benefits. Our application is programmed against the following 
abstract service definitions:
        <ul>
        <li>The address book service is described in the <a 
href="../ejb/AddressBook.wsdl">AddressBook.wsdl</a> file in the 
<tt>samples/ejb</tt></p> directory</li>
        <li>The zip code service is described in the <a 
href="../complexsoap/Zip2Geo.wsdl">Zip2Geo.wsdl</a> file in the 
<tt>samples/complexsoap</tt></p> directory</li>
        <li>The availability service is described in the <a 
href="../jms/ServiceAvailability.wsdl">Serviceavailability.wsdl</a> file in the 
<tt>samples/jms</tt></p> directory</li>
      </ul>
    </p>
      <p><a href="ServiceChecker.java">Here</a> is the code for our application. It 
takes as command line arguments the locations of the WSDL files for the three 
services. Note that we can provide <em>absolutely any</em> WSDL files as long as the 
abstract definitions match the ones we programed against. In particular, we can define 
new bindings, move the service endpoints - for example, to a different application 
server - change client libraries, etc. <em>without affecting the application code in 
any way</em>.</p>
      <img src="applicationview.jpg">
      <p>Above we show the application's view of the services it uses, along with a 
different view that shows what could really be behind the WSDL service.</p>
      <h2>Running the application</h2>
      <p><b>It is advisable to try running this application after going through the 
simplesoap, complexsoap, ejb and jms samples.</b></p>
      <p>The simplest way to run this application is to use the provided WSDL files. 
First, you need to make sure all your services are deployed and available.</p>
      <p>The addressbook WSDL describes an EJB binding. To deploy the address book 
service as an EJB, follow the instructions provided <a href="../ejb/README.html">in 
the EJB sample</a>. Test that your EJB works using the client provided with that 
sample.</p>
      <p>The zip code WSDL describes a SOAP binding. Fortunately this is an external, 
publicly available web service. To verify that the server is up and the service is 
running, try out one of the clients in the <a 
href="../complexsoap/README.html">complexsoap sample</a>.</p>
      <p>The availability WSDL describes a JMS binding. To deploy the availability 
service so that it is accessible via JMS, follow the instructions provided <a 
href="../jms/README.html">in the JMS sample</a>. Test that your JMS service works 
using the client provided with that sample.</p>
      <p>Once you have all the pieces deployed and you have verified that they work, 
you can then run this application. You can use the command
        <br><tt>java dslprovider.ServiceChecker samples/complexsoap/Zip2Geo.wsdl 
        <br>samples/ejb/AddressBook.wsdl samples/jms/ServiceAvailability.wsdl</tt>
      </p>
  <hr width="100%">
  </body></html>
  
  
  
  1.1                  xml-axis-wsif/java/samples/dslprovider/ServiceChecker.java
  
  Index: ServiceChecker.java
  ===================================================================
  package dslprovider;
  
  /**
   * This is a toy application that demonstrates how WSIF can be used to create 
flexible 
   * applications.
   * This ServiceChecker application allows users to enter their names and addresses
   * through a command line interface and then checks if DSL service is available in
   * the user's area. If the user has previously registered their addresses, they need 
not
   * enter them again. The application also verifies that addresses are correct.
   *
   * The application makes use of three WSDL-described services:
   * 1. Zip2Geo: this service provides information about a US zip code, such as the
   * corresponding city and state
   * 2. AddressBook: this service allows names and addresses to be stored and 
   * looked up 
   * 3. ServiceAvailability: this service checks if DSL service is available at a 
   * particular zip code
   * The locations of the WSDL documents corresponding to these services are provided 
at 
   * runtime as command line arguments.
   *
   * The key feature of this application is that since it is completely WSDL driven, 
   * we can swap the service protocols, change their location, add new protocols and
   * make them available dynamically, etc. without having to touch the application 
code 
   * here.
   *
   * @author Nirmal Mukhi ([EMAIL PROTECTED])
   */
  
  // types for address book service
  import ejb.service.addressbook.wsifservice.AddressBook;
  import ejb.service.addressbook.wsiftypes.Address;
  
  // types for Zip2Geo service
  import complexsoap.client.stub.com.cdyne.ws.LatLongReturn;
  import complexsoap.client.stub.com.cdyne.ws.Zip2GeoSoap;
  
  // types for service availability service
  import jms.client.stub.org.apache.xml.CheckAvailabilityPortType;
  
  // wsif classes
  import org.apache.wsif.WSIFException;
  import org.apache.wsif.WSIFService;
  import org.apache.wsif.WSIFServiceFactory;
  import javax.xml.namespace.QName;
  
  // java IO classes
  import java.io.LineNumberReader;
  import java.io.InputStreamReader;
  
  public class ServiceChecker {
      static AddressBook addressBook;
      static Zip2GeoSoap zip2geo;
      static CheckAvailabilityPortType serviceAvailability;
  
      public static void printError(String message) {
        System.err.println(message);
        System.exit(1);
      }
  
      public static void printUsage() {
        System.out.println("java dslprovider.ServiceChecker <zip2geo service WSDL>"+
                           "<addressbook service WSDL> <serviceAvailability service 
WSDL>");
      }
  
      private static void init(String zip2geoWSDL,
                             String addressbookWSDL,
                             String serviceAvailabilityWSDL) throws Exception {
        // create a service factory
        WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
        // initialize the address book stub
        // parse the WSDL
        WSIFService service =
            factory.getService(addressbookWSDL,null,null,
                               "http://wsifservice.addressbook/";,
                               "AddressBook");
        // create the stub
        addressBook = (AddressBook) service.getStub(AddressBook.class);
        // initialize the zip2geo stub
        // parse the WSDL
        service = factory.getService(zip2geoWSDL,null,null,"http://ws.cdyne.com";,
                                     "Zip2GeoSoap");
        // map types
        service.mapType(new QName("http://ws.cdyne.com";, "LatLongReturn"),
                        
Class.forName("complexsoap.client.stub.com.cdyne.ws.LatLongReturn"));
        // create the stub
        zip2geo = (Zip2GeoSoap) service.getStub(Zip2GeoSoap.class);
        // initialize the service availability stub
        // parse the WSDL
        service = factory.getService(serviceAvailabilityWSDL,null,null,
                                     
"http://xml.apache.org/axis/wsif/samples/jms/ServiceAvailability";,
                                     "CheckAvailabilityPortType");
        // create the stub
        serviceAvailability = 
            (CheckAvailabilityPortType) 
service.getStub(CheckAvailabilityPortType.class);
      }
  
      private static Address lookupAddress(String name) throws Exception { 
        // lookup and return the address for that name
        return addressBook.getAddressFromName(name);
      }
  
      private static Address createAndAddAddress(String name,String streetNum, String 
streetName,
                                String city, String state, String zip) throws 
Exception { 
        // create an address
        Address address = new Address();
        address.setStreetNum(new Integer(streetNum).intValue());
        address.setStreetName(streetName);
        address.setCity(city);
        address.setState(state);
        address.setZip(new Integer(zip).intValue());
        address.setPhoneNumber(null);
        // add an entry to the addressbook
        addressBook.addEntry(name,address);
        return address;
      }
  
      private static void verifyAddress(Address address) throws Exception { 
        // extract the zip code from the address
        String zipCode = ""+address.getZip();
        // look up information for that zip
        LatLongReturn zipInfo = zip2geo.GetLatLong(zipCode,"");
        if (!zipInfo.getCity().equals(address.getCity())) {
            printError("Zip "+zipCode+" is in city "+zipInfo.getCity()+
                       ", not city "+address.getCity()+" as you specified");
        }
        if (!zipInfo.getStateAbbrev().equals(address.getState())) {
            printError("Zip "+zipCode+" is in state "+zipInfo.getStateAbbrev()+
                       ", not state "+address.getState()+" as you specified");
        }
      }   
  
      private static String serviceIsAvailable(int zipCode) throws Exception { 
        return serviceAvailability.checkAvailability(""+zipCode);
      }
  
      private static void loopInput() {
        try {
            System.out.println("************************");
            System.out.println("WELCOME TO FAST DSL INC.");
            System.out.println("************************");
            System.out.println("\n\nInterested in DSL service? Enter your address "+
                               "in the form below and we will check whether we have "+
                               "service available in your area.");
            System.out.println();
            System.out.println("If you have previously expressed interest, just enter 
"+
                               "your name (leave other fields blank) and we will look 
"+
                               "up the rest of the information "+
                               "in our records");
            LineNumberReader reader = new LineNumberReader(new 
InputStreamReader(System.in));
            System.out.print("Name: ");
            String name = reader.readLine();
            System.out.print("Street Number: ");
            String streetNum = reader.readLine();
            System.out.print("Street Name: ");
            String streetName = reader.readLine();
            System.out.print("City: ");
            String city = reader.readLine();
            System.out.print("State: ");
            String state = reader.readLine();
            System.out.print("Zip: ");
            String zip = reader.readLine();
            System.out.println();
            System.out.println();
            Address address = null;
            // if street is blank, look for name in addressbook service
            // otherwise assume this is a new user and add information to addressbook
            if (streetName==null || streetName.equals("")) {
                System.out.println("Looking up address...");
                address = lookupAddress(name);
                if (address==null) {
                    // if address wasn't found, we have a problem
                    printError("Address for "+name+" wasn't found");
                }
            } else {
                // create address from provided information and add to address book
                System.out.println("Adding address to records...");
                address = 
createAndAddAddress(name,streetNum,streetName,city,state,zip);
            }
            // verify that address is correct
            System.out.println();
            System.out.println();
            System.out.println("Verifying validity of address...");
            verifyAddress(address);
            System.out.println();
            System.out.println();
            // check if we offer DSL service in that zip code
            System.out.println("Customer: "+name);
            System.out.println("Address: "+
                               address.getStreetNum()
                               + " "
                               + address.getStreetName()
                               + ", "
                               + address.getCity()
                               + " "
                               + address.getState()
                               + " "
                               + address.getZip());
            System.out.println("Checking service availability...");
            if (serviceIsAvailable(address.getZip()).equals("true")) {
                System.out.println("Yes, we offer service in your area,"+
                                   "please call 800 555 FST-DSL to order");
            } else {
                System.out.println("No, we do not offer service in your area");
            }
            System.out.println();
            System.out.println();
            System.out.println("Enter 'q' to quit, any other key continue...");
            String choice = reader.readLine();
            if (choice.equals("q"))
                System.exit(0);
        } catch (Exception e) {
            System.out.println("ServiceChecker application got exception "+e);
            System.out.println("Details:");
            e.printStackTrace();
        }
      } 
  
      public static void main(String [] args) {
        try {
            // we must have three args
            // args[0] is the location of the Zip2Geo service WSDL
            // args[1] is the location of the AddressBook service WSDL
            // args[2] is the location of the ServiceAvailability service WSDL
            if (args.length!=3) {
                printUsage();
                System.exit(1);
            }
            init(args[0],args[1],args[2]);
        } catch (Exception e) {
            System.out.println("ServiceChecker application got exception "+e);
            System.out.println("Details:");
            e.printStackTrace();
        }
        while(true)
            loopInput();
      }
  }
  
  
  


Reply via email to