
ConversionApplet Code
// A G E N T
// . . .
// ConversionApplet.java
// (c) Andy Wood, Anind Dey ... 1996
// ****************************************************************************
package cyberdesk.acton.convert;
import java.awt.*;
import java.util.*;
import java.applet.*;
import cyberdesk.cameo.*;
// ****************************************************************************
public abstract class ConversionApplet extends Applet
implements CameoObject, CameoSubject, CameoHandler
{
private CameoCommunicate comm;
private CameoObjectImpl cameo;
private CameoLocator locator;
private Vector selects;
private Object selectref = null;
public void init()
{
CameoInterface[] interfaces = new CameoInterface[ 1 ];
interfaces[ 0 ] = new CameoInterface( "select", null );
cameo = new CameoObjectImpl( this, interfaces, true );
System.out.println("CONVERSIONAPPLET: cameo set - "+this);
locator = cameo.getLocator();
comm = new CameoCommunicate( this );
comm.observing( locator, new CameoMessage(), this );
selects = locateInterfaces( "select" );
startObserving();
}
protected Vector locateInterfaces( String interfaze )
{
Vector interfaces = null;
CameoMessage msg = new CameoMessage();
msg.setField( msg.PROPERTY, "locate" );
msg.setField( locator.INTERFACES, interfaze );
msg = comm.manipulate( locator, msg );
Object obj = msg.getField( locator.ID );
if ( obj != null )
{
if ( obj instanceof Vector )
{
interfaces = (Vector)obj;
System.out.println("ConversionApplet: lots of " + interfaze + "s" );
}
else
{
interfaces = new Vector();
interfaces.addElement( obj );
System.out.println("ConversionApplet: one " + interfaze );
}
}
else
{
// No objects with that interface found - just create empty Vector
interfaces = new Vector();
System.out.println("ConversionApplet: no " + interfaze + "s" );
}
return interfaces;
}
// not observing service applets
protected void startObserving()
{
Enumeration f = selects.elements();
for ( Enumeration e = selects.elements(); e.hasMoreElements(); )
{
System.out.println("ConversionApplet: observing "+f.nextElement() );
if ( selectref == null )
selectref = comm.observing( (CameoObject)e.nextElement(), new CameoMessage(), this );
else
comm.observing( (CameoObject)e.nextElement(), new CameoMessage(), selectref );
}
}
protected abstract boolean weCanConvert( Object data );
protected abstract boolean potentialLoop( ConversionInfo pathelement );
protected abstract Object tryToConvert( Object data ) throws CouldNotConvertException;
protected void convert( CameoMessage msg )
{
StringBuffer sb = new StringBuffer(this +" ConversionApplet: SELECTS\n");
for ( Enumeration f = selects.elements(); f.hasMoreElements(); ) {
sb.append(f.nextElement() + " ");
}
sb.append("\n");
sb.append(this+ " ConversionApplet: OBSERVERS\n");
CameoObservers ob = cameo.getObservers();
Hashtable hs = ob.getHash();
for (Enumeration f = hs.keys(); f.hasMoreElements(); ) {
sb.append(f.nextElement() + " ");
}
sb.append("\n");
System.out.println(sb);
Object data = msg.getField( msg.DATA );
if ( weCanConvert( data ) )
{
boolean convert = true;
Vector path = ( Vector )msg.getField( msg.PATH );
// Loop through looking for previous instances of the same type
// to stop us getting into a continuous loop.
if ( path != null )
{
for ( Enumeration e = path.elements(); e.hasMoreElements(); )
{
if ( potentialLoop( (ConversionInfo)e.nextElement() ) )
convert = false;
}
}
// If we're OK to convert - do it!
if ( convert )
{
try
{
CameoMessage converted = new CameoMessage();
converted.setField( converted.PROPERTY, "selection" );
converted.setField( converted.DATA, tryToConvert( data ) );
Vector newpath;
ConversionInfo info = new ConversionInfo( data, this );
if ( path == null )
newpath = new Vector();
else
// We clone here because there maybe many data conversion paths being followed
newpath = (Vector)path.clone();
newpath.addElement( info );
converted.setField( converted.PATH, newpath );
System.out.println("ConversionApplet: called observed " + data );
CameoObservers obs = cameo.getObservers();
cameo.getObservers().observed( converted );
}
catch ( CouldNotConvertException e )
{
// Oh well, we tried!
}
}
}
}
public void handle( CameoMessage msg )
{
if ( msg.getField( msg.INREPLYTO ).equals( selectref ) )
{
// when "select" OBSERVED
convert( (CameoMessage)msg.getField( msg.CONTENT ) );
}
else
{
CameoMessage content = (CameoMessage)msg.getField( msg.CONTENT );
if ( content.getField( msg.PROPERTY ).equals( "insert" ) )
{
Object app = content.getField( locator.ID );
System.out.println("ConversionApplet: new entity added - " + app );
// different entity added to the system
// add to selects? - and start observing?
// or add to methods, for use in buttons...
}
else if ( content.getField( msg.PROPERTY ).equals( "remove" ) )
{
Object app = content.getField( locator.ID );
// different entity removed from the system
// if in selects stop observing? - but it does that anyway
// by its destruction? - remove from selects though
}
}
}
public void observed( CameoMessage msg )
{
System.out.println("ConversionApplet has observed" );
try { comm.handleMessage( msg ); } catch (NullInReplyToException e) {}
}
public void examined( CameoMessage msg )
{
System.out.println("ConversionApplet has examined" );
try { comm.handleMessage( msg ); } catch (NullInReplyToException e) {}
}
public void manipulated( CameoMessage msg )
{
System.out.println("ConversionApplet has manipulated" );
try { comm.handleMessage( msg ); } catch (NullInReplyToException e) {}
}
public void manipulate( CameoMessage msg )
{
}
public void examine( CameoMessage msg )
{
System.out.println("EXAMINED: " + this);
cameo.examine( msg );
}
public void observe(CameoMessage msg)
{
cameo.observe(msg);
}
public void observing(CameoMessage msg)
{
System.out.println("#####being observed: "+this);
cameo.observing(msg);
}
public void notobserving(CameoMessage msg)
{
cameo.notobserving(msg);
}
public boolean action(Event event, Object what)
{
return false;
}
}
// ****************************************************************************
Return to the CyberDesk sample code page.
Return to the CyberDesk home page.
