/*
 * Semestralny projekt,
 * Multiagentovy system JADE
 * subor: Zvedavec.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 jade.core.AID;

import java.util.Vector;
import java.lang.String;


/**Trieda implementje agenta Zvedavec */
public class Zvedavec extends Agent {
	/** metoda sluzi na inicializaciu agenta */
	protected void setup() {
		System.out.println("Hello World! I am " +getAID().getName());

		// pridame spravanie na zistenie stavu pocasia
		addBehaviour(new ZistenieStavuPocasia());

		// a zaistime nech je spravanie ZistenieStavuPocasia
		// spustene kazdych 60 sekund
		addBehaviour(new TickerBehaviour(this, 60000) {
			protected void onTick() {
				myAgent.addBehaviour(new ZistenieStavuPocasia());
			}
		} );
	}

	/** metoda sa vola pri ukoncovani zivotu agenta */
	protected void takeDown() {
		System.out.println(getAID().getName() + " terminated.");
	}

	/** trieda implentuje trojkrokove spravanie 
	 * zaistujuce zistovanie stavu pocasia */
	private class ZistenieStavuPocasia extends Behaviour {
		private int krok = 0;
		/** pocet najdenych meteorologov */
		private int mcnt;
		private int count = 0;
		private Vector v = new Vector();
		public void action() {
			switch(krok) {
				// v prvom kroku najdeme agentov meteorologov
				// a posleme im poziadavku na informaciu 
				// o stave pocasia
				case 0:
					DFAgentDescription template = new DFAgentDescription();
					ServiceDescription sd = new ServiceDescription();
					sd.setType("stav-pocasia");
					template.addServices(sd);
					try {   
						DFAgentDescription[] result = DFService.search(myAgent, template);
						ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
						if(result.length == 0) {
							System.out.println("Nenasiel som ziadneho meteorologa !");
							krok = 3;
							break;
						}
						for(int i = 0; i < result.length; i++) {
							msg.addReceiver(result[i].getName());
						}
						mcnt = result.length;
						// kedze obidva agenty su zjednodusene priklady pouzitia 
						// systemu JADE, tak budeme nastavovat len obsah spravy,
						// teda nenastavime komunikacny jazyk, ontologiu...
						msg.setContent("pocasie");
						send(msg);
					} catch(FIPAException fe) {
						fe.printStackTrace();
					}
					krok = 1;
					break;
				// v druhom kroku spracujeme odpovede, ktore prisli
				// a pridame ich do vectoru v
				case 1:
					ACLMessage msg = receive();
					if(msg != null) {
						if(msg.getPerformative() != ACLMessage.REFUSE) {
							v.add(msg.getContent());
						}
						count++;
					} else { // ak sme neprijali spravu
						 // tak zablokujeme spravanie 
						 // do prichodu dalsej spravy
						block();
					}
					if(mcnt == count ) {
						krok = 2;
					}
					break;
				// v tretom kroku do konzoly vypiseme 
				// informacie a aktualnom stave pocasia
				case 2:
					System.out.println("Aktualne pocasie (" + getAID().getName() + ")");
					//System.out.println(v.toString());
					String pom = "";
					for(int i = 0; i < v.size(); i++) {
						System.out.println(v.get(i));
						pom = pom + v.get(i);
					}
					System.out.println("-----------------");
					krok = 3;
			}
		}

		// ak sa skoncil treti krok
		// tak spravanie je ukoncene
		public boolean done() {
			return(krok == 3);
		}
	}
}


syntax highlighted by Code2HTML, v. 0.9.1