/*
 * Semestralny projekt,
 * Multiagentovy system JADE
 * subor: Meteorolog.java
 * autor: Patrik Bona <bona@intrak.sk>
 * 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 <code>String</code> 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();
			}
		}
	}
	
}




syntax highlighted by Code2HTML, v. 0.9.1