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