On 8/17/07, Rajith Attapattu <[EMAIL PROTECTED]> wrote:
>
> Amila,
>
> Pardon me if I have got the facts wrong, but as Deepal pointed out, this
> seems like a spin off from POJO support.
>
> >How to support this with POJO?
>
> >List getObject(List param1){
> >       return param1;
> >}
>
> So  can't we improve existing POJO support ? Is there some reason or
> difficulty in doing so?
>

yes. because Axis2 rmi uses a totally different architecture than POJO.

I don't see much value in building overlapping features. It's better to
> improve the existing one or replace the existing one with a new feature.
> Overlapping features are confusing to end users.


Let me ask this question. why people have developed Axis2 instead of
improving Axis1? isn't this confuse what to use?
yes It is always good to improve existing features. But this is always not
possible. Some times we have to write from the strach using a new architure
to go for some new features. Please see the advanced-rmi sample.

on the other hand if you take the wsdl2java you have ADB, jibx,xmlbeans and
jaxbri, So that people can use the best fit solution for their problem. So I
think it is better to have four data binding frameworks than one.

Also I found the name RMI confusing and misleading.
> Initially I thought this was a way of exposing an existing RMI Service as
> a Web Service. - thats the impression I got by reading the title)


Anyway this means  you have understood it correctly (although it was
misleading)
Actually what Axis2 rmi try to do is to let users to access the service
Class.(not the rmi service). using Soap protocol instead of rmi protocol. So
that is why I choose that name.

So when you use soap protocol you are getting lot of advantages like using
security addressing etc.

In the java space RMI is reserved for java rmi stuff and users might find
> this name confusing.


in Axis2 rmi means Axis2 remote method invocation.  Anyway if you have a
better name suggestion please let us know. I don't like name POJO since I
feel it is only a subset of the functionalities available with this module.

Thanks,
Amila.

just my 2 cents.
>
> Regards,
>
> Rajith
>
> On 8/15/07, Amila Suriarachchi <[EMAIL PROTECTED]> wrote:
> >
> > 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.
>
>
>


-- 
Amila Suriarachchi,
WSO2 Inc.

Reply via email to