Since we will be formalizing the convention of creating a service.jar,
service-api.jar and service-dl jar, what I was musing about really was the
creation of perhaps an extra an unnecessary jar in the case where a service
does not use a smart proxy. I agree with Greg, in that a client should always
depend on the API jar, and not the DL jar.
The client will have the service-api.jar in it's classpath, and the service
will have an export codebase set to serve the service-d.jar. The service may
also create some variant of the previously discussed DLEntry, and the
service-dl.jar may be provisioned to the client as an option (whether a maven
repository is used or not).
If the particular service does end up having 2 jars with identical content, oh
well. It preserves the approach and allows flexibility going forward.
Regards
Dennis
On May 23, 2010, at 450PM, Peter Firmstone wrote:
>>
>> Dennis Reedy wrote:
>> Oops, but no. If the service does not have a DL jar, the ServiceItem will
>> not be able to be loaded by reggie, so joining the network is a problem
>>
>
> Hi Greg & Dennis,
>
> Reggie's Smart Proxy performs unmarshalling (I realise this is what Dennis
> meant, sorry Dennis, I was thinking of the Service {Registrar}). Reggie's
> proxy also uses com.sun.proxy.MarshalledWrapper to check integrity.
>
> However I've recently added net.jini.core.lookup.MarshalledServiceItem which
> will assist in delayed unmarshalling, giving the client the opportunity to
> pre-download the required classes. MarshalledServiceItem is abstract, to
> allow the implementation of unmarshalling to be separate from the Jini
> Platform.
>
> It will still be Reggie's proxy that does the unmarshalling, by extending
> MarshalledServiceItem, however we could pass a CodeSource object to
> getService(CodeSource cs)? If cs is null, Reggie's proxy can fall back to
> using MarshalledInstance's codebase URL annotation.
>
> That means a CodeSource Entry list could be provided to the client, the
> client then gets a choice, which smart proxy to use, based on the local
> environment, and after local installation.
>
> Due to ClassLoader isolation, the client, although it knows the CodeSource,
> will only be able to interact with the smart proxy via it's Service API.
>
> A Malicious client could download and modify a codebase for the proxy, and
> there's not much we can do about that, it's still possible with
> MarshalledInstance, however using good Serialization practices like,
> defensively copying fields with writeObject() and requiring client
> authentication, we can be reasonable confident.
>
> /**
> * MarshalledServiceItem extends ServiceItem and can be used anywhere a
> * ServiceItem can. A MarshalledServiceItem implementation instance
> * contains the marshalled form of a Service and it's Entry's,
> * the corresponding superclass ServiceItem however contains null values
> * for the service and can exclude any Entry's.
> *
> * The ServiceID shall be in unmarshalled form always in the ServiceItem super
> class.
> *
> * Since the ServiceItem.service is null, use of this class in existing
> software
> * will not return the service, however it will not break that software as
> * ServiceItem's contract is to set service or Entry's to null when they cannot
> * be unmarshalled.
> *
> * ServiceItem's toString() method will return a different result for
> * MarshalledServiceItem instances.
> *
> * If required, a new ServiceItem that is fully unmarshalled
> * can be constructed from this class's methods and ServiceID.
> *
> * @author Peter Firmstone.
> */
> public abstract class MarshalledServiceItem extends ServiceItem{
> private static final long SerialVersionUID = 1L;
> protected MarshalledServiceItem(ServiceID id, Entry[] unmarshalledEntries){
> super(id, (Object) null, unmarshalledEntries);
> }
> /**
> * Unmarshall the service proxy.
> * @return the service proxy, null if class not found.
> */
> public abstract Object getService();
> /**
> * Unmarshall the Entry's
> * @return array of Entry's, null entry in array for any class not found.
> */
> public abstract Entry[] getEntries();
> }