package __MASA_PACKAGE_thisagent;
import __MASA_PACKAGE_agentSystem__(*);
import __MASA_PACKAGE_agent__(*);
import __MASA_PACKAGE_CfMAF__(*);
import __MASA_PACKAGE__(tools.NameWrapper);
import __MASA_PACKAGE__(tools.Debug);
import __MASA_PACKAGE__(tools.GlobalConstants);
import java.io.*;
import java.util.*;
import org.omg.CosEventComm.*;
import org.omg.CosEventChannelAdmin.*;
import org.omg.CosNaming.*;
/**
* This is the class defining the RegionManagementAgent.
* <br>The RegionManagementAgent is a mobile agent which primary task it is to provide methods
* that allow applets to communicate with objects and CORBA services. In particular these are
* other agent systems, the CORBA Name Service and the CORBA Event Service, which are often not located
* on the same machines as the applets. The RegionManagementAgent therefore acts as a proxy for these applets.
*
* @see MobileAgent
* @author Stefan Gerber
*/
public class RegionManagementAgentMobileAgent extends MobileAgent
implements RegionManagementAgentOperations {
transient private org.omg.CosNaming.NamingContext agent_context; // CORBA naming context for agents
transient private org.omg.CosNaming.NamingContext AS_context; //CORBA naming context for agent systems
//constructor
public RegionManagementAgentMobileAgent() {
super();
//get_agent_context(); //doesn't work here, because _initContext = null at this moment
}
public void cleanUp() throws Throwable {
System.err.println("RegionManagementAgentMobileAgent.cleanUp()");
}
public void checkSerialization()
throws CouldNotMigrate {
}
/**
* Calls methods to fetch the naming contexts of agents/agent systems.
* <br>This method is called, when the agent is started, also after migration.
*/
public void run() {
get_agent_context();
get_agentsystem_context();
}
/**
* Fetches the naming context containing the agents of the different agent systems.
* <br>The naming context is saved into agent_context. This method is only for internal use.
*/
void get_agent_context()
{
//get context of agents
try {
NameComponent comp1 = new NameComponent("Agent", "");
NameComponent name[] = {comp1};
agent_context = NamingContextHelper.narrow(_initContext.resolve(name));
} catch (Exception e) {
e.printStackTrace();
System.err.println("\nfailed :" + e.toString());
}
}
/**
* Fetches the naming context containing the different agent systems.
* <br>The naming context is saved into AS_context. This method is only for internal use.
*/
void get_agentsystem_context()
{
//Get context of the agent systems
try {
NameComponent comp1 = new NameComponent("AgentSystemService", "");
NameComponent comp2 = new NameComponent("4", "");
NameComponent comp3 = new NameComponent("mnm", "");
NameComponent name[] = {comp1, comp2, comp3};
AS_context = NamingContextHelper.narrow(_initContext.resolve(name));
} catch (Exception e) {
e.printStackTrace();
System.err.println("failed :" + e.toString());
}
}
/**
* Returns the AgentSystemService object of an agent system.
* <br>This method is internally used by migrate_agent() and get_AS_URL()
*
* @param as name of agent system
* @return AgentSystemService object of agent system specified by "as"
**/
AgentSystemService get_agentsystemservice(String as) {
//get_agentsystem_context();
AgentSystemService ass = null;
try {
//resolve AgentSystemService-Object of as
NameComponent comp1 = new NameComponent(as, "");
NameComponent name[] = {comp1};
ass = AgentSystemServiceHelper.narrow(AS_context.resolve(name));
} catch (Exception e) {
e.printStackTrace();
}
return ass;
}
/**
* Returns a list of all agents in an agent system.
* <br>This list is determined using the NamingContext object agent_context.
*
* @param as name of the agent system
* @return String[] containing the list of agent names
*/
public String[] list_agent_names(String as) {
//get the naming context from the CORBA name service
//get_agent_context();
//get name context of agent system "as"
org.omg.CosNaming.NamingContext agentsystem_context = null;
try {
NameComponent comp1 = new NameComponent(as, "");
NameComponent name[] = {comp1};
agentsystem_context = NamingContextHelper.narrow(agent_context.resolve(name));
} catch (Exception e) {
e.printStackTrace();
System.err.println("\n\nfailed :" + e.toString());
}
BindingListHolder bl_holder = new BindingListHolder();
BindingIteratorHolder bi_holder = new BindingIteratorHolder();
agentsystem_context.list(1000000, bl_holder, bi_holder);
Binding[] agent_bindings = bl_holder.value;
System.err.println("list_agent_names: agent_bindings.length = "+agent_bindings.length);
String agent_names[] = new String[agent_bindings.length];
for (int i=0; i<agent_bindings.length; i++) {
agent_names[i] = (String) agent_bindings[i].binding_name[agent_bindings[i].binding_name.length-1].id;
}
return agent_names;
}
/**
* Transfers an agent to another agent system.
* <br>The agent specified by "agent_identity" is transferred to the
* agent system with the name provided by the parameter "target". The
* parameter "as" is the name of the source agent system.
*
* @param agent_identity name of agent
* @param target target agent system
* @param as source agent system
*/
public void migrate_agent(String agent_identity, String target, String as) {
AgentSystemService ass = null;
try {
ass = get_agentsystemservice(as);
NameWrapper nw= new NameWrapper(agent_identity);
// connect to agent to transfer
org.omg.CORBA.Object obj = ass.connectToAgent(nw._name);
Migration agent = MigrationHelper.narrow(obj);
// connect to destination agent system
agent.migrateToAgentSystem("AgentSystemService/4/mnm/"+ target);
System.err.println("\n\ntransferAgent: agent "+ agent_identity + " transferred to "+ target);
}
catch(Exception e1){
if (e1 instanceof org.omg.CORBA.BAD_PARAM) { }
else {
e1.printStackTrace();
System.err.println("transferAgent failed: "+e1.toString()+"\n"+e1.getMessage()+"\n");
}
}
}
/**
* Returns a String that contains the URL of an agent system.
*
* @param as name of the agent system
* @return String containing the URL of the agent system
*/
public String get_AS_URL(String as) {
AgentSystemService ass = get_agentsystemservice(as);
return ass.getURL();
}
/**
* Terminates an agent system.
* <br>This method simply gets a reference to the AgentSystemService instance of agent system "as"
* and calls its terminate_agent_system() method.
*
* @param as name of the agent system
*/
public void terminate_agent_system(String as) {
try {
//connect to agent system specified by "as"
AgentSystemService ass = get_agentsystemservice(as);
//terminate agent system
ass.terminate_agent_system();
} catch (Exception e) {
e.printStackTrace();
System.err.println("\nRegionManagementAgent: terminate agent system "+as+" failed!");
if (e instanceof TerminateFailed)
System.err.println(e.toString()+"\n"+e.getMessage());
}
}
}