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. > > 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 :) > > 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 ?
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. > > > 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 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. > > 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. > > 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]