110 lines
3.2 KiB
Java
110 lines
3.2 KiB
Java
package middleware.agents;
|
|
|
|
import java.util.HashMap;
|
|
import middleware.message.MetaAgentMessage;
|
|
import middleware.message.SystemErrorMessage;
|
|
import middleware.message.UserMessage;
|
|
import middleware.message.wrapper.MetaAgentWrapper;
|
|
|
|
/**
|
|
* MetaAgent Portal, for allowing connection between UserAgents and portals
|
|
*
|
|
* @author JLScott1999
|
|
*/
|
|
public class Portal extends MetaAgent
|
|
{
|
|
|
|
private HashMap<String, UserAgent> routingTable = new HashMap();
|
|
|
|
/**
|
|
* Creates instance of Portal with specified properties
|
|
* @param queueSize size of blocking queue
|
|
* @param address address of MetaAgent
|
|
*/
|
|
public Portal(int queueSize, String address)
|
|
{
|
|
super(queueSize, address);
|
|
}
|
|
|
|
/**
|
|
* Adds a message to the queue
|
|
* @param e message
|
|
* @return success
|
|
*/
|
|
@Override
|
|
public boolean add(Object e)
|
|
{
|
|
if (e instanceof UserMessage)
|
|
{
|
|
return super.add(MetaAgentWrapper.wrap((UserMessage) e, 15));
|
|
}
|
|
else if (e instanceof MetaAgentMessage)
|
|
{
|
|
return super.add(e);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Message handler - handles messages passed to it
|
|
* @param data the passed message
|
|
*/
|
|
@Override
|
|
public void msgHandler(Object data)
|
|
{
|
|
if (data instanceof MetaAgentMessage)
|
|
{
|
|
MetaAgentMessage MAM = (MetaAgentMessage) data;
|
|
try
|
|
{
|
|
routingTable.get(MAM.getMessage().getRecipient().getAddress()).recieveMsg(MetaAgentWrapper.unwrap((MetaAgentMessage) data));
|
|
super.updateObservers(data);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (MAM.timeToLive > 0)
|
|
{
|
|
MAM.decreaseTimeToLive();
|
|
MAM.increaseHops();
|
|
super.msgHandler(MAM);
|
|
}
|
|
else
|
|
{
|
|
if (!MAM.getMessage().getSender().getAddress().equals("0.0.0"))
|
|
{
|
|
super.msgHandler(MetaAgentWrapper.wrap(new SystemErrorMessage(MAM.getMessage().getRecipient().getAddress() + " Does not exist?", MAM.getMessage().getSender().getAddress()), 15));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called when requested user agent is not found
|
|
* @param agent message without valid recipient
|
|
*/
|
|
private void NoUserAgentFound(MetaAgentMessage agent)
|
|
{
|
|
try
|
|
{
|
|
routingTable.get(agent.getMessage().getSender()).recieveMsg(new SystemErrorMessage(agent.getMessage().getRecipient() + " Does not exist?", agent.getMessage().getSender().getAddress()));
|
|
}
|
|
catch (Exception e2)
|
|
{
|
|
super.msgHandler(MetaAgentWrapper.wrap(new SystemErrorMessage(agent.getMessage().getRecipient() + " Does not exist?", agent.getMessage().getSender().getAddress()), Integer.MAX_VALUE));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Allows for communication between MetaAgents
|
|
* Adds a MetaAgent
|
|
* @param agent
|
|
*/
|
|
public void addAgent(UserAgent agent)
|
|
{
|
|
// TODO Generate random address
|
|
routingTable.put(agent.getAddress(), agent);
|
|
agent.setMetaAgent(this);
|
|
}
|
|
|
|
} |