Magentix2  2.1.1
es.upv.dsic.gti_ia.architecture.FIPARequestInitiator Class Reference
Inheritance diagram for es.upv.dsic.gti_ia.architecture.FIPARequestInitiator:
Collaboration diagram for es.upv.dsic.gti_ia.architecture.FIPARequestInitiator:

List of all members.

Public Member Functions

 FIPARequestInitiator (QueueAgent agent, ACLMessage msg)
QueueAgent getQueueAgent ()
boolean finished ()
String getIdConversation ()
void finish ()
void action ()

Public Attributes

QueueAgent myAgent

Protected Member Functions

ACLMessage prepareRequest (ACLMessage msg)
void handleAgree (ACLMessage msg)
void handleRefuse (ACLMessage msg)
void handleNotUnderstood (ACLMessage msg)
void handleInform (ACLMessage msg)
void handleFailure (ACLMessage msg)
void handleOutOfSequence (ACLMessage msg)

Package Functions

int getState ()

Package Attributes

String conversationID = null

Detailed Description

This class implements the FIPA-Request interaction protocol, Role Initiator

Author:
Joan Bellver Faus, GTI-IA, DSIC, UPV
Version:
2009.9.07

Definition at line 15 of file FIPARequestInitiator.java.


Constructor & Destructor Documentation

Creates a new FIPA-Request interaction protocol, Role initiator.

Parameters:
agentagent is the reference to the Agent Object
msginitial message

Definition at line 47 of file FIPARequestInitiator.java.

                                                                      {
                myAgent = agent;
                requestmsg = msg;
                this.monitor = myAgent.addMonitor(this);

        }

Member Function Documentation

Runs the state machine with the communication protocol

Definition at line 106 of file FIPARequestInitiator.java.

                             {
                switch (state) {
                case PREPARE_MSG_STATE: {

                        ACLMessage msg = prepareRequest(this.requestmsg);
                        this.requestsentmsg = msg;
                        state = SEND_MSG_STATE;
                        break;
                }
                case SEND_MSG_STATE: {

                        ACLMessage request = this.requestsentmsg;
                        if (request == null) {
                                //Finalized protocol
                                this.finish = true;
                                break;
                        } else {
                                if (request.getConversationId().equals("")) {
                                        conversationID = "C" + hashCode() + "_"
                                                        + System.currentTimeMillis();
                                        request.setConversationId(conversationID);
                                } else {
                                        conversationID = request.getConversationId();
                                }

                                // Configure template
                                template = new MessageTemplate(InteractionProtocol.FIPA_REQUEST);
                                template.addConversation(conversationID);
                                template.add_receiver(request.getReceiver());

                                myAgent.setActiveConversation(conversationID);

                                //The timeout is fixed in the message
                                Date d = request.getReplyByDate();
                                if (d != null)
                                        timeout = d.getTime() - (new Date()).getTime();
                                else
                                        timeout = -1;
                                endingtime = System.currentTimeMillis() + timeout;
                                
                                //If the message is for a Jade agente.
                                if (request.getReceiver() != null) {
                                        if (request.getReceiver(0).name.contains("/JADE")) {
                                                request.getReceiver().host = request.getReceiver().name.substring(request.getReceiver().name.indexOf("@")+1,request.getReceiver().name.indexOf(":"));
                                                request.getReceiver().port = "7778";
                                                request.getReceiver().protocol = "http";

                                        }
                                }

                                
                                
                                
                                myAgent.send(request);
                                state = RECEIVE_REPLY_STATE;

                        }
                        break;

                }
                case RECEIVE_REPLY_STATE: {

                        ACLMessage firstReply = myAgent.receiveACLMessage(template, 0);

                        if (firstReply != null) {

                                switch (firstReply.getPerformativeInt()) {
                                case ACLMessage.AGREE: {
                                        state = RECEIVE_2ND_REPLY_STATE;
                                        handleAgree(firstReply);
                                        break;
                                }
                                case ACLMessage.REFUSE: {
                                        state = ALL_REPLIES_RECEIVED_STATE;
                                        handleRefuse(firstReply);
                                        break;
                                }
                                case ACLMessage.NOT_UNDERSTOOD: {
                                        state = ALL_REPLIES_RECEIVED_STATE;
                                        handleNotUnderstood(firstReply);
                                        break;

                                }
                                case ACLMessage.FAILURE: {
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleFailure(firstReply);
                                        break;

                                }
                                case ACLMessage.INFORM: {
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleInform(firstReply);
                                        break;

                                }
                                case ACLMessage.CANCEL:{
                                        
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleOutOfSequence(firstReply);
                                        break;
                                }
                                default: {
                                        //We receive the second message, there were problems in first message
                                        state = RECEIVE_REPLY_STATE;
                                        handleOutOfSequence(firstReply);
                                        break;

                                }
                                }
                                break;
                        } else {

                                if (timeout > 0) {
                                        long blocktime = endingtime - System.currentTimeMillis();

                                        if (blocktime <= 0)
                                                state = ALL_REPLIES_RECEIVED_STATE;
                                        else
                                                this.monitor.waiting(blocktime);
                                } else {
                                        this.monitor.waiting();
                                        state = RECEIVE_REPLY_STATE;// state =
                                                                                                // ALL_REPLIES_RECEIVED_STATE;
                                        break;
                                }
                        }
                }
                case RECEIVE_2ND_REPLY_STATE: {

                        ACLMessage secondReply = myAgent.receiveACLMessage(template, 0);

                        if (secondReply != null) {

                                switch (secondReply.getPerformativeInt()) {
                                case ACLMessage.INFORM: {
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleInform(secondReply);
                                        break;

                                }
                                case ACLMessage.FAILURE: {
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleFailure(secondReply);
                                        break;

                                }
                                default: {

                                        // state = RECEIVE_REPLY_STATE;
                                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                                        handleOutOfSequence(secondReply);
                                        break;
                                }
                                }
                                break;
                        } else {
                                this.monitor.waiting();
                                state = RECEIVE_2ND_REPLY_STATE;
                                break;
                        }
                }
                case ALL_REPLIES_RECEIVED_STATE: {
                        state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                        break;
                }
                case ALL_RESULT_NOTIFICATION_RECEIVED_STATE: {

                        this.finish = true;
                        this.requestmsg = null;
                        this.requestsentmsg = null;
                        this.myAgent.deleteMonitor(this);
                        myAgent.deleteActiveConversation(conversationID);
                        break;
                }

                }

        }
