

AXIS
	- * for DII ("Dynamic Invocation Interface") - see:  http://ws.apache.org/axis/java/apiDocs/org/apache/axis/client/Service.html 
		see locator info here:  http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL
		- logic:
			- (a) look for interface that extends:  org.apache.axis.client.Service
			- (b) find implementer(s) of interfaces found in (a)
			- (c) find methods of classes found in (b) that implement methods of interfaces found in (a) that:
					1) take no args
					2) return objects that have:  java.rmi.Remote  in their hierarchy (most likely, directly extend)
			- (d) the methods defined by the interfaces returned by the methods found in step (c) are the methods that the user can invoke
					(note:  no need to worry about async methods)
			
	- to directly use the "proxy" class generated by the web services team, do the following:
		- logic:
			either:
				- (a) look for interface that extends:  org.apache.axis.client.Service
				- (b) find methods that return a type that has in its hierarchy:  java.rmi.Remote (most likely, directly extends)
				- (c) find class(es) that:
						1)  implement interface(s) returned by methods found in (b)
						2)  do not extend:  org.apache.axis.client.Stub
			or:
				- (a) find concrete classes that:
						1)  have in their hierarchy:  java.rmi.Remote, but do not directly implement it.
						2)  do not extend from org.apache.axis.client.Stub
			


AXIS2
	- stub:
		gather:
			(a) find class(es) that extend:  org.apache.axis2.client.Stub   (note:  org.apache.axis2.client.Stub extends Object)
			(b) gather methods from class(es) found in (a) that:
					1) are public
					2) are not constructors
					3) throw:  java.rmi.RemoteException
					4) return type not 'void'  (note:  this is in an attempt to exclude async. methods)
					5) is not static
					6) is not abstract
				note:  by default, there is no interface generated for the service to implement, so can't use that
		- proxy:
			- there is no proxy class being generated (intentional?)
			


JaxRPC
	- ServiceRef (WebSphere)
		- details:  currently, this is the only jax-rpc style that we support (other than axis)
			- gather: 
				(a) discover ServiceRef elements from the deployment descriptor (webserviceclient.xml dependent)
				(b) collect classes with names ending with "Proxy"
				(c) match the "proxy" classes to the service refs' end point interfaces
			- notes:  is there a reason to collect based on ServiceRef elements in the deployment descriptor?  Given that we're not doing code gen
							base on lookup (we're just newing up the proxy), wouldn't it be better to(asssuming we stick with "Proxy" discovery):
								- (a) gather concrete classes that extend "javax.xml.rpc.Service"
								- (b) gather methods from classes found in (a) that throw:  "javax.xml.rpc.ServiceException"
								- (c) gather return types (expected:  interface)  from methods found in (b) (insure they have java.rmi.Remote in hierarchy)
								- (d) gather "proxy" classes that implement interfaces gathered in (c)
								- (e) associate proxy classes with the "remote" interface they implement
		
		- code gen:
			- three ways to access jax-rpc client:  
				(1) a DII (Dynamic Invocation Interface), 
				(2) a dynamic service proxy, or 
				(3) a stub.  
			Currently, we new up the proxy.  Shouldn't we do something like this (per:  http://www.javaworld.com/javaworld/jw-06-2003/jw-0620-webservices.html?page=4):
				(a) 	InitialContext ctx = new InitialContext();
						Service myService = (Service)ctx.lookup("java:comp/env/services/MyWebService");
			or better:
				(b)	InitialContext ctx = new InitialContext();
						MyWebService myService = (MyWebService)ctx.lookup("java:/comp/env/services/MyWebService");
			note:  couldn't get the "InitialContext" way to work ... will investigate in future.
		
	- javax.xml.rpc.Service


JaxWS
	- annotation style
		- dynamic:
			-gather:
				- (a)  gather classes with:  @WebServiceClient  annotation
				- (b)  from class(es) return by (a), gather methods with:  @WebEndpoint  annotation
				- (c)  gather return types from methods gathered in (b)   (expected:  interfaces)  (note: is the name of the WebEndpoint always the return type? A: no!)
				- (d)  gather methods from types returned by (c) with:  @WebMethod  annotation, where (to filter out async methods):
							1) method name does not end with "Async"   (note:  just a naming convention)
							2) the method has no parameters ( @WebParam) of type:  javax.xml.ws.AsyncHandler<T>
							3) the method return type is not of type:  java.util.concurrent.Future<V>
					      these are the methods of the service
			- codegen (invocation):
				(1) user would need to:
						(1a) select a "WebServiceClient" class from the set gathered in (a)
						(1b) select a "WebEndpoint" method from the class
						(1c) select a method from the interface returned by (1b)
				(2) new up the service selected in (1a)
				(3) on the service object created in (2), call the method selected in (1b)
				(4) on the object returned by (3), call the method selected in (1c)  (passing in params)
								
		- proxy:
			- gather:
				- (a) thru (d):  do steps (a) - (d) above
				- (e)  collect classes with names ending with "Proxy"
						 note:  these proxy classes (unlike JAX-RPC) won't be implementing the interface we're interested in, making things more difficult
				- (f)  given the note in (e), match the "proxy" classes to the interfaces by checking for the existing of methods with the exact signature as those
						in our interface (it must implement all the methods).  (note:  there can be more than one proxy for a given interface)
						note:  as a sanity check, if desired, could get the .java file for the proxy class and check for the existence of the class name for the associated
						WebServiceClient
	
	- no annotations ... can't get this to work.  deferring thought to R5
		(a) find class(es) that extend javax.xml.ws.Service
		(b) get ports from class returned by (a) 
		(c) get methods from service class that have a return type the same as the "ports"  <this is the part that doesn't work.  the "ports" returned by
				getPorts() are of type QName.
		
			
