[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [ecf-dev] JaxRS provider

Hi Folks,

I've completed a first cut at an ECF Remote Services client provider based upon JaxRS.

Specifically I ended up implementing using the jersey implementation in Orbit, as libs and all dependencies have already been 'bundleized' and exist in orbit, and it's a popular JaxRS implementation. The repo with both bundles along with an initial example is here [1].

It's broken up into two bundles: 1) org.eclipse.ecf.provider.jaxrs.client; and 2) org.eclipse.ecf.provider.jersey.client. 1 only has dependencies on the javax.ws.rs.* packages, which means it can be reused with *any* spec compliant implementation of JaxRS. Most of the actual remote service distribution provider code is here, although it's actually pretty small. 2 is the jersey-specific implementation and essentially just has code to configure Jersey (e.g. for supporting json, etc).

IMHO the cool thing about this provider is that it will/does work with remote services exposed by non-jersey, non-osgi, even non-java servers. It supports arbitrary arguments and return type serialization via both xml and/or json.

Here's a simple example:

1) I setup an example running on tomcat (no OSGi) and exposing a xml and rest-based service on tomcat.
2) I created a new service API bundle with
a) An interface: ISampleService [2] with the same jax-rs (standardized) annotations as were present on the server resource class. It doesn't have to be the same class as used on the server (or even from the same package), it just needs to be an interface that has the same class and method annotations.
b) A model class (or any model classes) used in 'a'. Here's the example [3].
The only dependencies in this service API bundle are to the javax.ws.rs.* annotation types and to 'b'.
3) I created a simple consumer of the ISampleService [4] using a service tracker calls a couple of the ISampleService remote service methods. In this bundle I also created a EDEF file (to discover the ISampleService remote service) called helloserviceendpointdescription.xml [5]. My intention is to create some utilities to automate the creation of EDEF so that it's unnecessary to hand-craft it.


Using the new ECF Endpoint Discovery view [6]

1) read the EDEF from 3, which discovers the ISampleService, creates the remote service proxy (from the ISampleService class) and like any OSGi service the proxy registration calls the test consumer's addingService method.
2) The addingService impl makes a couple of calls, which get turned into http/https calls with java params serialized and injected into the url, and the return value deserialized and returned as an instance of an appropriate java object. All this happens/is implemented by the jersey jax-rs impl, so that the call looks to the server just like any other http/REST client.


This is pretty cool, as it means that it's very very simple to take any remote service that can be described by jax-rs annotations and turn it into an OSGi remote service, with all the dynamics, API versioning support, use of any OSGi service injection technology (spring, ds, dm, etc., etc). And it will work the same way on any OSGi framework.

My intention is to create a wiki-based tutorial describing the above once I get the chance, as well as create some more examples, and EDEF utility code. Please let me know if you would like to participate/contribute in this.

Scott

[1] https://github.com/ECF/JaxRSProviders
[2] https://github.com/ECF/JaxRSProviders/blob/master/test/bundles/com.mycorp.examples.resteasy.hello/src/com/javacodegeeks/resteasy/ISampleService.java
[3] https://github.com/ECF/JaxRSProviders/blob/master/test/bundles/com.mycorp.examples.resteasy.hello/src/com/javacodegeeks/resteasy/model/Employee.java
[4] https://github.com/ECF/JaxRSProviders/tree/master/test/bundles/com.mycorp.examples.resteasy.hello.test
[5] https://github.com/ECF/JaxRSProviders/blob/master/test/bundles/com.mycorp.examples.resteasy.hello.test/helloserviceendpointdescription.xml
[6] https://www.eclipse.org/ecf/NewAndNoteworthy_3.10.0.html


On 8/16/2015 11:21 AM, Scott Lewis wrote:
Hi Folks,

I wanted to let everyone know that I've implemented and started testing two new ECF Remote Services distribution providers:

[1] One based upon Hazelcast [3]
[2] One based upon Jax REST Services [4]. Since JaxRS is a specification with multiple impls (e.g. resteasy, jersey, restlet, etc) I have structured things so that a number of providers can/could be created, and I've started testing one I've created based upon resteasy [5]


The initial impls are done for both 1 and 2, and I'm working on test and example code. If anyone would like to contribute/participate in these impls, help with making them more useful, and/or create other providers (e.g. based upon jersey, restlet, etc), please say so.

BTW, also update the no-OSGi ServiceRegistry examples [6] to use ECF 3.10.1.

Scott

[1] https://github.com/ECF/HazelcastProvider
[2] https://github.com/ECF/JaxRSProviders
[3] http://hazelcast.org/
[4] https://jax-rs-spec.java.net/
[5] http://resteasy.jboss.org/
[6] https://github.com/ECF/ServiceRegistry
_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/ecf-dev