bdi-network-resilience

Distribution plans

9/5/2014 3:46:43 PM

Details

diff --git a/network-resilience/.classpath b/network-resilience/.classpath
index cec47e5..eb69e2a 100644
--- a/network-resilience/.classpath
+++ b/network-resilience/.classpath
@@ -6,5 +6,6 @@
 	<classpathentry kind="lib" path="/bdi-jade/lib/commons-logging-1.1.3.jar"/>
 	<classpathentry kind="lib" path="/bdi-jade/lib/jade-4.3.2.jar"/>
 	<classpathentry kind="lib" path="/bdi-jade/lib/log4j-1.2.17.jar"/>
+	<classpathentry kind="lib" path="/bdi-jade/lib/commons-codec-1.9.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
index fdca759..ed2c9fa 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
@@ -37,6 +37,7 @@ import bdi4jade.reasoning.OptionGenerationFunction;
 import br.ufrgs.inf.bdinetr.domain.AnomalyDetection;
 import br.ufrgs.inf.bdinetr.domain.Ip;
 import br.ufrgs.inf.bdinetr.domain.Link;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 import br.ufrgs.inf.bdinetr.domain.logic.IpPreposition.Anomalous;
 import br.ufrgs.inf.bdinetr.domain.logic.IpPreposition.Benign;
 import br.ufrgs.inf.bdinetr.domain.logic.IpPreposition.OverUsageCause;
@@ -127,6 +128,11 @@ public class AnomalyDetectionCapability extends RouterAgentCapability implements
 	}
 
 	@Override
