Michal Kleczek wrote:
I've sent my message to early...

On Saturday 09 of October 2010 17:52:59 Michal Kleczek wrote:
On Saturday 09 of October 2010 15:54:49 Sim IJskes - QCG wrote:
And downloading a jar? A jar has everything already. Dependencies,
codesigning. Extendable manifest, etc.
2. Dependencies - that is something I am not really sure is needed in OSGI
- the service can provide everything that it needs in its bundle and
express its public packages (a service interface) as exports.
But it seems useful if we don't want to depend on OSGI container - service
interface would be provided by a dependency. If the client depends on the
same dependency Module (the problem of Module identity is something to be
solved anyway - I would go for Java object identity here) there would be
no ClassCastExceptions.
In OSGI they don't do any harm - it is just that a service can provide some
of its code in it's own bundle and some - as dependencies.

But a Jini service actually consists of two (or more) Modules - a server module and a proxy module. So deploying a service is actually installing two modules (server and its proxy module as a dependency). Objects sent over the wire would be annotaded only by a proxy module.

Michal

There's an earlier discussion about dependency's on the mail list, what we basically came up with:

  1. *-api.jar  - the Service API jar file, it resides in both the
     client and the service implementation node.
  2. *-proxy.jar  - the smart proxy jar file, dynamically downloaded,
     depends on *-api.jar
  3. *-imp.jar - the service implementation.
  4. *-ui.jar - for the Service UI implementation.
  5. *-api-ext.jar - for extending a Service API, can also be
     downloaded dynamically by clients using the original Service API
     only, allowing clients to unmarshall proxy's that support extended
     Service API functionality not used by the client.

See the draft spec on https://issues.apache.org/jira/browse/RIVER-341 for details, feel free to make comments or suggestions for improvement.

Dependency Tree:

                      Java
                        |
                  Jini Platform
                        |
Service API (not a requirement to depend on Jini Platform)
          ______________|_______________
         |          |         |         |
Service Imp Proxy Client Service UI


I've had some further thoughts about Extending Service API (we may not need to have a specially named *-api-ext.jar, see below):

  1. The initial service implementation might be called transport-api.jar
  2. Someone extends the transport service api and comes up with
     bus-api.jar which depends on transport-api.jar (Bus might provide
     some additional features)
  3. Earlier clients only lookup services that implement the transport api.
  4. Bus services will also need to make the bus-api.jar available for
     dynamic download, since earlier clients that lookup transport
     services only might not have bus-api.jar and will need it to
     unmarshall the bus proxy classes, even thought the client doesn't
     utilise them directly via the bus API.

Notes:
bus-api.jar, when dynamically downloaded, should not be loaded into the Parent ClassLoader containing Service API in the client, unless the client provisions it itself, under normal circumstances, when the client doesn't have the bus-api.jar, it should be loaded into the Proxy's ClassLoader.

If we have a ClassLoader inheritance hierarchy, similar to the dependency tree, we'll end up with a ClassLoader tree like this:

       Java System Loader and Extension Loader
                        |
        Jini Platform & Service API ClassLoader
          ______________|_______________
| | | Service Imp Proxy Client App ClassLoader & Service UI ClassLoader
                   ClassLoader


The above ClassLoaders don't represent different class types for ClassLoader's but instead just Isolated Name spaces for implementations that should remain separate from each other, there may be multiple proxy and service implementation name spaces.

So in the above case a Client might embed an OSGi framework, into the Client application, being a dynamic evolving environment, the client in this case will want to add new Service API, it will need to provision the Service API jar files and load them into the Jini Platfom & Service API ClassLoader. If the environment is set up this way, the Client can utilise Jini Services from other nodes that know nothing of OSGi.

A Service implementation and it's proxy can also utilise and embed OSGi and clients that know nothing of OSGi can discover and utilise them.

The runtime type of classes is the canonical class name + the ClassLoader namespace.

The Jini Platform & Service API ClassLoader (and the parent ClassLoader's above) represent class types that all implementations can use to call methods on each other and be grouped by type. If we have different versions of Service API, we potentially end up with multiple types that become incompatible, since they're loaded into different ClassLoaders.

In OSGi the service definitions are String's, (service names), so the Service type is discovered by name, in Jini the Service definition is the serialized from as represented by MarshalledObject.

Service API represent the components that don't change often, rather than change Service API, it is simpler to extend or replace Service API.

OSGi is about making software upgradeable remotely, by segregating it into replaceable components.

It would be interesting to see how Jini and the Java platform might be upgraded dynamically, the above discussion represents my current thinking, although it would be interesting to explore the possibility of making River and possibly even Java upgradeable also.

Cheers,

Peter.






Reply via email to