void es.upv.dsic.gti_ia.architecture.FIPARequestInitiator.finish ( )

Sends a CANCEL Message for active conversation and and terminates the protocol

Definition at line 91 of file FIPARequestInitiator.java.

         {
                 
                 this.requestmsg.setPerformative(ACLMessage.CANCEL);
                 this.myAgent.send(requestmsg);
                 this.monitor.advise();
                 this.state = ALL_RESULT_NOTIFICATION_RECEIVED_STATE;
                 
         }

This method reports if the protocol has been finished

Returns:
value a boolean value is returned, true: the protocol has finished, false: the protocol even has not finished

Definition at line 70 of file FIPARequestInitiator.java.

                                  {
                return this.finish;
        }

Returns the id of the message used in communication protocol

Returns:
conversationID

Definition at line 78 of file FIPARequestInitiator.java.

                                          {
                return this.conversationID;

        }

Returns the agent.

Returns:
QueueAgent

Definition at line 58 of file FIPARequestInitiator.java.

         {
                return this.myAgent; 
                 
         }

Definition at line 84 of file FIPARequestInitiator.java.

                       {
                return this.state;
        }

This method is called when a agree message is received.

Parameters:
msgthe received agree message.

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 307 of file FIPARequestInitiator.java.

                                                   {
                if (logger.isLoggable(Level.FINE))
                        logger.log(Level.FINE, "in HandleAgree: " + msg.toString());
        }

This method is called when a Failure message is received.

Parameters:
msgthe received Failure message.

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 351 of file FIPARequestInitiator.java.

                                                     {
                if (logger.isLoggable(Level.FINEST))
                        logger.log(Level.FINEST, "in HandleFailure: " + msg.toString());
        }

This method is called when a Inform message is received.

Parameters:
msgthe received Inform message.

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 340 of file FIPARequestInitiator.java.

                                                    {
                if (logger.isLoggable(Level.FINE))
                        logger.log(Level.FINE, "in HandleInform: " + msg.toString());
        }

This method is called when a NotUnderstood message is received.

Parameters:
msgthe received NotUnderstood message.

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 329 of file FIPARequestInitiator.java.

                                                           {
                if (logger.isLoggable(Level.FINE))
                        logger.log(Level.FINE, "in HandleNotUnderstood: " + msg.toString());
        }

This method is called when a unexpected message is received.

Parameters:
msgthe received message

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 362 of file FIPARequestInitiator.java.

                                                           {
                if (logger.isLoggable(Level.FINEST))
                        logger.log(Level.FINEST, "in HandleOutOfSequence: "
                                        + msg.toString());
        }

This method is called when a refuse message is received.

Parameters:
msgthe received refuse message.

Reimplemented in es.upv.dsic.gti_ia.organization.THOMASProxy.THOMASQAgentRequest.

Definition at line 318 of file FIPARequestInitiator.java.

                                                    {
                if (logger.isLoggable(Level.FINE))
                        logger.log(Level.FINE, "in HandleRefuse: " + msg.toString());
        }

This method must return the ACLMessage to be sent. This default implementation just return the ACLMessage object passed in the constructor. Programmer might override the method in order to return a different ACLMessage. Note that for this simple version of protocol, the message will be just send to the first receiver set.

Parameters:
msgthe ACLMessage object passed in the constructor.
Returns:
a ACLMessage.

Definition at line 297 of file FIPARequestInitiator.java.

                                                            {
                return msg;
        }

Member Data Documentation


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables