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

List of all members.

Public Member Functions

 FIPARequestResponder (QueueAgent _agent, MessageTemplate _template)
int getState ()
QueueAgent getQueueAgent ()
void finish ()
void action ()

Public Attributes

QueueAgent myAgent

Protected Member Functions

ACLMessage prepareResponse (ACLMessage request) throws NotUnderstoodException, RefuseException
ACLMessage prepareResultNotification (ACLMessage request, ACLMessage responder) throws FailureException

Detailed Description

This class implements the FIPA-Request interaction protocol, Role Responder.

Author:
Joan Bellver Faus, GTI-IA, DSIC, UPV
David Fernández Molina, GTI-IA, DSIC, UPV
Version:
2009.9.07

Definition at line 14 of file FIPARequestResponder.java.


Constructor & Destructor Documentation

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

Parameters:
agentagent is the reference to the Agent Object.
templateis a MessageTemplate, will serve as a filter for receiving the right message

Definition at line 46 of file FIPARequestResponder.java.

                                                                                  {
                myAgent = _agent;
                template = _template;
                this.monitor = myAgent.addMonitor(this);
        }

Member Function Documentation

Runs the state machine with the communication protocol

Definition at line 86 of file FIPARequestResponder.java.

                             {
                switch (state) {
                case WAITING_MSG_STATE: {
                        ACLMessage request = myAgent.receiveACLMessage(template, 1);

                        if (request != null) {
                                this.requestmsg = request;
                                state = PREPARE_RESPONSE_STATE;
                                //Configure the cancel template
                                template_cancel = new MessageTemplate(
                                                InteractionProtocol.FIPA_REQUEST);
                                template_cancel.addConversation(request.getConversationId());
                                template_cancel.add_receiver(request.getReceiver());
                                template_cancel.setPerformative(ACLMessage.CANCEL);

                        } else {
                                monitor.waiting();// waiting a message.
                        }
                        break;
                }
                case PREPARE_RESPONSE_STATE: {

                        send_cancel = myAgent.receiveACLMessage(template_cancel, 0);

                        if (send_cancel != null) {
                                if (send_cancel.getPerformativeInt() == ACLMessage.CANCEL)
                                        this.state = FINISH_STATE;
                        } else {
                                ACLMessage request = this.requestmsg;
                                ACLMessage response = null;

                                state = SEND_RESPONSE_STATE;
                                try {

                                        response = prepareResponse(request);
                                } catch (NotUnderstoodException nue) {
                                        response = request.createReply();
                                        response.setContent(nue.getMessage());
                                        response.setPerformative(ACLMessage.NOT_UNDERSTOOD);

                                } catch (RefuseException re) {

                                        response = request.createReply();
                                        response.setContent(re.getMessage());
                                        response.setPerformative(ACLMessage.REFUSE);

                                }

                                this.responsemsg = response;
                        }
                        break;
                }
                case SEND_RESPONSE_STATE: {

                        send_cancel = myAgent.receiveACLMessage(template_cancel, 0);

                        if (send_cancel != null) {
                                if (send_cancel.getPerformativeInt() == ACLMessage.CANCEL)
                                        this.state = FINISH_STATE;
                        } else {
                                ACLMessage response = this.responsemsg;

                                if (response != null) {
                                        ACLMessage receivedMsg = this.requestmsg;

                                        response = arrangeMessage(receivedMsg, response);

                                        response.setSender(myAgent.getAid());

                                        //If the message is for a Jade agent

                                        if (response.getReceiver() != null) {
                                                if (response.getReceiver(0).protocol.equals("http")) {
                                                        name = response.getReceiver().name_all().substring(
                                                                        0,
                                                                        response.getReceiver().name_all().indexOf(
                                                                                        "@",
                                                                                        response.getReceiver().name_all()
                                                                                                        .indexOf("@") + 1));
                                                        port = response.getReceiver().port;
                                                        response.getReceiver().name = name;
                                                        response.getReceiver().port = port;
                                                }
                                        }

                                        myAgent.send(response);

                                        if (response.getPerformativeInt() == ACLMessage.AGREE)
                                                state = PREPARE_RES_NOT_STATE;
                                        else {
                                                state = RESET_STATE;
                                        }
                                } else {
                                        state = PREPARE_RES_NOT_STATE;
                                }
                        }
                        break;

                }
                case PREPARE_RES_NOT_STATE: {

                        send_cancel = myAgent.receiveACLMessage(template_cancel, 0);

                        if (send_cancel != null) {
                                if (send_cancel.getPerformativeInt() == ACLMessage.CANCEL)
                                        this.state = FINISH_STATE;
                        } else {

                                state = SEND_RESULT_NOTIFICATION_STATE;
                                ACLMessage request = this.requestmsg;
                                ACLMessage response = this.responsemsg;
                                ACLMessage resNotification = null;

                                try {
                                        resNotification = prepareResultNotification(request,
                                                        response);

                                } catch (FailureException fe) {

                                        resNotification = request.createReply();

                                        resNotification.setContent(fe.getMessage());
                                        resNotification.setPerformative(ACLMessage.FAILURE);
                                }

                                this.resNofificationmsg = resNotification;
                        }
                        break;
                }
                case SEND_RESULT_NOTIFICATION_STATE: {
                        send_cancel = myAgent.receiveACLMessage(template_cancel, 0);

                        if (send_cancel != null) {
                                if (send_cancel.getPerformativeInt() == ACLMessage.CANCEL)
                                        this.state = FINISH_STATE;
                        } else {
                                state = RESET_STATE;
                                ACLMessage resNotification = this.resNofificationmsg;
                                if (resNotification != null) {
                                        ACLMessage receiveMsg = arrangeMessage(this.requestmsg,
                                                        resNotification);
                                        receiveMsg.setSender(myAgent.getAid());

                                        if (receiveMsg.getReceiver() != null) {
                                                if (receiveMsg.getReceiver(0).protocol.equals("http")) {

                                                        receiveMsg.getReceiver().name = name;
                                                        receiveMsg.getReceiver().port = port;
                                                }
                                        }

                                        myAgent.send(receiveMsg);
                                }

                                break;
                        }

                }
                case RESET_STATE: {

                        state = WAITING_MSG_STATE;
                        this.requestmsg = null;
                        this.resNofificationmsg = null;
                        this.responsemsg = null;
                        break;
                }

                }

        }

