Package agents

Source Code of agents.ResourceAgent$ResourceBehaviour

package agents;

import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.OneShotBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import java.util.logging.Level;
import java.util.logging.Logger;
import vocabularies.NodeVocabulary;

/**
* ResourceAgent
*
* @author Smit, Edo
*/
public class ResourceAgent extends Agent implements NodeVocabulary {

    /**
     * The name of the service the resource provides
     */
    private String serviceName;

    @Override
    public void setup() {
        Object[] arguments = getArguments();
        // Check if an argument has been set
        if ((arguments != null) && (arguments.length == 1) && (arguments[0] instanceof String)) {
            String argument = (String) arguments[0];
            if (argument.equals("Add")) {
                serviceName = ResourceType.ADD.toString();
            } else if (argument.equals("Substract")) {
                serviceName = ResourceType.SUBSTRACT.toString();
            } else if (argument.equals("Multiply")) {
                serviceName = ResourceType.MULTIPLY.toString();;
            } else if (argument.equals("Divide")) {
                serviceName = ResourceType.DIVIDE.toString();;
            }
        }

        // Check if the service has been set
        if (serviceName == null) {
            serviceName = OPERATION_UNKNOWN;
        }

        Logger.getLogger(ResourceAgent.class.getName()).log(Level.SEVERE,
                "{0} running as {1}",
                new Object[]{getAID().getLocalName(), serviceName});


        DFAgentDescription dfd = new DFAgentDescription();
        dfd.setName(getAID());
        ServiceDescription sd = new ServiceDescription();

        sd.setType(RESOURCE_AGENT_TYPE);
        sd.setName(serviceName);
        dfd.addServices(sd);

        addBehaviour(new ResourceBehaviour());

        try {
            DFService.register(this, dfd);
        } catch (FIPAException fe) {
            Logger.getLogger(ResourceAgent.class.getName()).log(Level.SEVERE, null, fe);
        }
    }

    protected void takeDown() {
        try {
            DFService.deregister(this);
        } catch (Exception ex) {
            Logger.getLogger(NodeAgent.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     *
     */
    class DeleteBehaviour extends OneShotBehaviour {

        @Override
        public void action() {
            myAgent.doDelete();
        }
    } // End inner class DeleteBehaviour

    /**
     *
     */
    class ResourceBehaviour extends CyclicBehaviour {

        /**
         *
         */
        public ResourceBehaviour() {
        }

        /**
         *
         * @param a
         */
        public ResourceBehaviour(Agent a) {
            super(a);
        }

        @Override
        public void action() {
            ACLMessage message = myAgent.receive();
            if (message != null) {
                Logger.getLogger(NodeAgent.class.getName()).log(Level.INFO,
                        "{0} recieved message with performative {1}.",
                        new Object[]{myAgent.getLocalName(), ACLMessage.getPerformative(message.getPerformative())});
                switch (message.getPerformative()) {
                    case ACLMessage.CANCEL:
                        Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO, "{0} shutting down.", myAgent.getLocalName());
                        myAgent.doDelete();
                        break;
                    case ACLMessage.REQUEST:
                        // Send a response to the NodeAgent
                        int result = processRequest(message);
                        sendResponse(message, result);
                }
            } else {
                block();
            }
        }

        private int processRequest(ACLMessage message) {
            int result = 0;

            String[] values = message.getContent().split(";");
            int value1 = Integer.parseInt(values[0]);
            int value2 = Integer.parseInt(values[1]);

            switch (ResourceType.valueOf(serviceName)) {
                case ADD:
                    result = value1 + value2;
                    break;
                case SUBSTRACT:
                    result = value1 - value2;
                    break;
                case DIVIDE:
                    // Can not divide by zero
                    if (value2 == 0) {
                        result = value1 / 1;
                    } else {
                        result = value1 / value2;
                    }
                    break;
                case MULTIPLY:
                    result = value1 * value2;
                    break;
            }

            Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO,
                    "{0} not busy anymore.",
                    myAgent.getLocalName());

            return result;

        }

        /**
         * Sends a response to the NodeAgent
         *
         * @param message
         */
        private void sendResponse(ACLMessage message, int result) {
            ACLMessage response = message.createReply();
            response.setPerformative(ACLMessage.INFORM);
            response.setContent(Integer.toString(result));
            myAgent.send(response);
            Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO,
                    "{0} not busy anymore.",
                    myAgent.getLocalName());
        }
    } // End class NodeBehaviour

    public enum ResourceType {

        ADD(0), SUBSTRACT(1), DIVIDE(2), MULTIPLY(3);
        private int type;

        private ResourceType(int c) {
            type = c;
        }

        public int getType() {
            return type;
        }
    }
}
TOP

Related Classes of agents.ResourceAgent$ResourceBehaviour

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.