hi all, I added the following features to the Axis2 rmi.
1. client proxy support instead of code generation. with this feature users can invoke a axi2 rmi service as just calling to a java class. e.g. if there is a service interface like this public interface Service1Interface { public String method1(String param1); } The service can be invoked from the client like this.(please see the sample for more information) try { Service1Interface proxy = (Service1Interface) RMIClientProxy.createProxy(Service1Interface.class, "http://localhost:8085/axis2/services/Service1"); String result = proxy.method1("Hellow world"); } catch (AxisFault axisFault) { axisFault.printStackTrace(); } So it is just like writing java code once the interface proxy is created. 2. Map, HashMap, Hashtable support. with this support people can invoke services which has hashMaps and tables. eg. public Map method(Map param1); 3. support to use a custom simple Type Handler. simple data types are handled by SimpleTypeHandler in Axis2-rmi. So if a user needs to change the way it handles the simple types, a customclass can be used. e.g Lets say some one needs to change the way Axis2 rmi handles the date. Then he can write a new class by extending the existing one and declare it in config.xml public class CustomSimpleTypeHandler extends SimpleTypeHandler { public String convertToString(Date value) { System.out.println("Converting date ==> " + value); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-ddZ"); return simpleDateFormat.format(value); } } then declare this in the config.xml <config xmlns="http://ws.apache.org/axis2/rmi"> <extensionClasses> </extensionClasses> <packageToNamespaceMapings> </packageToNamespaceMapings> <services> </services> <simpleDataHandlerClass> sample.rmi.server.databind.CustomSimpleTypeHandler</simpleDataHandlerClass> </config> On 8/14/07, Amila Suriarachchi <[EMAIL PROTECTED]> wrote: > > hi, > Thanks for replying, Please see my comments. > > On 8/13/07, Deepal jayasinghe <[EMAIL PROTECTED]> wrote: > > > > Hi Amila, > > Please see my comment below, > > > > > > hi all, > > > > > > The main objective of this module is to let users to publish their > > > existing Java classes as web services and access them with out warring > > > about Axis2 and web services. > > > > > We already have this feature , with our POJO approach one can easily > > convert java class into a Web service. Not only that in a single line > > (s)he can deploy and start up Axis2. > > > > I think I have explain this in the Architecture and performance part of > my earlier mail. > 1. POJO is written on top of OM. So always we have to create an OM > Structure for request and response. This is a performance over head as I > saw. But Axis2-rmi directly creates the object structure from the xml stream > reader and writes it back to xmlstreamwritter. (But anyway this is a > theoratical argument and we have to do a proper performance test and see) > > 2. Lets say we have service class method like this, > Object getObject(Object param1){ > return param1; > } > > the idea here is user has to invoke this with any type(using the RMIClient > or ADB client) e.g string,Integer,Double or their custom class. > > if they use a custom class the only thing we have to do is to declare that > is as an extension class in config.xml. > > How to support this with POJO? > > List getObject(List param1){ > return param1; > } > > user wants to invoke this method with a list of > String, integer, and a custom type. and returns the list. How can we do > this with POJO? > > the idea of Axis2-rmi is to enhance the java support to users. So that > they can do any thing with it. > > > > > > > This module let users to publish web services and access them some > > > what similar way as Java RMI does. > > > > > > Axis2-rmi uses a custom deployer and a custom archive file format to > > > deploy java classes. The archive file which has the .rsa (rmi service > > > archive) extension has the following structure. > > > > > Why do we need another file extension , can't we use .aar instead of > > .rsa. Not only that rsa is a encryption mechanism as well :) > > > Two archive files have different formats. So I would prefer a different > extension. > But I agree with you that if .rsa is already in use we have to use > another. > > > > > > META-INF > > > > > > config.xml > > > > > > <java classes> > > > > > > For the moment there is a config.xml file under the META-INF folder > > > and java classes at the top folder. > > > > > Same thing , why cant we use services.xml ? > > > I come up with a new file since I want to add many parameters (as only > required by Axis2-rmi with future enhansments) to this config file with out > doing any changes to the Axis2-kernal. > > Axis2 -rmi is a pure plug to Axis2(it has not touch a single line of code > in kernal). (My thank should go to deepal to develop custom deployer > support). So I would like to keep that as it is since this enable it to add > any new feature without changing the line of code in kernal. > > The other thing I see with the service.xml it contains some parameters > like MessageReceiver and Mep. > These are not clear to a person who no experience with the Axis and web > services. So I wanted hide these terms and give an much sensible file which > only has understandable parameters with their requriements. > > > That has exactly the same structure . > > > > > > Later this can be improved to put jar files to a lib folder as well. > > > The config.xml file is used to specify the service classes and other > > > configuration details to the deployer. It has the following structure. > > > > > > <config xmlns=" http://ws.apache.org/axis2/rmi"> > > > > > > <extensionClasses> > > > > > > <extensionClass>sample.rmi.server.dto.ChildClass</extensionClass> > > > > > > </extensionClasses> > > > > > > <packageToNamespaceMapings> > > > > > > <packageToNamespaceMap> > > > > > > <namespace>http://sample/service</namespace> > > > > > > <packageName> sample.rmi.server</packageName> > > > > > > </packageToNamespaceMap> > > > > > > </packageToNamespaceMapings> > > > > > > <services> > > > > > > <service> > > > > > > <serviceClass> sample.rmi.server.Service1</serviceClass> > > > > > > </service> > > > > > > </services> > > > > > > </config> > > > > > > As you can see config.xml is used to specify any configuration details > > > > > like extention classes, package to namespace mappings and services. > > > > > > Now lets see a step by step example to understand how to use Axis2-rmi > > > to deploy a java service and access them from the client. > > > > > > Step 1 deploy the service > > > > > > In java RMI the first step in writing a distributed system is to write > > > the service and register it. Similarly here also we have to first > > > create the service and deploy it using the above file format. > > > > > > For a example if we want to deploy the following java service. > > > > > > package sample.rmi.server; > > > > > > public class Service1 { > > > > > > public Object method1(Object param1){ > > > > > > return param1; > > > > > > } > > > > > > } > > > > > > Here the both input and output parameters are object type. The idea > > > here is to publish this web service and invoke it by sending an input > > > parameter actually in TestClass1 type. > > > > > > package sample.rmi.server; > > > > > > public class TestClass1 { > > > > > > private String param1; > > > > > > private String parma2; > > > > > > > > > public String getParam1() { > > > > > > return param1; > > > > > > } > > > > > > public void setParam1(String param1) { > > > > > > this.param1 = param1; > > > > > > } > > > > > > public String getParma2() { > > > > > > return parma2; > > > > > > } > > > > > > public void setParma2(String parma2) { > > > > > > this.parma2 = parma2; > > > > > > } > > > > > > } > > > > > > > > > To deploy this service one can use the following config.xml. This is > > > self explainable.( please change any as necessary). To find a correct > > > working sample please see the rmi sample under samples folder. > > > > > > > > > <config xmlns=" http://ws.apache.org/axis2/rmi"> > > > > > > <extensionClasses> > > > > > > <extensionClass>sample.rmi.server .TestClass1</extensionClass> > > > > > > </extensionClasses> > > > > > > <packageToNamespaceMapings> > > > > > > <packageToNamespaceMap> > > > > > > <namespace>http://sample/service</namespace> > > > > > > <packageName> sample.rmi.server</packageName> > > > > > > </packageToNamespaceMap> > > > > > > </packageToNamespaceMapings> > > > > > > <services> > > > > > > <service> > > > > > > <serviceClass> sample.rmi.server.Service1</serviceClass> > > > > > > </service> > > > > > > </services> > > > > > > </config> > > > > > Amila , sometime you might not aware that services.xml is also has the > > ability to map package name to namespace , so let's use that. > > > Please see the above comment. > > > > > > > > > The .rsa file should look like this > > > > > > META-INF > > > > > > config.xml > > > > > > sample.rmi.server.Service1.class > > > > > > sample.rmi.server .TestClass1.class > > > > > > > > > There is a Custom deployer declaration in the Axis2.xml file for this. > > > > > > <deployer extension=".rsa" directory="rmiservices" > > > class="org.apache.axis2.rmi.deploy.RMIServiceDeployer "/> > > > > > > > > > So you have to put the above created archive file to rmiservices > > > folder under repository. (if there is no folder please create one.) > > > Then the Axis2 server can be started as usual and This service wsdl > > > can be seen. > > > > > > > > > Step 2 access the client. > > > > > > In Java RMI we create an Stub file to access the service. Here also it > > > can be given a Stub generation tool to generate the stub for the > > > service interface. But for the moment this feature is not there and > > > RMIClient can be used directly access the service. > > > > > > > > > public class TestService1 { > > > > > > > > > private Configurator configurator; > > > > > > > > > public TestService1() { > > > > > > > > > this.configurator = new Configurator(); > > > > > > this.configurator.addPackageToNamespaceMaping("sample.rmi.server", > > > " http://sample/service"); > > > > > > this.configurator.addExtension(TestClass1 .class); > > > > > > } > > > > > > > > > public void testMethod13() { > > > > > > > > > try { > > > > > > RMIClient rmiClient = new RMIClient( Service1.class, this.configurator > > , > > > "http://localhost:8080/axis2/services/Service1"); > > > > > > List inputObjects = new ArrayList(); > > > > > > TestClass1 testClass1 = new TestClass1(); > > > > > > testClass1.setParam1("test string"); > > > > > > testClass1.setParam2("test string"); > > > > > > inputObjects.add(testClass1); > > > > > > TestClass1 result = (TestClass1) rmiClient.invokeMethod("method1", > > > inputObjects); > > > > > > System.out.println("Param 1 ==>" + result.getParam1()); > > > > > > System.out.println ("Param 2 ==>" + result.getParam2()); > > > > > > } catch (Exception e) { > > > > > > e.printStackTrace(); > > > > > > } > > > > > > } > > > > > > > > oh , this is exactly what RPCServiceClient does , please have a look at > > that. > > > this is the method signature it has > public Object[] invokeBlocking(QName opName, Object [] args, Class [] > returnTypes) > throws AxisFault { > > 1. here you have to give the return type before invoking. this is not > always possible. > For a service I have given above > Object getObject(Object param){ > return new TestClass(); > } > > Service can return any thing. So we don't kown the return type before > invoking. > in RMIClient it will return the correct Object. > > 2. this method throws an AxisFault. So How it supposed to handle > exceptions. > e.g. > Object getObject(Object param1) throws Exception1{ > throw new Exception1(): > } > > will rpcClent throws Exception1? > Actually I mean this feature by saying exception handling. > > > > > > > > > This client can be run putting all the jars under lib directory to > > > class path. > > > > > > This way people can invoke their existing java classes using Soap > > > protocol in a similar way with Java RMI. An advanced Axis2 user may > > > use the following way to deploy a java class service and start the > > > simple http server . > > > > > > ConfigurationContext confContext = > > > > > > ConfigurationContextFactory.createConfigurationContextFromFileSystem ( > > > > > > AXIS2_REPOSITORY_LOCATION, AXIS2_CONFIG_FILE); > > > > > > // add the service > > > > > > // if you want to specify additional configuration details, the > > > constructor with > > > > > > // the configurater as an argumet can be used. > > > > > > ClassDeployer classDeployer = new ClassDeployer(confContext); > > > > > > classDeployer.deployClass(Service1.class); > > > > > > > > > SimpleHTTPServer simpleHttpServer = new SimpleHTTPServer(confContext, > > > 5555); > > > > > > simpleHttpServer.start(); > > > > > > > > > Features in the Current implementation (Please see the rmi sample > > > under sample folder) > > > > > > 1. > > > > > > POJO support (simple beans, arrays, composite beans, null value > > > handling) > > > > > > 2. > > > > > > Extensions and polymorphisem. > > > > > > 3. > > > > > > Fault handling > > > > > > 4. > > > > > > Collection class support (List, ArrayList, Set , HashSet) > > > > > > 5. > > > > > > Package to namespace mapping > > > > > our services.xml and POJO has support for all the above. > > > please see this mailing thread. > http://marc.info/?l=axis-user&m=118667693526336&w=2 > > > > > > > 1. > > > > > > > > > > > > Features plaing to implement (feel free to add to this list) > > > > > > 1. > > > > > > Map support (Map , HashMap) > > > > > > 2. > > > > > > MTOM support. (DataHandler class support) > > > > > > 3. > > > > > > Dom element support > > > > > > 4. > > > > > > Configure nillable and minOccurs attributes through config.xml > > > > > > 5. > > > > > > Provide a codegen tool to generate the stub. > > > > > > 6. > > > > > > Qname support. > > > > > our POJO support all the above except DOM element, and which I strongly > > believe something we do not need. > > > Please see this mail thread. > http://marc.info/?l=axis-user&m=118654396508555&w=2 > > > > > > 1. > > > > > > > > > > > > Architecture and Performance. > > > > > > Axis2 rmi keeps a metadata model to keep java classes and their xml > > > mapping details. This meta data model is used to Generate the wsdl, to > > > > > marshall the java object structure and to unmarshall java object > > > structure. Hence this meta data model has provide the following > > > advantages. > > > > > > 1. > > > > > > directly marshal(serialize) and unmarshal(parse) the object > > > structure to the xml stream with out using and intermediate xml > > > object structure. > > > > > > 2. > > > > > > Minimize the performance over head with java reflection since it > > > keeps the relavent java method in metadata structure. > > > > > > 3. > > > > > > Enable usage of extensions and polymorphism, which requires the > > > inheritance relationships at the serialization and > > > deserialization time. > > > > > > > > > > Thanks > > Deepal > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > -- > Amila Suriarachchi, > WSO2 Inc. -- Amila Suriarachchi, WSO2 Inc.