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();
}