You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@river.apache.org by Gregg Wonderly <gr...@wonderly.org> on 2008/12/12 19:57:28 UTC

Service lookup without unmarshalling - details

Wade Chandler wrote:
> Heh heh, yes, there needs to be a way to inspect the service, some credentials,
> without unmarshalling. A way to ask for all services out there, the class or 
> interface they implement, along with other user identification information such 
> as a displayable name, description, version, etc I would think. What about this
> list? Anyone have a link to an archive? I want to find your other email Gregg
> and see what you wrote about there.

I was just in my list of things I still wanted to put back into River.  I did 
this about 2-3 years ago, and have been using it since then.  The Reggie 
architecture makes it easy to do.  I want it to be an optional interface 
supported by lookup services.

As an example, the current definition of lookup(ServiceTemplate,int) in the 
Reggie proxy is shown here.

     // Inherit javadoc
     public ServiceMatches lookup(ServiceTemplate tmpl, int maxMatches)
	throws RemoteException
     {
	return server.lookup(new Template(tmpl), maxMatches).get();
     }

If you look closely, you will see the "get()" on the end of the line, above, 
which does the unmarshalling.  So, just before it gives you the results, they 
are unmarshalled.

The following method is one of the ones that I added which is in the 
ServiceLookup interface API.

     public RemoteIterator<ServiceEntry> lookupEntries( ServiceTemplate tmpl,
			int maxMatches ) throws RemoteException {
         return new LocalEntryIterator( server.lookup(new Template(tmpl),
		maxMatches ) );
     }

So, it's possible for Reggie to have a simple conversion done to provide this 
capability.  However, I don't think it's realistic to ask that all 
ServiceRegistrar instances support this as the Primary mechanism.

What I've done so far, works.  Are the names and relationships exactly what I'd 
want to see in a production system?  Perhaps not.  Below is an example usage of 
the API.

If you had a ServiceRegistrar instance which also implemented ServiceLookup, 
you'd do something like the following to perform a lookup and get a name for all 
the service instances and add them to a list via addService().

// make sure no downloading occurs to resolve these classes
ClassLoading.neverPrefer( Name.class );
ClassLoading.neverPrefer( ServiceInfo.class );

ServiceTemplate tmpl = ...
ServiceRegistrar reg = ...
if( reg instanceof ServiceLookup ) {
	ServiceLookup lu = (ServiceLookup)reg;
	RemoteIterator<ServiceEntry> ents = lu.lookupEntries( tmpl );
	for( ServiceEntry ent : ents ) {
		Set<ServiceDataAccess<Entry>> accs =
			ent.getMarshalledAttributeSets();
		String name = null;
		for( ServiceDataAccess<Entry> entacc : accs ) {
			if( entacc.getDataClassNames().
				contains(Name.class.getName() ) {
				// Will resolve to local VM class
				name = ((Name)entacc.getData()).getName();
			// Prefer Name, but allow ServiceInfo
			} else if( entacc.getDataClassNames().
				contains(ServiceInfo.class.getName() &&
					name == null ) {
				// Will resolve to local VM class
				name = ((ServiceInfo)
					entacc.getData()).getName();
			}
		}
		if( name == null )
			name = ...find a name from classes...
		addService( name, ent );
	}
} else {
	// you can do regular lookup here and get live objects, or
	// you can ignore all instances that don't support
	// access to the marhalled results.
}

So in this case, only the Entry values for a Name instance of a ServiceInfo 
instance will ever be instantiated.  My changes to ClassLoading, to provide the 
ability to short circuit PreferredClassLoader from downloading the first jar in 
the codebase to find the PREFERRED.LIST to see how to resolve the classes being 
unmarshalled, keep unneeded code from being unmarshalled.  Imagine what would 
happen to your VM where 200 developers are working on the same project, all 
running netbeans, and using a service proxy that unmarshalls into a 1MB class 
instance.  Suddenly, you do a lookup and 200MB goes aways!

Nicalas, and others desires to have a no-network environment could help deal 
with some of the issues of rogue code.  At some point, you will want to not have 
all of the services running on your computer when you are testing a client. You 
might in fact not be able to run the server on your computer.  Both network and 
non-network environments are interesting to explore.  My investigation into 
these issues and how to get away from downloading anything, until you use it, 
has been very revealing of the issues to me.

Gregg Wonderly