parent
be86903570
commit
b83b1ec739
|
@ -0,0 +1,240 @@
|
|||
|
||||
|
||||
package org.thinkname.ap.msn;
|
||||
|
||||
import org.thinkname.ap.contact.ContactLocation;
|
||||
import org.thinkname.ap.contact.ContactManager;
|
||||
import org.thinkname.ap.main.ContactsUpdaterBehaviour;
|
||||
|
||||
import jade.core.behaviours.Behaviour;
|
||||
import jade.core.behaviours.CyclicBehaviour;
|
||||
import jade.domain.DFService;
|
||||
import jade.domain.FIPAException;
|
||||
import jade.domain.FIPAAgentManagement.DFAgentDescription;
|
||||
import jade.domain.FIPAAgentManagement.Property;
|
||||
import jade.domain.FIPAAgentManagement.ServiceDescription;
|
||||
import jade.lang.acl.ACLMessage;
|
||||
import jade.lang.acl.MessageTemplate;
|
||||
import jade.util.Logger;
|
||||
import jade.wrapper.gateway.GatewayAgent;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Agent running all behaviours. It resides on the phone and it is responsible for DF registration/subscription and for
|
||||
* behaviour execution.
|
||||
* <p>
|
||||
* It extends GatewayAgent as requested by JADE Android add-on and is therefore able to process commands sent through
|
||||
* JadeGateway.execute().
|
||||
* Provides as an inner class the behaviour responsible for receiving messages.
|
||||
*
|
||||
*/
|
||||
public class MsnAgent extends GatewayAgent {
|
||||
|
||||
/**
|
||||
* Name of service description to be registered on DF (allowing us to filter out the modifications performed by
|
||||
* our application from others)
|
||||
*/
|
||||
public static final String msnDescName = "android-msn-service";
|
||||
|
||||
/**
|
||||
* Type of the description of the service
|
||||
*/
|
||||
public static final String msnDescType = "android-msn";
|
||||
|
||||
/**
|
||||
* Name of the latitude property registered on the DF
|
||||
*/
|
||||
public static final String PROPERTY_NAME_LOCATION_LAT="Latitude";
|
||||
|
||||
/**
|
||||
* Name of the longitude property registered on the DF
|
||||
*/
|
||||
public static final String PROPERTY_NAME_LOCATION_LONG="Longitude";
|
||||
|
||||
/**
|
||||
* Name of the altitude property registered on the DF
|
||||
*/
|
||||
public static final String PROPERTY_NAME_LOCATION_ALT="Altitude";
|
||||
|
||||
/**
|
||||
* Ontology used for sending message
|
||||
*/
|
||||
public static final String CHAT_ONTOLOGY= "chat_ontology";
|
||||
|
||||
/**
|
||||
* Description of Msn service
|
||||
*/
|
||||
private DFAgentDescription myDescription;
|
||||
|
||||
/**
|
||||
* DF Subscription message
|
||||
*/
|
||||
private ACLMessage subscriptionMessage;
|
||||
|
||||
/**
|
||||
* Instance of {@link ContactsUpdaterBehaviour}
|
||||
*/
|
||||
private ContactsUpdaterBehaviour contactsUpdaterB;
|
||||
|
||||
/**
|
||||
* Message receiver behaviour instance
|
||||
*/
|
||||
private MessageReceiverBehaviour messageRecvB;
|
||||
|
||||
/**
|
||||
* Instance of JADE Logger for debugging
|
||||
*/
|
||||
private final Logger myLogger = Logger.getMyLogger(this.getClass().getName());
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Overrides the Agent.setup() method, performing registration on DF, prepares the DF subscription message,
|
||||
* and adds the {@link ContactsUpdaterBehaviour}.
|
||||
*
|
||||
*/
|
||||
protected void setup() {
|
||||
super.setup();
|
||||
Thread.currentThread().getId();
|
||||
myLogger.log(Logger.INFO, "setup() called: My currentThread has this ID: " + Thread.currentThread().getId());
|
||||
myDescription = new DFAgentDescription();
|
||||
//fill a msn service description
|
||||
ServiceDescription msnServiceDescription = new ServiceDescription();
|
||||
msnServiceDescription.setName(msnDescName);
|
||||
msnServiceDescription.setType(msnDescType);
|
||||
myDescription.addServices(msnServiceDescription);
|
||||
|
||||
//subscribe to DF
|
||||
subscriptionMessage = DFService.createSubscriptionMessage(this, this.getDefaultDF(), myDescription, null);
|
||||
|
||||
ContactLocation curLoc = ContactManager.getInstance().getMyContactLocation();
|
||||
|
||||
Property p = new Property(PROPERTY_NAME_LOCATION_LAT,new Double(curLoc.getLatitude()));
|
||||
msnServiceDescription.addProperties(p);
|
||||
p = new Property(PROPERTY_NAME_LOCATION_LONG,new Double(curLoc.getLongitude()));
|
||||
msnServiceDescription.addProperties(p);
|
||||
p= new Property(PROPERTY_NAME_LOCATION_ALT,new Double(curLoc.getAltitude()));
|
||||
msnServiceDescription.addProperties(p);
|
||||
myDescription.setName(this.getAID());
|
||||
|
||||
try {
|
||||
myLogger.log(Logger.INFO, "Registering to DF!");
|
||||
DFService.register(this, myDescription);
|
||||
} catch (FIPAException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
//added behaviour to dispatch chat messages
|
||||
messageRecvB = new MessageReceiverBehaviour();
|
||||
addBehaviour(messageRecvB);
|
||||
String[] args = (String[])getArguments();
|
||||
myLogger.log(Logger.INFO, "UPDATE TIME: " + args[0]);
|
||||
contactsUpdaterB = new ContactsUpdaterBehaviour(Long.parseLong(args[0]), curLoc);
|
||||
addBehaviour(contactsUpdaterB);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the DF subscription message.
|
||||
*
|
||||
* @return the DF subscription message
|
||||
*/
|
||||
public ACLMessage getSubscriptionMessage(){
|
||||
return subscriptionMessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the agent description.
|
||||
*
|
||||
* @return the agent description
|
||||
*/
|
||||
public DFAgentDescription getAgentDescription(){
|
||||
return myDescription;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Overrides agent takeDown() method
|
||||
*/
|
||||
protected void takeDown() {
|
||||
myLogger.log(Logger.INFO, "Doing agent takeDown() ");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Overrides GatewayAgent.processCommand(). Receives a command from JadeGateway.execute()
|
||||
* The behaviour for sending a message in particular is received in this way
|
||||
*
|
||||
* @param command a generic command that this agent shall execute.
|
||||
*/
|
||||
protected void processCommand(final Object command) {
|
||||
if (command instanceof Behaviour){
|
||||
addBehaviour( (Behaviour) command);
|
||||
|
||||
}
|
||||
releaseCommand(command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the behaviour for receiving chat messages.
|
||||
* Each time a message is received, a UI feedback is required (adding message to message window or adding a notification).
|
||||
* The {@link CyclicBehaviour} continuously executes its action method and does something as soon as a message arrives.
|
||||
*/
|
||||
private class MessageReceiverBehaviour extends CyclicBehaviour{
|
||||
|
||||
/**
|
||||
* Overrides the Behaviour.action() method and receives messages.
|
||||
* After a message is received the following operations take place:
|
||||
* <ul>
|
||||
* <li> If the message is related to a new conversation (it is the first message received) a new session is created, otherwise the session is retrieved
|
||||
* <li> The message is added to the conversation
|
||||
* <li> an event for a new message is sent to update the GUI in th appropriate way
|
||||
* </ul>
|
||||
*/
|
||||
public void action() {
|
||||
|
||||
try {
|
||||
MessageTemplate mt = MessageTemplate.MatchOntology(CHAT_ONTOLOGY);
|
||||
ACLMessage msg = myAgent.receive(mt);
|
||||
//If a message is received
|
||||
if(msg != null){
|
||||
myLogger.log(Logger.FINE, msg.toString());
|
||||
MsnSessionManager sessionManager = MsnSessionManager.getInstance();
|
||||
|
||||
//retrieve the session id
|
||||
String sessionId = msg.getConversationId();
|
||||
myLogger.log(Logger.FINE, "Received Message... session ID is " + sessionId);
|
||||
String senderPhoneNum = msg.getSender().getLocalName();
|
||||
|
||||
//Create a session Message from the received ACLMessage
|
||||
MsnSessionMessage sessionMessage = new MsnSessionMessage(msg);
|
||||
|
||||
//Check if we can retrieve a session. If so we should have got a copy
|
||||
MsnSession currentSession = MsnSessionManager.getInstance().retrieveSession(sessionId);
|
||||
|
||||
//If we have a new session
|
||||
if (currentSession == null) {
|
||||
//Create a new session with the specified ID
|
||||
sessionManager.addMsnSession(sessionId, msg.getAllReceiver(), senderPhoneNum);
|
||||
}
|
||||
|
||||
//prepare an "IncomingMessage"
|
||||
MsnEvent event = MsnEventMgr.getInstance().createEvent(MsnEvent.INCOMING_MESSAGE_EVENT);
|
||||
event.addParam(MsnEvent.INCOMING_MESSAGE_PARAM_SESSIONID, sessionId);
|
||||
event.addParam(MsnEvent.INCOMING_MESSAGE_PARAM_MSG, sessionMessage);
|
||||
//Add message to session
|
||||
sessionManager.addMessageToSession(sessionId, sessionMessage);
|
||||
MsnEventMgr.getInstance().fireEvent(event);
|
||||
} else{
|
||||
block();
|
||||
}
|
||||
|
||||
}catch(Throwable t) {
|
||||
myLogger.log(Logger.SEVERE,"*** Uncaught Exception for agent " + myAgent.getLocalName() + " ***",t);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
|
||||
|
||||
package org.thinkname.ap.msn;
|
||||
|
||||
import jade.util.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This is an event. An event is basically a container object that carries
|
||||
* arbitrary data and has an unique name.
|
||||
* It is filled by the entity that fires the event.
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class MsnEvent {
|
||||
|
||||
private Logger myLogger = Logger.getMyLogger(MsnEvent.class.getName());
|
||||
|
||||
/**
|
||||
* Event that is fired each time an update should be performed
|
||||
*/
|
||||
public static final String TICK_EVENT="TICK_EVENT";
|
||||
/**
|
||||
* Event that is fired when a new message arrives
|
||||
*/
|
||||
public static final String INCOMING_MESSAGE_EVENT="INCOMING_MESSAGE_EVENT";
|
||||
/**
|
||||
* Event that is fired when a refresh of the view is needed ()
|
||||
*/
|
||||
public static final String VIEW_REFRESH_EVENT="VIEW_REFRESH_EVENT";
|
||||
/**
|
||||
* Event that is fired when a contact disconnects
|
||||
*/
|
||||
public static final String CONTACT_DISCONNECT_EVENT="CONTACT_DISCONNECT_EVENT";
|
||||
|
||||
|
||||
//Parameters defined for INCOMING MSG EVENT
|
||||
/**
|
||||
* Name for the incoming message parameter
|
||||
*/
|
||||
public static final String INCOMING_MESSAGE_PARAM_MSG="INCOMING_MESSAGE_PARAM_MSG";
|
||||
/**
|
||||
* Name for the session id parameter for an incoming message
|
||||
*/
|
||||
public static final String INCOMING_MESSAGE_PARAM_SESSIONID="INCOMING_MESSAGE_PARAM_SESSIONID";
|
||||
|
||||
//Parameters defined for VIEW REFRESH EVENT
|
||||
/**
|
||||
* Name for the list of changes parameter at each refresh
|
||||
*/
|
||||
public static final String VIEW_REFRESH_PARAM_LISTOFCHANGES="VIEW_REFRESH_PARAM_LISTOFCHANGES";
|
||||
/**
|
||||
* Name of contacts map parameter at each refresh
|
||||
*/
|
||||
public static final String VIEW_REFRESH_CONTACTSMAP="VIEW_REFRESH_CONTACTSMAP";
|
||||
/**
|
||||
* Name of location map parameter at each refresh
|
||||
*/
|
||||
public static final String VIEW_REFRESH_PARAM_LOCATIONMAP="VIEW_REFRESH_PARAM_LOCATIONMAP";
|
||||
|
||||
//Parameters defined for CONTACT DISCONNECT EVENT
|
||||
/**
|
||||
* Name of parameter
|
||||
*/
|
||||
public static final String CONTACT_DISCONNECT_PARAM_CONTACTNAME="CONTACT_DISCONNECT_PARAM_CONTACTNAME";
|
||||
|
||||
/**
|
||||
* Name of the event
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* Maps that stores event parameters
|
||||
*/
|
||||
private Map<String, Object> paramsMap;
|
||||
|
||||
/**
|
||||
* Returns the name of the event
|
||||
* @return event name
|
||||
*/
|
||||
public final String getName() {
|
||||
return name;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a new event
|
||||
* @param name name of the event
|
||||
*/
|
||||
public MsnEvent(String name){
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a parameter to the event using the given name
|
||||
*
|
||||
* @param name name of the parameter
|
||||
* @param value value to be added
|
||||
*/
|
||||
public void addParam(String name, Object value){
|
||||
if (paramsMap == null){
|
||||
paramsMap = new HashMap<String, Object>();
|
||||
}
|
||||
|
||||
paramsMap.put(name, value);
|
||||
myLogger.log(Logger.FINE,"putting in event map parameter " + name +" having value "+ value.toString() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a parameter from an event
|
||||
*
|
||||
* @param name of the parameter to retrieve
|
||||
* @return value of the parameter
|
||||
*/
|
||||
public Object getParam(String name){
|
||||
return paramsMap.get(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue