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(); } }