package net.hivecell.hive.description;
import net.hivecell.hive.support.Debug;
import java.io.Serializable;
import java.util.Vector;
import java.util.Enumeration;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.io.Serializable;
import java.util.Random;
import java.util.Hashtable;
public class AgentSet
implements Cloneable, Serializable {
Vector agents = new Vector(); static Random rand = new Random();
public AgentSet() {
super();
}
public AgentSet(Vector objs) {
Enumeration e = objs.elements();
while (e.hasMoreElements()) {
Object o = e.nextElement();
if (o instanceof RemoteDescribable)
agents.addElement( o );
else {
Debug.error("Attempt to add a non-Describable to an AgentSet! Skipping it...");
continue;
}
}
}
public AgentSet(Object[] objs) {
for (int i = 0; i < objs.length; i++) {
if (objs[i] instanceof RemoteDescribable)
agents.addElement( objs[i] );
else {
Debug.error("Attempt to add a non-Describable to an AgentSet! Skipping it...");
continue;
}
}
}
public void addDesc(RemoteDescribable desc) {
agents.addElement(desc);
}
public int size() { return (agents.size()); }
public Object getObject(int which) { return (agents.elementAt(which)); }
public Vector getNames() {
Vector ret = new Vector();
Enumeration e = agents.elements();
while (e.hasMoreElements()) {
Description desc;
try {
desc = ((RemoteDescribable)e.nextElement()).getDescription();
ret.addElement(desc.getName());
} catch( RemoteException error ) {
Debug.error( error );
}
}
return (ret);
}
public Enumeration elements() {
return (agents.elements());
}
public Object pickOne() {
if (agents.size() == 0) return (null);
int at = 0;
if (agents.size() > 1)
at = (int)( rand.nextDouble() * ((double)agents.size()) );
return ( agents.elementAt(at) );
}
public boolean contains(Object o) {
Enumeration e = this.elements();
while (e.hasMoreElements())
if (e.nextElement().equals(o)) return true;
return false;
}
public Description getDescForObject(Object o) {
Enumeration e = agents.elements();
while (e.hasMoreElements()) {
RemoteDescribable ag = (RemoteDescribable)e.nextElement();
try {
if ( o.equals(ag) )
return (ag.getDescription());
} catch( RemoteException error ) {
Debug.error( error );
}
}
return null;
}
public AgentSet querySet(String syntactic, String semantic) {
String[] synArr = null;
if( syntactic != null ) {
synArr = new String[1];
synArr[0] = syntactic;
}
String[] semArr = null;
if( semantic != null ) {
semArr = new String[1];
semArr[0] = semantic;
}
return querySet( synArr, semArr );
}
public AgentSet querySet( String[] syntactic, String[] semantic ) {
Vector syn = new Vector();
if( syntactic != null ) {
Enumeration agentsEnumeration = this.elements(); syntacticSearch:
while( agentsEnumeration.hasMoreElements() ) {
Object o = agentsEnumeration.nextElement();
syntaticSubSearch:
for(int i = 0; i < syntactic.length; i++) {
try {
Class requestedClass = Class.forName( syntactic[i] );
Vector searchingClasses = new Vector();
searchingClasses.addElement( requestedClass );
if( !requestedClass.isInterface() ) {
Class[] possibleClasses = requestedClass.getInterfaces();
for( int count=0;count<possibleClasses.length;count++ )
searchingClasses.addElement( possibleClasses[count] );
}
Enumeration e = searchingClasses.elements();
while( e.hasMoreElements() ) {
Class searchingClass = (Class)e.nextElement();
if( searchingClass.isAssignableFrom( o.getClass() ) )
continue syntaticSubSearch;
}
continue syntacticSearch;
} catch( ClassNotFoundException c ) {
Debug.notice( "Got a class not found exception when looking for a syntactic match.", c );
continue syntacticSearch;
}
}
syn.addElement( o );
}
} else syn = agents;
AgentSet ret = new AgentSet();
if( semantic != null ) {
Enumeration e = syn.elements();
semanticSearch:
while( e.hasMoreElements() ) {
Description desc = null;
RemoteDescribable obj = (RemoteDescribable)e.nextElement();
try {
desc = obj.getDescription();
desc = desc.semanticContext();
} catch( RemoteException error ) {
Debug.error( error );
}
if( desc != null ) {
for( int i=0;i<semantic.length;i++ )
if( !desc.selectFirst( semantic[i] ) )
continue semanticSearch;
ret.addDesc( obj ); }
}
} else { Enumeration e = syn.elements();
while( e.hasMoreElements() )
ret.addDesc( (RemoteDescribable)e.nextElement() );
}
return ret;
}
public AgentSet queryValues(String syntactic, String semantic, String semVal) {
AgentSet set = querySet(syntactic, semantic);
if (set.size() == 0) return set;
AgentSet ret = new AgentSet();
Enumeration descs = set.elements();
while (descs.hasMoreElements()) {
Description desc = null;
RemoteDescribable o = (RemoteDescribable)descs.nextElement();
try {
desc = o.getDescription();
} catch( RemoteException error ) {
Debug.error( error );
}
if ( desc != null && desc.containsTagValue(semantic, semVal) ) ret.addDesc(o);
}
return (ret);
}
public AgentSet queryValues(String syntactic[], String semantic[], String semVals[]) {
if (semantic.length != semVals.length) {
Debug.warning("Error in query values: semantic String[] and semanticValues String[] must have the same number of elements");
return (new AgentSet());
}
AgentSet set = querySet(syntactic, semantic);
if (set.size() == 0) return set;
AgentSet ret = new AgentSet();
Enumeration descs = set.elements();
while (descs.hasMoreElements()) {
Description desc = null;
RemoteDescribable o = (RemoteDescribable)descs.nextElement();
try {
desc = o.getDescription();
} catch( RemoteException error ) {
Debug.error( error );
}
if (desc != null) {
boolean containsAllVals = true;
for (int i = 0; i < semantic.length; i++)
if (!desc.containsTagValue(semantic[i], semVals[i])) containsAllVals = false;
if (containsAllVals) ret.addDesc(o);
}
}
return (ret);
}
}