[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [ecf-dev] Remote OSGI services over XMPP
|
Hi Leen,
Leen Toelen wrote:
Hi,
thanks a lot for the help. Right now I'm listening for container
events using a containerManagerTracker and for each one I call
getAdapter(IRemoteServiceContainerAdapter.class). It's rough but it works.
OK, good. I've added a bug for this here
https://bugs.eclipse.org/bugs/show_bug.cgi?id=218187
I would love to help out when I got the time to continue this project,
right now I am only doing some investigation. I guess it would be
great for everyone to have a remotely manageable OSGI environment
throught ecf, along the lines of r-osgi. Do you have any plans for this?
FYI, we have already submitted requests to use r-OSGi as an
implementation of the ECF provider API...Jan Rellermeyer (ECF committer)
has written an ECF remote services provider that uses r-OSGi for its
implementation. It just has to go through Foundation legal approval.
So in answer to your question...we do have plans to provide remote
access to some of the Equinox p2 APIs for Ganymede:
http://wiki.eclipse.org/Equinox_p2
But are in need of contributions and some input on which APIs would be
most immediately useful for specific use cases (e.g. Equinox servers,
Eclipse, etc)
Thanks,
Scott
Regards,
Leen
On Feb 7, 2008 7:37 AM, Scott Lewis <slewis@xxxxxxxxxxxxx
<mailto:slewis@xxxxxxxxxxxxx>> wrote:
Hi Leen,
Leen Toelen wrote:
> Hi,
>
> I am trying to set up a network with lots of automatic bots that
> basically need to expose their OSGI services to an
administrator. I am
> using XMPP as the protocol, and sending IM's and files work
without a
> problem. I would like to try remote services as well, but can't
get it
> working.
>
> This is what the bots do when admin comes online:
>
> /**
> * Register remote services with the admin
> * This is called when admin comes online
> */
> private void initializeRemoteServices() {
> try {
> // Get ECF adapter for remote services
> IRemoteServiceContainerAdapter adapter =
> (IRemoteServiceContainerAdapter) container
>
.getAdapter(IRemoteServiceContainerAdapter.class);
>
> // This is the ID of the administrator
> ID[] targetIDs = new ID[] { getID("admin") };
>
> Dictionary props = new Hashtable();
> props.put(Constants.SERVICE_REGISTRATION_TARGETS,
targetIDs);
> props.put(Constants.AUTOREGISTER_REMOTE_PROXY, "true");
>
> // Create service instance
> PlatformAdmin service = Platform.getPlatformAdmin();
>
> IRemoteServiceRegistration reg =
> adapter.registerRemoteService(new String[] { PlatformAdmin.class
> .getName() }, service, props);
> System.out.println("Registered remote service
server: "+reg);
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
>
> The admin uses the normal contacts view, and has an action to
use this
> services when right-clicking on a bot. This is the code that
tries to
> connect to the PlatformAdmin service oof the selected bot:
>
> ID[] ids = new ID[] { entry.getUser().getID() };
> IRemoteServiceContainerAdapter adapter =
> (IRemoteServiceContainerAdapter)
> container.getAdapter(IRemoteServiceContainerAdapter.class);
> IRemoteServiceReference[] refs =
> adapter.getRemoteServiceReferences(ids,
PlatformAdmin.class.getName(),
> null);
>
> But this always gives an empty array.
Hmmm. This looks right. But one possibility...*when* is the line on
the bot that runs:
IRemoteServiceContainerAdapter adapter =
(IRemoteServiceContainerAdapter)
container.getAdapter(IRemoteServiceContainerAdapter.class);
Invoked for the first time? Is it just prior to the line above?
Because the adapter is initialized for receiving the remote service
registrations *when the
container.getAdapter(IRemoteServiceContainerAdapter.class) is
called for
the first time*. This is because the adapter manager (the way
that the
remote service container adapter is associated with the xmpp
container),
is lazy...and so the code that sets up to *receive* service
registrations may not be getting called until after the service
registration has already occurred.
So if you could move the container.getAdapter call (in the client/bot)
to either container creation time, or container connect time I think
this might be solved. If this turns out to be the case I will file a
bug/enhancement request so that we can address it somehow in the
underlying protocol so this isn't necessary.
>
> Is there something else I need to do to enable remote services
on the
> "client" side?
I think this may be it...moving up the
container.getAdapter(IRemoteServicesContainerAdapter.class) call to
earlier in the sequence.
BTW...also to be more like BundleContext.getServiceReferences, we've
adjusted the adapter.getRemoteServiceReferences to return null instead
of an empty array. I prefer using empty arrays, but we are trying to
make it as much like getServiceReferences as possible.
Thanks. Please let us know if this is the issue.
Also...I happen to be working on a demo for using remote services to
access the Equinox EnvironmentInfo service information. Combined with
the PlatformAdmin service this could be very interesting for providing
remote support/problem diagnosis and repair. Please let me know
if you
are interested in working on this in prep for EclipseCon (as I see you
are providing remote access to PlatformAdmin...BTW...remember,
that all
method parameters and return values have to be Serializable to allow
them to be sent over the wire...I'm not sure if this is true for
PlatformAdmin's methods.
If you are interested in looking at the examples work see these three
plugins:
<ecf
root>/examples/plugins/org.eclipse.ecf.examples.remoteservices.common
(defines IRemoteEnvironmentInfo interface)
<ecf
root>/examples/plugins/org.eclipse.ecf.exmaples.remoteservices.server
(a
very simple Equinox process that registers an impl of
IRemoteEnvironmentInfo)
<ecf
root>/examples/plugins/org.eclipse.ecf.examples.remoteservices.client
(a
very simple client that uses the ECF discovery API to discover
IRemoteEnvironmentInfo and then provides a serviceAccessHandler to
hook
into the service discovery view context menu...and allow the
service to
be connected to and then accessed via ECF IRemoteService methods
(proxy,
synch, asynch, future).
I'll have a wiki page with screen shots of this tomorrow. In the
meantime, here's the code in the CVS browser:
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.ecf/examples/plugins/?root=Technology_Project
Scott
>
> Regards,
> Leen Toelen
>
>
------------------------------------------------------------------------
>
> _______________________________________________
> ecf-dev mailing list
> ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
> https://dev.eclipse.org/mailman/listinfo/ecf-dev
>
_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
https://dev.eclipse.org/mailman/listinfo/ecf-dev
------------------------------------------------------------------------
_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/ecf-dev