Y2S1-Middleware/src/middleware/agents/Portal.java
2020-06-07 22:05:20 +01:00

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);
}
}