+	public RoleType getRole() {
+		return RoleType.ANOMALY_DETECTION;
+	}
+
+	@Override
 	public void setCapability(Capability capability) {
 		if (!this.equals(capability)) {
 			throw new IllegalArgumentException(
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
index e505595..36575d3 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
@@ -38,6 +38,7 @@ import bdi4jade.reasoning.OptionGenerationFunction;
 import br.ufrgs.inf.bdinetr.domain.Classifier;
 import br.ufrgs.inf.bdinetr.domain.Flow;
 import br.ufrgs.inf.bdinetr.domain.Ip;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 import br.ufrgs.inf.bdinetr.domain.logic.FlowPreposition.Threat;
 import br.ufrgs.inf.bdinetr.domain.logic.FlowPreposition.ThreatResponded;
 import br.ufrgs.inf.bdinetr.domain.logic.IpPreposition.Anomalous;
@@ -122,6 +123,11 @@ public class ClassifierCapability extends RouterAgentCapability implements
 	}
 
 	@Override
+	public RoleType getRole() {
+		return RoleType.CLASSIFIER;
+	}
+
+	@Override
 	public void setCapability(Capability capability) {
 		if (!this.equals(capability)) {
 			throw new IllegalArgumentException(
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
index b614893..e3d336d 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
@@ -34,6 +34,7 @@ import bdi4jade.reasoning.OptionGenerationFunction;
 import br.ufrgs.inf.bdinetr.domain.Link;
 import br.ufrgs.inf.bdinetr.domain.LinkMonitor;
 import br.ufrgs.inf.bdinetr.domain.Observer;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 import br.ufrgs.inf.bdinetr.domain.logic.LinkProposition.AttackPrevented;
 import br.ufrgs.inf.bdinetr.domain.logic.LinkProposition.OverUsage;
 import br.ufrgs.inf.bdinetr.domain.logic.LinkProposition.RegularUsage;
@@ -89,6 +90,11 @@ public class LinkMonitorCapability extends RouterAgentCapability implements
 	}
 
 	@Override
+	public RoleType getRole() {
+		return RoleType.LINK_MONITOR;
+	}
+
+	@Override
 	public void reviewBeliefs() {
 		synchronized (linkEvents) {
 			for (Link link : linkEvents) {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RateLimiterCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RateLimiterCapability.java
index 6da9871..7a50c79 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RateLimiterCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RateLimiterCapability.java
@@ -44,6 +44,7 @@ import br.ufrgs.inf.bdinetr.domain.Ip;
 import br.ufrgs.inf.bdinetr.domain.Link;
 import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
 import br.ufrgs.inf.bdinetr.domain.RateLimiter;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 import br.ufrgs.inf.bdinetr.domain.logic.FlowPreposition.FlowRateLimited;
 import br.ufrgs.inf.bdinetr.domain.logic.FlowPreposition.Threat;
 import br.ufrgs.inf.bdinetr.domain.logic.FlowPreposition.ThreatResponded;
@@ -324,6 +325,11 @@ public class RateLimiterCapability extends RouterAgentCapability implements
 	}
 
 	@Override
+	public RoleType getRole() {
+		return RoleType.RATE_LIMITER;
+	}
+
+	@Override
 	public void setCapability(Capability capability) {
 		if (!this.equals(capability)) {
 			throw new IllegalArgumentException(
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
index 12eeb3c..2f92702 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
@@ -21,17 +21,27 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.agent;
 
-import jade.core.AID;
+import jade.core.messaging.TopicManagementHelper;
 import jade.lang.acl.ACLMessage;
 import jade.lang.acl.MessageTemplate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import bdi4jade.belief.Belief;
+import bdi4jade.goal.BeliefGoal;
 import bdi4jade.plan.Plan.EndState;
 import bdi4jade.plan.planbody.BeliefGoalPlanBody;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 
 /**
  * @author Ingrid Nunes
  */
 public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
 
+	public static final int MSG_TIME_OUT = 10000;
+	public static final int ANSWER_TIME_OUT = 30000;
+
 	private enum State {
 		Resquesting, ReceivingResponses, Selecting, AchievingGoal, Ended;
 	}
@@ -40,42 +50,91 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
 
 	private MessageTemplate mt;
 	private State state;
+	private long requestTime;
+	private Set<ACLMessage> positiveAnswers;
 
 	@Override
 	protected void execute() {
-		switch (state) {
-		case Resquesting:
+		try {
+			switch (state) {
+			case Resquesting:
+				ACLMessage msg = new ACLMessage(ACLMessage.CFP);
+				msg.setContentObject(getGoal());
 
-			ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
-			msg.setContent("");
-			msg.addReceiver(new AID("", 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()));
-			break;
-		case ReceivingResponses:
-			ACLMessage reply = myAgent.receive(mt);
-			if (reply != null) {
-				log.info("Pong received from " + reply.getSender().getName()
-						+ "!");
-				log.info("Content: " + reply.getContent());
-				
-			} else {
-				block();
-			}
-			break;
-		case Selecting:
+				// FIXME send request to specific role
+				TopicManagementHelper topicHelper = (TopicManagementHelper) myAgent
+						.getHelper(TopicManagementHelper.SERVICE_NAME);
+				for (RoleType role : RoleType.values()) {
+					msg.addReceiver(topicHelper.createTopic(role.name()));
+				}
 
-			break;
-		case AchievingGoal:
-
-			break;
-		case Ended:
-
-			break;
+				this.requestTime = System.currentTimeMillis();
+				msg.setConversationId("cin" + requestTime);
+				msg.setReplyWith("cfp" + requestTime);
+				myAgent.send(msg);
+				this.mt = MessageTemplate.and(MessageTemplate
+						.MatchConversationId(msg.getConversationId()),
+						MessageTemplate.MatchInReplyTo(msg.getReplyWith()));
+				this.positiveAnswers = new HashSet<>();
+				break;
+			case ReceivingResponses:
+				ACLMessage reply = myAgent.blockingReceive(mt, MSG_TIME_OUT);
+				if (reply != null) {
+					Object content = reply.getContentObject();
+					if (content instanceof Boolean) {
+						log.info("Agent " + reply.getSender() + "'s reply: "
+								+ content);
+						if ((Boolean) content) {
+							positiveAnswers.add(reply);
+						}
+					}
+				}
+				if ((System.currentTimeMillis() - requestTime) > ANSWER_TIME_OUT) {
+					this.state = State.Selecting;
+				}
+				break;
+			case Selecting:
+				if (positiveAnswers.isEmpty()) {
+					log.info("No positive answers.");
+					setEndState(EndState.FAILED);
+					this.state = State.Ended;
+					return;
+				} else {
+					ACLMessage chosenMsg = positiveAnswers.iterator().next(); // TODO
+																				// Better
+																				// selection
+																				// process.
+					for (ACLMessage answer : positiveAnswers) {
+						reply = answer.createReply();
+						reply.setPerformative((answer == chosenMsg) ? ACLMessage.ACCEPT_PROPOSAL
+								: ACLMessage.REJECT_PROPOSAL);
+						this.myAgent.send(reply);
+					}
+					this.state = State.AchievingGoal;
+				}
+				break;
+			case AchievingGoal:
+				reply = myAgent.blockingReceive(mt);
+				if (reply != null) {
+					Object content = reply.getContentObject();
+					if (content instanceof Belief) {
+						getCapability().getWholeCapability().getBeliefBase()
+								.addBelief((Belief<?, ?>) content);
+						assert ((BeliefGoal<?>) getGoal())
+								.isAchieved(getBeliefBase());
+						log.info("Goal " + getGoal() + " achieved.");
+					} else {
+						setEndState(EndState.FAILED);
+					}
+					this.state = State.Ended;
+				}
+				break;
+			case Ended:
+				break;
+			}
+		} catch (Exception exc) {
+			log.error(exc);
+			setEndState(EndState.FAILED);
 		}
 	}
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
index 2e43774..9b5b2c7 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
@@ -25,6 +25,8 @@ import jade.lang.acl.ACLMessage;
 import jade.lang.acl.MessageTemplate;
 import bdi4jade.annotation.Parameter;
 import bdi4jade.annotation.Parameter.Direction;
+import bdi4jade.goal.BeliefGoal;
+import bdi4jade.plan.Plan.EndState;
 import bdi4jade.plan.planbody.AbstractPlanBody;
 
 /**
@@ -44,21 +46,39 @@ public class RespondBeliefGoalPlanBody extends AbstractPlanBody {
 
 	@Override
 	public void action() {
-		switch (state) {
-		case SendingResponse:
-			ACLMessage reply = beliefGoalMsg.createReply();
-			reply.setContent("");
-			this.myAgent.send(reply);
-			break;
-		case ReceivingReply:
+		try {
+			switch (state) {
+			case SendingResponse:
+				ACLMessage reply = beliefGoalMsg.createReply();
+				Object content = reply.getContent();
+				if (content instanceof BeliefGoal) {
+					Boolean canAchieve = getCapability().canAchieve(
+							(BeliefGoal<?>) content);
+					reply.setContentObject(canAchieve);
+					log.info("Agent " + myAgent + " can achieve " + content
+							+ ": " + canAchieve);
+				} else {
+					reply.setContentObject(Boolean.FALSE);
+				}
+				this.myAgent.send(reply);
+				this.mt = MessageTemplate.and(MessageTemplate
+						.MatchConversationId(reply.getConversationId()),
+						MessageTemplate.MatchInReplyTo(reply.getReplyWith()));
+				this.state = State.ReceivingReply;
+				break;
+			case ReceivingReply:
 
-			break;
-		case AchievingBeliefGoal:
+				break;
+			case AchievingBeliefGoal:
 
-			break;
-		case Ended:
+				break;
+			case Ended:
 
-			break;
+				break;
+			}
+		} catch (Exception exc) {
+			log.error(exc);
+			setEndState(EndState.FAILED);
 		}
 	}
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
index c352d25..df54a2e 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
@@ -21,6 +21,8 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.agent;
 
+import jade.core.AID;
+import jade.core.messaging.TopicManagementHelper;
 import jade.lang.acl.ACLMessage;
 import jade.lang.acl.MessageTemplate;
 import jade.lang.acl.MessageTemplate.MatchExpression;
@@ -112,6 +114,25 @@ public class RouterAgent extends SingleCapabilityAgent implements
 					new ClassifierCapability((Classifier) router
 							.getRole(RoleType.CLASSIFIER)));
 		}
+		setPlanSelectionStrategy(this);
+	}
+
+	@Override
+	protected void init() {
+		for (Capability capability : getAllCapabilities()) {
+			if (capability instanceof RouterAgentCapability) {
+				try {
+					TopicManagementHelper topicHelper = (TopicManagementHelper) getHelper(TopicManagementHelper.SERVICE_NAME);
+					AID roleTopic = topicHelper
+							.createTopic(((RouterAgentCapability) capability)
+									.getRole().name());
+					topicHelper.register(roleTopic);
+				} catch (Exception exc) {
+					log.error(exc);
+					exc.printStackTrace();
+				}
+			}
+		}
 	}
 
 	@Override
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgentCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgentCapability.java
index c265359..0f841e1 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgentCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgentCapability.java
@@ -26,11 +26,12 @@ import bdi4jade.core.Capability;
 import bdi4jade.goal.BeliefPresentGoal;
 import bdi4jade.goal.Goal;
 import bdi4jade.goal.PropositionalBeliefValueGoal;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 
 /**
  * @author Ingrid Nunes
  */
-public class RouterAgentCapability extends Capability {
+public abstract class RouterAgentCapability extends Capability {
 
 	public static final String ROLE_BELIEF = "role";
 
@@ -57,6 +58,8 @@ public class RouterAgentCapability extends Capability {
 		return new PropositionalBeliefValueGoal(proposition, value);
 	}
 
+	public abstract RoleType getRole();
+
 	protected void goal(Object proposition) {
 		getMyAgent().addGoal(this, createGoal(proposition));
 	}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index ab1a7fd..3949d1c 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -23,7 +23,13 @@ package br.ufrgs.inf.bdinetr;
 
 import jade.BootProfileImpl;
 import jade.core.Agent;
+import jade.core.Profile;
 import jade.core.ProfileImpl;
+import jade.core.Specifier;
+import jade.core.event.NotificationService;
+import jade.core.messaging.TopicManagementHelper;
+import jade.core.messaging.TopicManagementService;
+import jade.tools.rma.rma;
 import jade.wrapper.AgentContainer;
 import jade.wrapper.AgentController;
 import jade.wrapper.PlatformController;
@@ -58,11 +64,11 @@ public class BDINetRApp {
 				.getResource("log4j.properties"));
 
 		Set<PReSETRouter> routers = new HashSet<>();
-		routers.add(new PReSETRouter(new Ip("Router"), RoleType.RATE_LIMITER
-				.getId()
-				| RoleType.CLASSIFIER.getId()
-				| RoleType.ANOMALY_DETECTION.getId()
-				| RoleType.LINK_MONITOR.getId()));
+		routers.add(new PReSETRouter(new Ip("RouterLM"), RoleType.LINK_MONITOR
+				.getId()));
+		routers.add(new PReSETRouter(new Ip("RouterRLCA"),
+				RoleType.RATE_LIMITER.getId() | RoleType.CLASSIFIER.getId()
+						| RoleType.ANOMALY_DETECTION.getId()));
 
 		Link affectedLink = new Link("AFFECTED_LINK");
 
@@ -97,10 +103,30 @@ public class BDINetRApp {
 		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]));
+		params.add("-services:" + TopicManagementHelper.SERVICE_NAME);
+
+		this.bootProfile = new ProfileImpl();
+		bootProfile.setParameter(Profile.GUI, "truw");
+		bootProfile.setParameter(BootProfileImpl.PLATFORM_ID,
+				BDINetRApp.class.getSimpleName());
+		bootProfile.setParameter(Profile.DETECT_MAIN, "false");
+
+		jade.util.leap.List result = new jade.util.leap.ArrayList();
+		Specifier s = new Specifier();
+		s.setName("RMA");
+		s.setClassName(rma.class.getName());
+		result.add(s);
+		bootProfile.setSpecifiers(Profile.AGENTS, result);
+
+		result = new jade.util.leap.ArrayList();
+		s = new Specifier();
+		s.setClassName(TopicManagementService.class.getName());
+		result.add(s);
+		s = new Specifier();
+		s.setClassName(NotificationService.class.getName());
+		result.add(s);
+		bootProfile.setSpecifiers(Profile.SERVICES, result);
+		log.info("Plataform parameters: " + bootProfile);
 
 		this.runtime = jade.core.Runtime.instance();
 		PlatformController controller = runtime
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
index eb84ee0..1b2acff 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
@@ -21,10 +21,13 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
+
 /**
  * @author Ingrid Nunes
  */
-public class Flow {
+public class Flow implements ContentElement, Concept {
 
 	private Ip dstIp;
 	private int dstPort;
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Ip.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Ip.java
index 52e9ad5..3ed6632 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Ip.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Ip.java
@@ -21,10 +21,13 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
+
 /**
  * @author Ingrid Nunes
  */
-public class Ip {
+public class Ip implements ContentElement, Concept {
 
 	private final String address;
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Link.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Link.java
index d693858..15d1269 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Link.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Link.java
@@ -21,10 +21,13 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
+
 /**
  * @author Ingrid Nunes
  */
-public class Link {
+public class Link implements ContentElement, Concept {
 
 	private final String id;
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/FlowPreposition.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/FlowPreposition.java
index af315b7..749482d 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/FlowPreposition.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/FlowPreposition.java
@@ -21,12 +21,14 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain.logic;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
 import br.ufrgs.inf.bdinetr.domain.Flow;
 
 /**
  * @author Ingrid Nunes
  */
-public class FlowPreposition {
+public class FlowPreposition implements ContentElement, Concept {
 
 	public static class FlowRateLimited extends FlowPreposition {
 		public FlowRateLimited(Flow flow) {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/IpPreposition.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/IpPreposition.java
index bd5b20c..d9eac02 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/IpPreposition.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/IpPreposition.java
@@ -21,13 +21,15 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain.logic;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
 import br.ufrgs.inf.bdinetr.domain.Ip;
 import br.ufrgs.inf.bdinetr.domain.Link;
 
 /**
  * @author Ingrid Nunes
  */
-public class IpPreposition {
+public class IpPreposition implements ContentElement, Concept {
 
 	public static class Anomalous extends IpPreposition {
 		public Anomalous(Ip ip) {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/LinkProposition.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/LinkProposition.java
index aa1ee53..31f126c 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/LinkProposition.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/logic/LinkProposition.java
@@ -21,12 +21,14 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain.logic;
 
+import jade.content.Concept;
+import jade.content.ContentElement;
 import br.ufrgs.inf.bdinetr.domain.Link;
 
 /**
  * @author Ingrid Nunes
  */
-public class LinkProposition {
+public class LinkProposition implements ContentElement, Concept {
 
 	public static class AttackPrevented extends LinkProposition {
 		public AttackPrevented(Link link) {