bdi-network-resilience
Changes
network-resilience/.classpath 1(+1 -0)
Details
network-resilience/.classpath 1(+1 -0)
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) {