/* * Semestralny projekt, * Multiagentovy system JADE * subor: Meteorolog.java * autor: Patrik Bona * zadavatel: Ing. Marek Paralic, PhD. * sk. rok: 2003/2004 * posledna zmena: 12. 1. 2004 */ package pocasie; import jade.core.Agent; import jade.core.behaviours.*; import jade.lang.acl.ACLMessage; import jade.domain.FIPAException; import jade.domain.DFService; import jade.domain.FIPAAgentManagement.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.lang.String; /** Trieda implementuje agenta Meteorolog */ public class Meteorolog extends Agent { private GUI gui; private String mesto; /** Metoda sluzi na inicializaciu agenta */ protected void setup() { System.out.println("Hello, I am " +getAID().getName()); // kontrola zadanych argumentov Object[] args = getArguments(); if(args == null || args.length != 1) { System.out.println("Agent bol spusteny s nespravnymi argumentami !!!" + args.length); doDelete(); return; } mesto = (String) args[0]; // pridanie spravania starajuceho // sa o spracovanie sprav addBehaviour(new SpracovanieSprav()); // registracia u DF agenta (yellow pages sluzba) DFAgentDescription dfd = new DFAgentDescription(); dfd.setName(getAID()); ServiceDescription sd = new ServiceDescription(); sd.setType("stav-pocasia"); sd.setName("meteorologicky-stav-pocasia"); dfd.addServices(sd); try { DFService.register(this, dfd); } catch (FIPAException fe){ fe.printStackTrace(); } // zobrazenie grafickeho prostredia pre vstup udajov gui = new GUI(this); gui.show(); } /** Metoda sa vola pri ukoncovani zivotu agenta */ protected void takeDown() { // pokusime zrusit registraciu sluzieb // u DF agenta try { DFService.deregister(this); } catch (FIPAException fe) { // fe.printStackTrace(); } try { gui.dispose(); } catch (Exception e) { } System.out.println(getAID().getName() + " terminated."); } /** Trieda implementuje pouzivatelske prostredie * pre zadavanie stavu pocasia... */ private class GUI extends JFrame { private JTextField stupneField, komentarField; private Meteorolog myAgent; /** Metoda vrati String udavajuci stav pocasia */ public String getStav() { return mesto + "\t\t" + stupneField.getText() + " stupnov celzia \t(" + komentarField.getText() + ")"; } GUI(Meteorolog m) { super(mesto); myAgent = m; getContentPane().add(new JLabel(mesto),BorderLayout.NORTH); JPanel p = new JPanel(); p.setLayout(new GridLayout(2,2)); p.add(new JLabel("Pocet stupnov:")); stupneField = new JTextField(2); p.add(stupneField); p.add(new JLabel("Komentar:")); komentarField = new JTextField(20); p.add(komentarField); getContentPane().add(p,BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { myAgent.doDelete(); } } ); pack(); } } /** Trieda implementuje cyklicke spravanie, * ktore sluzi na spracovanie sprav */ private class SpracovanieSprav extends CyclicBehaviour { public void action() { ACLMessage msg = myAgent.receive(); if(msg != null) { // ak prisla sprava tak ju spracujeme //System.out.println(getAID().getName() + ": prijal som spravu od: " + msg.getSender().getName()); ACLMessage reply = msg.createReply(); // ak je obsha spravy retazec "pocasie" tak agent // odpovie na spravu a posle aktualny stav pocasia // inac odpovie spravou s performativou REFUSE if(msg.getContent().compareTo("pocasie") == 0) { reply.setPerformative(ACLMessage.INFORM); reply.setContent(gui.getStav()); } else { reply.setPerformative(ACLMessage.REFUSE); } send(reply); } else { // ak nie, tak pozastavime vykonavanie spravania // pokial nepride nejaka sprava block(); } } } }