Sends a CANCEL Message for active conversation and terminates the protocol

Definition at line 70 of file FIPARequestResponder.java.

                             {
                // Send a CANCEL Message for active conversation

                if (this.requestmsg != null) {
                        arrangeMessage(this.requestmsg, send_cancel);
                        this.send_cancel.setPerformative(ACLMessage.CANCEL);
                        this.myAgent.send(send_cancel);
                }
                this.monitor.advise();
                this.state = FINISH_STATE;

        }

Returns the agent.

Returns:
QueueAgent

Definition at line 61 of file FIPARequestResponder.java.

                                          {
                return this.myAgent;

        }

Definition at line 52 of file FIPARequestResponder.java.

                              {
                return this.state;
        }

This method is called when the initiator's message is received that matches the message template passed in the constructor.

Parameters:
requestinitial message
Returns:
ACLMessage
Exceptions:
NotUnderstoodException
RefuseException

Definition at line 277 of file FIPARequestResponder.java.

                                                                       {
                return null;
        }

This method is called after the response has been sent and only when one of the following two cases arise: the response was an agree message OR no response message was sent.

Parameters:
requestACLMessage
responderACLMessage
Returns:
ACLMessage
Exceptions:
FailureException

Definition at line 294 of file FIPARequestResponder.java.

                                                                      {
                return null;
        }

Member Data Documentation


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