bdi4jade

Organizing svn.

5/23/2010 11:37:09 AM

Changes

Details

diff --git a/bdi-jade-test/.classpath b/bdi-jade-test/.classpath
new file mode 100644
index 0000000..8f37b4a
--- /dev/null
+++ b/bdi-jade-test/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/bdi-jade"/>
+	<classpathentry kind="lib" path="/libs/commons-logging/log4j-1.2.15.jar"/>
+	<classpathentry kind="lib" path="/libs/jade/commons-codec-1.3.jar"/>
+	<classpathentry kind="lib" path="/libs/jade/http.jar"/>
+	<classpathentry kind="lib" path="/libs/jade/iiop.jar"/>
+	<classpathentry kind="lib" path="/libs/jade/jade.jar"/>
+	<classpathentry kind="lib" path="/libs/jade/jadeTools.jar"/>
+	<classpathentry kind="lib" path="/libs/commons-logging/commons-logging-1.0.4.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bdi-jade-test/.project b/bdi-jade-test/.project
new file mode 100644
index 0000000..c8a61fe
--- /dev/null
+++ b/bdi-jade-test/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bdi-jade-test/.settings/org.eclipse.jdt.core.prefs b/bdi-jade-test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..06e978e
--- /dev/null
+++ b/bdi-jade-test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Mon Jan 25 22:46:55 EST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/bdi-jade-test/APDescription.txt b/bdi-jade-test/APDescription.txt
new file mode 100644
index 0000000..5bd441d
--- /dev/null
+++ b/bdi-jade-test/APDescription.txt
@@ -0,0 +1 @@
+( ap-description  :name "ingridnunes:1099/JADE" :ap-services (set ( ap-service  :name fipa.mts.mtp.http.std :type fipa.mts.mtp.http.std :addresses (sequence http://10.10.10.194:7778/acc))))
diff --git a/bdi-jade-test/MTPs-Main-Container.txt b/bdi-jade-test/MTPs-Main-Container.txt
new file mode 100644
index 0000000..fdd56c1
--- /dev/null
+++ b/bdi-jade-test/MTPs-Main-Container.txt
@@ -0,0 +1 @@
+http://10.10.10.194:7778/acc
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/AgentStarter.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/AgentStarter.java
new file mode 100644
index 0000000..f99b559
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/AgentStarter.java
@@ -0,0 +1,71 @@
+package br.pucrio.inf.les.bdijade.examples;
+
+import jade.BootProfileImpl;
+import jade.core.Agent;
+import jade.core.ProfileImpl;
+import jade.wrapper.AgentContainer;
+import jade.wrapper.AgentController;
+import jade.wrapper.PlatformController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/*
+ * Created on 29/01/2010 11:18:23 
+ */
+
+/**
+ * @author ingrid
+ * 
+ */
+public class AgentStarter {
+
+	private static final Map<String, Agent> agents;
+
+	static {
+		agents = new HashMap<String, Agent>();
+		agents.put(BDIAgent1.MY_NAME, new BDIAgent1());
+//		agents.put(BDIAgent2.MY_NAME, new BDIAgent2());
+	};
+
+	public static void main(String[] args) {
+		new AgentStarter();
+	}
+
+	private ProfileImpl bootProfile;
+	private final Log log;
+
+	private jade.core.Runtime runtime;
+
+	public AgentStarter() {
+		log = LogFactory.getLog(this.getClass());
+
+		List<String> params = new ArrayList<String>();
+		params.add("-gui");
+		params.add("-detect-main:false");
+
+		log.info("Plataform parameters: " + params);
+
+		this.bootProfile = new BootProfileImpl(params.toArray(new String[0]));
+
+		this.runtime = jade.core.Runtime.instance();
+		PlatformController controller = runtime
+				.createMainContainer(bootProfile);
+
+		for (String agentName : agents.keySet()) {
+			try {
+				AgentController ac = ((AgentContainer) controller)
+						.acceptNewAgent(agentName, agents.get(agentName));
+				ac.start();
+			} catch (Exception e) {
+				log.error(e);
+			}
+		}
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent1.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent1.java
new file mode 100644
index 0000000..dfa6608
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent1.java
@@ -0,0 +1,33 @@
+/*
+ * Created on 31/01/2010 11:30:45 
+ */
+package br.pucrio.inf.les.bdijade.examples;
+
+import br.pucrio.inf.les.bdijade.core.BDIAgent;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.BlocksWorldCapability;
+import br.pucrio.inf.les.bdijade.examples.compositegoal.CompositeGoalCapability;
+import br.pucrio.inf.les.bdijade.examples.ping.PingPongCapability;
+import br.pucrio.inf.les.bdijade.examples.planfailed.PlanFailedCapability;
+import br.pucrio.inf.les.bdijade.examples.subgoal.SubgoalCapability;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class BDIAgent1 extends BDIAgent {
+
+	private static final long serialVersionUID = -8505187840524213951L;
+	public static final String MY_NAME = "AGENT_1";
+
+	@Override
+	protected void init() {
+//		this.addCapability(new BlocksWorldCapability());
+//		this.addCapability(new PlanFailedCapability());
+//		this.addCapability(new SubgoalCapability());
+//		this.addCapability(new PingPongCapability(BDIAgent1.MY_NAME,
+//				BDIAgent2.MY_NAME));
+	//	this.addCapability(new CompositeGoalCapability(true));
+		this.addCapability(new CompositeGoalCapability(false));
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent2.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent2.java
new file mode 100644
index 0000000..5b2ca0b
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/BDIAgent2.java
@@ -0,0 +1,24 @@
+/*
+ * Created on 31/01/2010 15:49:17 
+ */
+package br.pucrio.inf.les.bdijade.examples;
+
+import br.pucrio.inf.les.bdijade.core.BDIAgent;
+import br.pucrio.inf.les.bdijade.examples.ping.PingPongCapability;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class BDIAgent2 extends BDIAgent {
+
+	private static final long serialVersionUID = -8505187840524213951L;
+	public static final String MY_NAME = "AGENT_2";
+
+	@Override
+	protected void init() {
+		this.addCapability(new PingPongCapability(BDIAgent2.MY_NAME,
+				BDIAgent1.MY_NAME));
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/BlocksWorldCapability.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/BlocksWorldCapability.java
new file mode 100644
index 0000000..c649a87
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/BlocksWorldCapability.java
@@ -0,0 +1,140 @@
+/*
+ * Created on 26/01/2010 16:40:28 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.belief.Belief;
+import br.pucrio.inf.les.bdijade.belief.BeliefSet;
+import br.pucrio.inf.les.bdijade.belief.TransientBeliefSet;
+import br.pucrio.inf.les.bdijade.core.BeliefBase;
+import br.pucrio.inf.les.bdijade.core.Capability;
+import br.pucrio.inf.les.bdijade.core.PlanLibrary;
+import br.pucrio.inf.les.bdijade.event.GoalEvent;
+import br.pucrio.inf.les.bdijade.event.GoalListener;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Clear;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Thing;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.goal.AchieveBlocksStacked;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.goal.PerformMove;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.plan.AchieveOnPlanBody;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.plan.ClearPlanBody;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.plan.PerformMovePlanBody;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.plan.TopLevelPlanBody;
+import br.pucrio.inf.les.bdijade.goal.Goal;
+import br.pucrio.inf.les.bdijade.plan.Plan;
+import br.pucrio.inf.les.bdijade.util.goal.BeliefSetValueGoal;
+import br.pucrio.inf.les.bdijade.util.plan.SimplePlan;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class BlocksWorldCapability extends Capability implements GoalListener {
+
+	public static final String BELIEF_CLEAR = "clear";
+	public static final String BELIEF_ON = "on";
+
+	private static final Log log = LogFactory
+			.getLog(BlocksWorldCapability.class);
+	private static final long serialVersionUID = -4800805796961540570L;
+
+	private static final On[] target = { new On(Thing.BLOCK_9, Thing.TABLE),
+			new On(Thing.BLOCK_8, Thing.BLOCK_9),
+			new On(Thing.BLOCK_7, Thing.BLOCK_8),
+			new On(Thing.BLOCK_6, Thing.BLOCK_7),
+			new On(Thing.BLOCK_5, Thing.BLOCK_6),
+			new On(Thing.BLOCK_4, Thing.BLOCK_5),
+			new On(Thing.BLOCK_3, Thing.BLOCK_4),
+			new On(Thing.BLOCK_2, Thing.BLOCK_3),
+			new On(Thing.BLOCK_1, Thing.BLOCK_2) };
+
+	private static Set<Belief<?>> getBeliefs() {
+		Set<Belief<?>> beliefs = new HashSet<Belief<?>>();
+
+		BeliefSet<On> on = new TransientBeliefSet<On>(BELIEF_ON);
+		on.addValue(new On(Thing.BLOCK_5, Thing.TABLE));
+		on.addValue(new On(Thing.BLOCK_2, Thing.BLOCK_5));
+		on.addValue(new On(Thing.BLOCK_7, Thing.BLOCK_2));
+		on.addValue(new On(Thing.BLOCK_1, Thing.BLOCK_7));
+		on.addValue(new On(Thing.BLOCK_8, Thing.BLOCK_1));
+		on.addValue(new On(Thing.BLOCK_4, Thing.BLOCK_8));
+		on.addValue(new On(Thing.BLOCK_3, Thing.BLOCK_4));
+		on.addValue(new On(Thing.BLOCK_6, Thing.BLOCK_3));
+		on.addValue(new On(Thing.BLOCK_9, Thing.BLOCK_6));
+		beliefs.add(on);
+
+		BeliefSet<Clear> clear = new TransientBeliefSet<Clear>(BELIEF_CLEAR);
+		clear.addValue(new Clear(Thing.BLOCK_9));
+		clear.addValue(new Clear(Thing.TABLE));
+		beliefs.add(clear);
+
+		return beliefs;
+	}
+
+	private static Set<Plan> getPlans() {
+		Set<Plan> plans = new HashSet<Plan>();
+
+		plans.add(new SimplePlan(BeliefSetValueGoal.class,
+				AchieveOnPlanBody.class) {
+			@Override
+			protected boolean matchesContext(Goal goal) {
+				return BlocksWorldCapability.BELIEF_ON
+						.equals(((BeliefSetValueGoal<?>) goal)
+								.getBeliefSetName());
+			}
+		});
+		plans
+				.add(new SimplePlan(BeliefSetValueGoal.class,
+						ClearPlanBody.class) {
+					@Override
+					protected boolean matchesContext(Goal goal) {
+						return BlocksWorldCapability.BELIEF_CLEAR
+								.equals(((BeliefSetValueGoal<?>) goal)
+										.getBeliefSetName());
+					}
+				});
+		plans.add(new SimplePlan(PerformMove.class, PerformMovePlanBody.class) {
+			@Override
+			@SuppressWarnings("unchecked")
+			protected boolean matchesContext(Goal goal) {
+				if (goal instanceof PerformMove) {
+					PerformMove performMove = (PerformMove) goal;
+					BeliefSet<Clear> set = (BeliefSet<Clear>) getPlanLibrary()
+							.getCapability().getBeliefBase().getBelief(
+									BlocksWorldCapability.BELIEF_CLEAR);
+					return set.hasValue(new Clear(performMove.getThing1()))
+							&& set.hasValue(new Clear(performMove.getThing2()));
+				}
+				return false;
+			}
+		});
+		plans.add(new SimplePlan(AchieveBlocksStacked.class,
+				TopLevelPlanBody.class));
+
+		return plans;
+	}
+
+	public BlocksWorldCapability() {
+		super(new BeliefBase(getBeliefs()), new PlanLibrary(getPlans()));
+	}
+
+	@Override
+	public void goalPerformed(GoalEvent event) {
+		if (event.getGoal() instanceof AchieveBlocksStacked) {
+			log.info("Goal achieved!! Removing capability of this agent...");
+			myAgent.removeCapability(this);
+		}
+	}
+
+	@Override
+	protected void setup() {
+		myAgent.addGoal(new AchieveBlocksStacked(target), this);
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Block.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Block.java
new file mode 100644
index 0000000..c7799b6
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Block.java
@@ -0,0 +1,41 @@
+/*
+ * Created on 27/01/2010 16:21:43 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.domain;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class Block implements Thing {
+
+	private int id;
+
+	public Block(int id) {
+		this.id = id;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof Block) {
+			Block b = (Block) obj;
+			return this.id == b.id;
+		}
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		return new Integer(id).hashCode();
+	}
+
+	@Override
+	public String toString() {
+		return "Block#" + id;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Clear.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Clear.java
new file mode 100644
index 0000000..9389f57
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Clear.java
@@ -0,0 +1,45 @@
+package br.pucrio.inf.les.bdijade.examples.blocksworld.domain;
+
+/*
+ * Created on 26/01/2010 10:16:20 
+ */
+
+/**
+ * @author ingrid
+ * 
+ */
+public class Clear {
+
+	private Thing thing;
+
+	public Clear(Thing thing) {
+		this.thing = thing;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof Clear) {
+			Clear other = (Clear) obj;
+			return this.thing.equals(other.thing);
+		} else {
+			return false;
+		}
+	}
+
+	public Thing getThing() {
+		return thing;
+	}
+
+	@Override
+	public int hashCode() {
+		return thing.hashCode();
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer("CLEAR");
+		sb.append("_").append(thing);
+		return sb.toString();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/On.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/On.java
new file mode 100644
index 0000000..435b235
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/On.java
@@ -0,0 +1,53 @@
+package br.pucrio.inf.les.bdijade.examples.blocksworld.domain;
+
+/*
+ * Created on 26/01/2010 10:08:37 
+ */
+
+/**
+ * @author ingrid
+ * 
+ */
+public class On {
+
+	private Thing thing1;
+	private Thing thing2;
+
+	public On(Thing thing1, Thing thing2) {
+		this.thing1 = thing1;
+		this.thing2 = thing2;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof On) {
+			On other = (On) obj;
+			return this.thing1.equals(other.thing1)
+					&& this.thing2.equals(other.thing2);
+		} else {
+			return false;
+		}
+	}
+
+	public Thing getThing1() {
+		return thing1;
+	}
+
+	public Thing getThing2() {
+		return thing2;
+	}
+
+	@Override
+	public int hashCode() {
+		return (int) Math.pow(thing1.hashCode(), thing2.hashCode());
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer("ON");
+		sb.append("_").append(thing1);
+		sb.append("_").append(thing2);
+		return sb.toString();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Table.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Table.java
new file mode 100644
index 0000000..3e33114
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Table.java
@@ -0,0 +1,29 @@
+/*
+ * Created on 27/01/2010 16:23:23 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.domain;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class Table implements Thing {
+
+	public Table() {
+
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof Table) {
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	public String toString() {
+		return "Table";
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Thing.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Thing.java
new file mode 100644
index 0000000..6a4e7f7
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/domain/Thing.java
@@ -0,0 +1,26 @@
+package br.pucrio.inf.les.bdijade.examples.blocksworld.domain;
+
+/*
+ * Created on 26/01/2010 10:09:12 
+ */
+
+/**
+ * @author ingrid
+ * 
+ */
+public interface Thing {
+
+	public static final Table TABLE = new Table();
+	public static final Block BLOCK_1 = new Block(1);
+	public static final Block BLOCK_2 = new Block(2);
+	public static final Block BLOCK_3 = new Block(3);
+	public static final Block BLOCK_4 = new Block(4);
+	public static final Block BLOCK_5 = new Block(5);
+	public static final Block BLOCK_6 = new Block(6);
+	public static final Block BLOCK_7 = new Block(7);
+	public static final Block BLOCK_8 = new Block(8);
+	public static final Block BLOCK_9 = new Block(9);
+	public static final Thing[] THINGS = { TABLE, BLOCK_1, BLOCK_2, BLOCK_3,
+			BLOCK_4, BLOCK_5, BLOCK_6, BLOCK_7, BLOCK_8, BLOCK_9 };
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/AchieveBlocksStacked.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/AchieveBlocksStacked.java
new file mode 100644
index 0000000..e7497ba
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/AchieveBlocksStacked.java
@@ -0,0 +1,37 @@
+package br.pucrio.inf.les.bdijade.examples.blocksworld.goal;
+
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.goal.Goal;
+
+/*
+ * Created on 26/01/2010 10:55:09 
+ */
+
+/**
+ * @author ingrid
+ * 
+ */
+public class AchieveBlocksStacked implements Goal {
+
+	private static final long serialVersionUID = -8126833927953226126L;
+
+	private On[] target;
+
+	public AchieveBlocksStacked(On[] target) {
+		this.target = target;
+	}
+
+	public On[] getTarget() {
+		return target;
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer("AchieveBlocksStacked: ");
+		for (On on : target) {
+			sb.append(on).append(" ");
+		}
+		return sb.toString();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/PerformMove.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/PerformMove.java
new file mode 100644
index 0000000..c4a4d02
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/goal/PerformMove.java
@@ -0,0 +1,38 @@
+/*
+ * Created on 26/01/2010 11:02:03 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.goal;
+
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Thing;
+import br.pucrio.inf.les.bdijade.goal.Goal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PerformMove implements Goal {
+
+	private static final long serialVersionUID = 8286023371969088149L;
+
+	private Thing thing1;
+	private Thing thing2;
+
+	public PerformMove(Thing thing1, Thing thing2) {
+		this.thing1 = thing1;
+		this.thing2 = thing2;
+	}
+
+	public Thing getThing1() {
+		return thing1;
+	}
+
+	public Thing getThing2() {
+		return thing2;
+	}
+
+	@Override
+	public String toString() {
+		return "PerformMove: " + thing1 + " to " + thing2;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/AchieveOnPlanBody.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/AchieveOnPlanBody.java
new file mode 100644
index 0000000..61161cc
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/AchieveOnPlanBody.java
@@ -0,0 +1,92 @@
+/*
+ * Created on 26/01/2010 21:17:50 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.plan;
+
+import jade.core.behaviours.Behaviour;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.BlocksWorldCapability;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Clear;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Thing;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.goal.PerformMove;
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+import br.pucrio.inf.les.bdijade.util.goal.BeliefSetValueGoal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class AchieveOnPlanBody extends Behaviour implements PlanBody {
+	private static final long serialVersionUID = -5919677537834351951L;
+
+	private int counter;
+	private PlanInstance planInstance;
+	private Thing thing1;
+	private Thing thing2;
+
+	public AchieveOnPlanBody() {
+		this.counter = 0;
+	}
+
+	@Override
+	public void action() {
+		switch (counter) {
+		case 0:
+			if (new BeliefSetValueGoal<On>(BlocksWorldCapability.BELIEF_ON,
+					new On(thing1, thing2)).isAchieved(planInstance
+					.getBeliefBase())) {
+				counter = 6;
+			} else {
+				counter = checkClearAndDispatch(thing1) ? 1 : 2;
+			}
+			break;
+		case 2:
+			counter = checkClearAndDispatch(thing2) ? 3 : 4;
+			break;
+		case 4:
+			planInstance.dispatchSubgoalAndListen(new PerformMove(thing1,
+					thing2));
+			counter = 5;
+		case 1:
+		case 3:
+		case 5:
+			if (planInstance.getGoalEvent() != null)
+				counter++;
+			break;
+		}
+	}
+
+	private boolean checkClearAndDispatch(Thing thing) {
+		BeliefSetValueGoal<Clear> clearBelief = new BeliefSetValueGoal<Clear>(
+				BlocksWorldCapability.BELIEF_CLEAR, new Clear(thing1));
+		if (!clearBelief.isAchieved(planInstance.getBeliefBase())) {
+			planInstance.dispatchSubgoalAndListen(clearBelief);
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public boolean done() {
+		return counter == 6;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return (counter == 6) ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+		BeliefSetValueGoal<On> achieveOn = (BeliefSetValueGoal<On>) planInstance
+				.getGoal();
+		this.thing1 = achieveOn.getValue().getThing1();
+		this.thing2 = achieveOn.getValue().getThing2();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/ClearPlanBody.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/ClearPlanBody.java
new file mode 100644
index 0000000..2d1d54e
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/ClearPlanBody.java
@@ -0,0 +1,86 @@
+/*
+ * Created on 26/01/2010 21:18:32 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.plan;
+
+import jade.core.behaviours.Behaviour;
+import br.pucrio.inf.les.bdijade.belief.BeliefSet;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.BlocksWorldCapability;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Clear;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Thing;
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+import br.pucrio.inf.les.bdijade.util.goal.BeliefSetValueGoal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class ClearPlanBody extends Behaviour implements PlanBody {
+	private static final long serialVersionUID = -5919677537834351951L;
+
+	private boolean done;
+	private int index;
+	private Thing thing;
+	private PlanInstance planInstance;
+	private On on;
+	private boolean waiting;
+	private BeliefSet<On> onSet;
+
+	public ClearPlanBody() {
+		this.done = false;
+		this.waiting = false;
+		this.index = 0;
+	}
+
+	@Override
+	public void action() {
+		if (!waiting) {
+			for (; index < Thing.THINGS.length; index++) {
+				Thing t = Thing.THINGS[index];
+				on = new On(t, thing);
+				if (onSet.hasValue(on)) {
+					planInstance
+							.dispatchSubgoalAndListen(new BeliefSetValueGoal<On>(
+									BlocksWorldCapability.BELIEF_ON, new On(t,
+											Thing.TABLE)));
+					waiting = true;
+					break;
+				}
+			}
+		} else if (planInstance.getGoalEvent() != null) {
+			onSet.remove(on);
+			on = null;
+			waiting = false;
+			index++;
+		}
+
+		if (index >= Thing.THINGS.length) {
+			done = true;
+		}
+	}
+
+	@Override
+	public boolean done() {
+		return done;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return done ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public void init(PlanInstance planInstance) {
+		this.onSet = (BeliefSet<On>) planInstance.getBeliefBase().getBelief(
+				BlocksWorldCapability.BELIEF_ON);
+		this.planInstance = planInstance;
+		BeliefSetValueGoal<Clear> achieveClear = (BeliefSetValueGoal<Clear>) planInstance
+				.getGoal();
+		this.thing = achieveClear.getValue().getThing();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/PerformMovePlanBody.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/PerformMovePlanBody.java
new file mode 100644
index 0000000..a43ba4b
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/PerformMovePlanBody.java
@@ -0,0 +1,77 @@
+/*
+ * Created on 26/01/2010 21:19:08 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.plan;
+
+import jade.core.behaviours.Behaviour;
+import br.pucrio.inf.les.bdijade.belief.BeliefSet;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.BlocksWorldCapability;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Clear;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.Thing;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.goal.PerformMove;
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PerformMovePlanBody extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -5919677537834351951L;
+
+	private BeliefSet<Clear> clearSet;
+	private boolean done;
+	private BeliefSet<On> onSet;
+	private Thing thing1;
+	private Thing thing2;
+
+	public PerformMovePlanBody() {
+		this.done = false;
+	}
+
+	@Override
+	public void action() {
+		if (!thing2.equals(Thing.TABLE)) {
+			clearSet.remove(new Clear(thing2));
+		}
+
+		for (Thing thing : Thing.THINGS) {
+			On on = new On(thing1, thing);
+			if (onSet.hasValue(on)) {
+				onSet.remove(on);
+				if (!Thing.TABLE.equals(thing)) {
+					clearSet.addValue(new Clear(thing));
+				}
+			}
+		}
+
+		onSet.addValue(new On(thing1, thing2));
+		this.done = true;
+	}
+
+	@Override
+	public boolean done() {
+		return done;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return done ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public void init(PlanInstance planInstance) {
+		this.onSet = (BeliefSet<On>) planInstance.getBeliefBase().getBelief(
+				BlocksWorldCapability.BELIEF_ON);
+		this.clearSet = (BeliefSet<Clear>) planInstance.getBeliefBase()
+				.getBelief(BlocksWorldCapability.BELIEF_CLEAR);
+		PerformMove goal = (PerformMove) planInstance.getGoal();
+		this.thing1 = goal.getThing1();
+		this.thing2 = goal.getThing2();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/TopLevelPlanBody.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/TopLevelPlanBody.java
new file mode 100644
index 0000000..c4753ec
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/blocksworld/plan/TopLevelPlanBody.java
@@ -0,0 +1,81 @@
+/*
+ * Created on 26/01/2010 21:19:50 
+ */
+package br.pucrio.inf.les.bdijade.examples.blocksworld.plan;
+
+import jade.core.behaviours.Behaviour;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.examples.blocksworld.BlocksWorldCapability;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.domain.On;
+import br.pucrio.inf.les.bdijade.examples.blocksworld.goal.AchieveBlocksStacked;
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+import br.pucrio.inf.les.bdijade.util.goal.BeliefSetValueGoal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class TopLevelPlanBody extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -5919677537834351951L;
+
+	private int counter;
+	private Log log;
+	private PlanInstance planInstance;
+	private On[] target;
+
+	public TopLevelPlanBody() {
+		this.counter = 0;
+		this.log = LogFactory.getLog(this.getClass());
+	}
+
+	@Override
+	public void action() {
+		if (counter != 0) {
+			if ((planInstance.getGoalEvent() == null)) {
+				return;
+			}
+		}
+		if (counter != target.length) {
+			planInstance.dispatchSubgoalAndListen(new BeliefSetValueGoal<On>(
+					BlocksWorldCapability.BELIEF_ON, target[counter]));
+		}
+		counter++;
+	}
+
+	@Override
+	public boolean done() {
+		return counter > target.length;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return (counter > target.length) ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+		this.target = ((AchieveBlocksStacked) planInstance.getGoal())
+				.getTarget();
+	}
+
+	@Override
+	public int onEnd() {
+		log.info("World Model at end is:");
+		log.info(planInstance.getBeliefBase());
+		return super.onEnd();
+	}
+
+	@Override
+	public void onStart() {
+		log.info("World Model at start is:");
+		log.info(planInstance.getBeliefBase());
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/CompositeGoalCapability.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/CompositeGoalCapability.java
new file mode 100644
index 0000000..db9f724
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/CompositeGoalCapability.java
@@ -0,0 +1,88 @@
+/*
+ * Created on 04/02/2010 22:19:42 
+ */
+package br.pucrio.inf.les.bdijade.examples.compositegoal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.core.BeliefBase;
+import br.pucrio.inf.les.bdijade.core.Capability;
+import br.pucrio.inf.les.bdijade.core.PlanLibrary;
+import br.pucrio.inf.les.bdijade.event.GoalEvent;
+import br.pucrio.inf.les.bdijade.event.GoalFinishedEvent;
+import br.pucrio.inf.les.bdijade.event.GoalListener;
+import br.pucrio.inf.les.bdijade.goal.Goal;
+import br.pucrio.inf.les.bdijade.plan.Plan;
+import br.pucrio.inf.les.bdijade.util.goal.CompositeGoal;
+import br.pucrio.inf.les.bdijade.util.goal.ParallelGoal;
+import br.pucrio.inf.les.bdijade.util.goal.SequentialGoal;
+import br.pucrio.inf.les.bdijade.util.plan.SimplePlan;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class CompositeGoalCapability extends Capability implements GoalListener {
+
+	class MyGoal1 implements Goal {
+		private static final long serialVersionUID = 3405041038738876061L;
+	};
+
+	class MyGoal2 implements Goal {
+		private static final long serialVersionUID = 3405041038738876061L;
+	};
+
+	class MyGoal3 implements Goal {
+		private static final long serialVersionUID = 3405041038738876061L;
+	};
+
+	private static final Log log = LogFactory
+			.getLog(CompositeGoalCapability.class);
+	private static final long serialVersionUID = -4800805796961540570L;
+
+	private static Set<Plan> getPlans() {
+		Set<Plan> plans = new HashSet<Plan>();
+		SimplePlan plan = new SimplePlan(MyPlan.class);
+		plan.addGoal(MyGoal1.class);
+		plan.addGoal(MyGoal2.class);
+		plan.addGoal(MyGoal3.class);
+		plans.add(plan);
+		return plans;
+	}
+
+	private boolean sequential;
+
+	public CompositeGoalCapability(boolean sequential) {
+		super(new BeliefBase(), new PlanLibrary(getPlans()));
+		this.sequential = sequential;
+	}
+
+	@Override
+	public void goalPerformed(GoalEvent event) {
+		if (event instanceof GoalFinishedEvent
+				&& event.getGoal() instanceof CompositeGoal) {
+			log.info(event.getGoal() + " Status: "
+					+ ((GoalFinishedEvent) event).getStatus());
+			log.info("Goal finished!! Removing capability of this agent...");
+			myAgent.removeCapability(this);
+
+		}
+	}
+
+	@Override
+	protected void setup() {
+		Goal[] goals = { new MyGoal1(), new MyGoal2(), new MyGoal3() };
+		CompositeGoal compositeGoal = null;
+		if (this.sequential) {
+			compositeGoal = new SequentialGoal(goals);
+		} else {
+			compositeGoal = new ParallelGoal(goals);
+		}
+		this.myAgent.addGoal(compositeGoal, this);
+	}
+
+}
\ No newline at end of file
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/MyPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/MyPlan.java
new file mode 100644
index 0000000..52043f9
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/compositegoal/MyPlan.java
@@ -0,0 +1,48 @@
+/*
+ * Created on 04/02/2010 22:21:30 
+ */
+package br.pucrio.inf.les.bdijade.examples.compositegoal;
+
+import jade.core.behaviours.Behaviour;
+
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ *
+ */
+public class MyPlan extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -220345270457161508L;
+	
+	private EndState endState = null;
+	private PlanInstance planInstance;
+	private Log log = LogFactory.getLog(this.getClass());
+
+	public void action() {
+		long random = new Random().nextLong();
+		log.info("Random: " + random);
+		endState = (random % 3 != 0) ? EndState.SUCCESSFUL : EndState.FAILED;
+		log.info(planInstance.getGoal() + " Plan#"
+				+ planInstance.getPlan().getId() + " EndState: " + endState);
+	}
+
+	public boolean done() {
+		return true;
+	}
+
+	public EndState getEndState() {
+		return endState;
+	}
+
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+	}
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/Ping.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/Ping.java
new file mode 100644
index 0000000..fe144c7
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/Ping.java
@@ -0,0 +1,26 @@
+/*
+ * Created on 29/01/2010 00:36:05 
+ */
+package br.pucrio.inf.les.bdijade.examples.ping;
+
+import br.pucrio.inf.les.bdijade.goal.Goal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class Ping implements Goal {
+
+	private static final long serialVersionUID = -7733145369836002329L;
+
+	private String agent;
+
+	public Ping(String agent) {
+		this.agent = agent;
+	}
+
+	public String getAgent() {
+		return agent;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPlan.java
new file mode 100644
index 0000000..f91932a
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPlan.java
@@ -0,0 +1,87 @@
+/*
+ * Created on 29/01/2010 00:37:31 
+ */
+package br.pucrio.inf.les.bdijade.examples.ping;
+
+import jade.core.AID;
+import jade.core.behaviours.Behaviour;
+import jade.lang.acl.ACLMessage;
+import jade.lang.acl.MessageTemplate;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PingPlan extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -6288758975856575305L;
+
+	private String agent;
+	private boolean done;
+	private Log log;
+	private MessageTemplate mt;
+	private boolean sent;
+	private int times;
+	private int counter;
+
+	@Override
+	public void action() {
+		if (!sent) {
+			ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
+			msg.setContent(PingPongCapability.PING);
+			msg.addReceiver(new AID(agent, false));
+			msg.setConversationId("cin" + System.currentTimeMillis());
+			msg.setReplyWith("inform" + System.currentTimeMillis());
+			myAgent.send(msg);
+			this.mt = MessageTemplate.and(MessageTemplate
+					.MatchConversationId(msg.getConversationId()),
+					MessageTemplate.MatchInReplyTo(msg.getReplyWith()));
+			this.sent = true;
+			log.info("Ping sent to agent " + agent + "!");
+		} else {
+			ACLMessage reply = myAgent.receive(mt);
+			if (reply != null) {
+				log.info("Pong received from " + reply.getSender().getName()
+						+ "!");
+				log.info("Content: " + reply.getContent());
+				counter++;
+				if (counter == times) {
+					this.done = true;
+				} else {
+					this.sent = false;
+				}
+			} else {
+				block();
+			}
+		}
+	}
+
+	@Override
+	public boolean done() {
+		return done;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return done ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.log = LogFactory.getLog(this.getClass());
+		Ping ping = (Ping) planInstance.getGoal();
+		this.agent = ping.getAgent();
+		this.sent = false;
+		this.done = false;
+		this.counter = 0;
+		this.times = 1;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPongCapability.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPongCapability.java
new file mode 100644
index 0000000..1f02be7
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PingPongCapability.java
@@ -0,0 +1,48 @@
+/*
+ * Created on 29/01/2010 00:35:39 
+ */
+package br.pucrio.inf.les.bdijade.examples.ping;
+
+import jade.lang.acl.MessageTemplate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import br.pucrio.inf.les.bdijade.core.BeliefBase;
+import br.pucrio.inf.les.bdijade.core.Capability;
+import br.pucrio.inf.les.bdijade.core.PlanLibrary;
+import br.pucrio.inf.les.bdijade.plan.Plan;
+import br.pucrio.inf.les.bdijade.util.plan.SimplePlan;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PingPongCapability extends Capability {
+
+	public static final String PING = "ping";
+	public static final String PONG = "pong";
+
+	private static final long serialVersionUID = -4800805796961540570L;
+
+	private static Set<Plan> getPlans() {
+		Set<Plan> plans = new HashSet<Plan>();
+		plans.add(new SimplePlan(Ping.class, PingPlan.class));
+		plans.add(new SimplePlan(MessageTemplate.MatchContent(PING),
+				PongPlan.class));
+		return plans;
+	}
+
+	private String otherAgent;
+
+	public PingPongCapability(String id, String otherAgent) {
+		super(id, new BeliefBase(), new PlanLibrary(getPlans()));
+		this.otherAgent = otherAgent;
+	}
+
+	@Override
+	protected void setup() {
+		myAgent.addGoal(new Ping(otherAgent));
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PongPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PongPlan.java
new file mode 100644
index 0000000..756c6a8
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/ping/PongPlan.java
@@ -0,0 +1,50 @@
+/*
+ * Created on 29/01/2010 00:42:42 
+ */
+package br.pucrio.inf.les.bdijade.examples.ping;
+
+import jade.core.behaviours.OneShotBehaviour;
+import jade.lang.acl.ACLMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.message.MessageGoal;
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PongPlan extends OneShotBehaviour implements PlanBody {
+
+	private static final long serialVersionUID = -3352874506241004611L;
+	
+	private Log log;
+	private ACLMessage pingMsg;
+
+	@Override
+	public void action() {
+		log.info("Ping received from agent " + pingMsg.getSender().getName()
+				+ "!");
+		ACLMessage reply = pingMsg.createReply();
+		reply.setContent(PingPongCapability.PONG);
+		this.myAgent.send(reply);
+		log.info("Pong sent to agent" + pingMsg.getSender().getName() + "!");
+	}
+
+	@Override
+	public EndState getEndState() {
+		return EndState.SUCCESSFUL;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.log = LogFactory.getLog(this.getClass());
+		MessageGoal goal = (MessageGoal) planInstance.getGoal();
+		pingMsg = goal.getMessage();
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/MyPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/MyPlan.java
new file mode 100644
index 0000000..28d8dc1
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/MyPlan.java
@@ -0,0 +1,48 @@
+/*
+ * Created on 28/01/2010 00:22:16 
+ */
+package br.pucrio.inf.les.bdijade.examples.planfailed;
+
+import jade.core.behaviours.Behaviour;
+
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class MyPlan extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -220345270457161508L;
+	
+	private EndState endState = null;
+	private PlanInstance planInstance;
+	private Log log = LogFactory.getLog(this.getClass());
+
+	public void action() {
+		long random = new Random().nextLong();
+		log.info("Random: " + random);
+		endState = (random % 3 == 0) ? EndState.SUCCESSFUL : EndState.FAILED;
+		log.info(planInstance.getGoal() + " Plan#"
+				+ planInstance.getPlan().getId() + " EndState: " + endState);
+	}
+
+	public boolean done() {
+		return true;
+	}
+
+	public EndState getEndState() {
+		return endState;
+	}
+
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+	}
+}
\ No newline at end of file
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/PlanFailedCapability.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/PlanFailedCapability.java
new file mode 100644
index 0000000..0635395
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/planfailed/PlanFailedCapability.java
@@ -0,0 +1,84 @@
+/*
+ * Created on 28/01/2010 00:09:12 
+ */
+package br.pucrio.inf.les.bdijade.examples.planfailed;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.core.BeliefBase;
+import br.pucrio.inf.les.bdijade.core.Capability;
+import br.pucrio.inf.les.bdijade.core.PlanLibrary;
+import br.pucrio.inf.les.bdijade.event.GoalEvent;
+import br.pucrio.inf.les.bdijade.event.GoalFinishedEvent;
+import br.pucrio.inf.les.bdijade.event.GoalListener;
+import br.pucrio.inf.les.bdijade.goal.Goal;
+import br.pucrio.inf.les.bdijade.plan.Plan;
+import br.pucrio.inf.les.bdijade.util.plan.SimplePlan;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class PlanFailedCapability extends Capability implements GoalListener {
+
+	class MyGoal implements Goal {
+		private static final long serialVersionUID = 3405041038738876061L;
+
+		private int id;
+
+		public MyGoal(int id) {
+			this.id = id;
+		}
+
+		public String toString() {
+			return "Goal: " + id;
+		}
+	};
+
+	private static final int GOALS = 10;
+	private static final Log log = LogFactory
+			.getLog(PlanFailedCapability.class);
+	private static final long serialVersionUID = -4800805796961540570L;
+
+	private static Set<Plan> getPlans() {
+		Set<Plan> plans = new HashSet<Plan>();
+		plans.add(new SimplePlan("Plan1", MyGoal.class, MyPlan.class));
+		plans.add(new SimplePlan("Plan2", MyGoal.class, MyPlan.class));
+		plans.add(new SimplePlan("Plan3", MyGoal.class, MyPlan.class));
+		return plans;
+	}
+
+	private int counter;
+
+	public PlanFailedCapability() {
+		super(new BeliefBase(), new PlanLibrary(getPlans()));
+	}
+
+	@Override
+	public void goalPerformed(GoalEvent event) {
+		if (event instanceof GoalFinishedEvent
+				&& event.getGoal() instanceof MyGoal) {
+			log.info(event.getGoal() + " Status: "
+					+ ((GoalFinishedEvent) event).getStatus());
+			counter++;
+			if (counter >= GOALS) {
+				log
+						.info("Goal finished!! Removing capability of this agent...");
+				myAgent.removeCapability(this);
+			}
+		}
+	}
+
+	@Override
+	protected void setup() {
+		this.counter = 0;
+		for (int i = 0; i < GOALS; i++) {
+			myAgent.addGoal(new MyGoal(i), this);
+		}
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ChildPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ChildPlan.java
new file mode 100644
index 0000000..82b3913
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ChildPlan.java
@@ -0,0 +1,47 @@
+/*
+ * Created on 31/01/2010 18:29:38 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import jade.core.behaviours.CyclicBehaviour;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class ChildPlan extends CyclicBehaviour implements PlanBody {
+
+	private static final long serialVersionUID = -5432560989511973914L;
+
+	private int counter;
+	private Log log = LogFactory.getLog(this.getClass());
+	private PlanInstance planInstance;
+
+	@Override
+	public void action() {
+		if (counter == 0) {
+			this.planInstance.dispatchSubgoal(new Subgoal());
+		}
+		log.info("ChildPlan executing... counter " + counter);
+		counter++;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return null;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+		this.counter = 0;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/MyPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/MyPlan.java
new file mode 100644
index 0000000..d64308a
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/MyPlan.java
@@ -0,0 +1,47 @@
+/*
+ * Created on 31/01/2010 18:42:05 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import jade.core.behaviours.Behaviour;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class MyPlan extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -5432560989511973914L;
+
+	private int counter;
+	private Log log = LogFactory.getLog(this.getClass());
+
+	@Override
+	public void action() {
+		log.info("Plan executing... counter " + counter);
+		counter++;
+	}
+
+	@Override
+	public boolean done() {
+		return counter >= 10;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return done() ? EndState.SUCCESSFUL : null;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.counter = 0;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ParentPlan.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ParentPlan.java
new file mode 100644
index 0000000..6274e38
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/ParentPlan.java
@@ -0,0 +1,52 @@
+/*
+ * Created on 31/01/2010 18:25:42 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import jade.core.behaviours.Behaviour;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import br.pucrio.inf.les.bdijade.plan.PlanBody;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance;
+import br.pucrio.inf.les.bdijade.plan.PlanInstance.EndState;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class ParentPlan extends Behaviour implements PlanBody {
+
+	private static final long serialVersionUID = -5432560989511973914L;
+
+	private int counter;
+	private Log log = LogFactory.getLog(this.getClass());
+	private PlanInstance planInstance;
+
+	@Override
+	public void action() {
+		if (counter == 0) {
+			this.planInstance.dispatchSubgoal(new Subgoal());
+		}
+		log.info("ParentPlan executing... counter " + counter);
+		counter++;
+	}
+
+	@Override
+	public boolean done() {
+		return counter >= 10;
+	}
+
+	@Override
+	public EndState getEndState() {
+		return done() ? EndState.FAILED : null;
+	}
+
+	@Override
+	public void init(PlanInstance planInstance) {
+		this.planInstance = planInstance;
+		this.counter = 0;
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/Subgoal.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/Subgoal.java
new file mode 100644
index 0000000..d4cb83b
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/Subgoal.java
@@ -0,0 +1,16 @@
+/*
+ * Created on 31/01/2010 18:33:37 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import br.pucrio.inf.les.bdijade.goal.Goal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class Subgoal implements Goal {
+	
+	private static final long serialVersionUID = 2330672980228870224L;
+	
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/SubgoalCapability.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/SubgoalCapability.java
new file mode 100644
index 0000000..d286446
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/SubgoalCapability.java
@@ -0,0 +1,38 @@
+/*
+ * Created on 31/01/2010 18:32:06 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import br.pucrio.inf.les.bdijade.core.BeliefBase;
+import br.pucrio.inf.les.bdijade.core.Capability;
+import br.pucrio.inf.les.bdijade.core.PlanLibrary;
+import br.pucrio.inf.les.bdijade.plan.Plan;
+import br.pucrio.inf.les.bdijade.util.plan.SimplePlan;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class SubgoalCapability extends Capability {
+
+	private static Set<Plan> getPlans() {
+		Set<Plan> plans = new HashSet<Plan>();
+		plans.add(new SimplePlan(TopLevelGoal.class, ParentPlan.class));
+		plans.add(new SimplePlan(TopLevelGoal.class, MyPlan.class));
+		plans.add(new SimplePlan(Subgoal.class, ChildPlan.class));
+		return plans;
+	}
+
+	public SubgoalCapability() {
+		super(new BeliefBase(), new PlanLibrary(getPlans()));
+	}
+
+	@Override
+	protected void setup() {
+		myAgent.addGoal(new TopLevelGoal());
+	}
+
+}
diff --git a/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/TopLevelGoal.java b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/TopLevelGoal.java
new file mode 100644
index 0000000..c612e4c
--- /dev/null
+++ b/bdi-jade-test/src/br/pucrio/inf/les/bdijade/examples/subgoal/TopLevelGoal.java
@@ -0,0 +1,16 @@
+/*
+ * Created on 31/01/2010 18:25:54 
+ */
+package br.pucrio.inf.les.bdijade.examples.subgoal;
+
+import br.pucrio.inf.les.bdijade.goal.Goal;
+
+/**
+ * @author ingrid
+ * 
+ */
+public class TopLevelGoal implements Goal {
+
+	private static final long serialVersionUID = 2702962164032833240L;
+
+}