//----------------------------------------------------------------------------
// Copyright (C) 2011 Ingrid Nunes
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// To contact the authors:
// http://inf.ufrgs.br/prosoft/bdi4jade/
//
//----------------------------------------------------------------------------
package bdi4jade.examples.interactionprotocol.experiment;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.PropertyConfigurator;
import bdi4jade.belief.Belief;
import bdi4jade.core.SingleCapabilityAgent;
import bdi4jade.event.GoalEvent;
import bdi4jade.event.GoalListener;
import bdi4jade.examples.interactionprotocol.MonitorMetricsCapability;
import bdi4jade.examples.interactionprotocol.dao.TraceDAO;
import bdi4jade.examples.interactionprotocol.domain.Component;
import bdi4jade.examples.interactionprotocol.domain.Link;
import bdi4jade.examples.interactionprotocol.domain.LinkMonitor;
import bdi4jade.examples.interactionprotocol.domain.Service;
import bdi4jade.examples.interactionprotocol.goal.MonitorMetricsGoal;
import bdi4jade.examples.interactionprotocol.goal.RequestServiceGoal;
import bdi4jade.examples.interactionprotocol.remedial.RemedialCapability;
import bdi4jade.examples.interactionprotocol.remedial.RemedialServiceProvider;
import jade.BootProfileImpl;
import jade.core.ProfileImpl;
import jade.wrapper.AgentContainer;
import jade.wrapper.AgentController;
import jade.wrapper.PlatformController;
/**
* @author jgfaccin
*
*/
public class RemedialRunner implements GoalListener {
public static final int ITERATIONS = 120;
private ProfileImpl bootProfile;
private jade.core.Runtime runtime;
private PlatformController controller;
private ArrayList<RemedialServiceProvider> providerAgents;
private ArrayList<RemedialServiceProvider> supportingAgents;
private SingleCapabilityAgent client;
private int providerFailure;
private int linkFailure;
private int providerAndLinkFailure;
private int iteration;
private Instant startedAt;
public RemedialRunner() {
this.startedAt = Instant.now();
this.providerFailure = 30;
this.linkFailure = 60;
this.providerAndLinkFailure = 90;
this.iteration = 0;
List<String> params = new ArrayList<String>();
params.add("-gui");
params.add("-detect-main:false");
this.bootProfile = new BootProfileImpl(params.toArray(new String[0]));
this.runtime = jade.core.Runtime.instance();
this.controller = runtime.createMainContainer(bootProfile);
this.providerAgents = createProviderAgents();
this.supportingAgents = createSupportingAgents();
this.client = new SingleCapabilityAgent(new MonitorMetricsCapability());
try {
AgentController ac = ((AgentContainer) controller).acceptNewAgent("CLIENT", this.client);
ac.start();
ArrayList<RemedialServiceProvider> agents = new ArrayList<>();
agents.addAll(providerAgents);
agents.addAll(supportingAgents);
for (RemedialServiceProvider agent : agents) {
ac = ((AgentContainer) controller).acceptNewAgent(agent.getCustomName(), agent);
ac.start();
setupDB(agent);
}
} catch (Exception e) {
e.printStackTrace();
}
for (RemedialServiceProvider providers : this.providerAgents) {
providers.register();
}
}
public static void main(String[] args) {
PropertyConfigurator.configure(RemedialRunner.class.getResource("log4j.properties"));
RemedialRunner runner = new RemedialRunner();
runner.run();
}
public void run() {
try {
Thread.sleep(2000);
System.out.println("#ITERATION: " + this.iteration);
for (int i = 0; i < 3; i++) {
RemedialServiceProvider supporter = this.supportingAgents.get(i);
supporter.addGoal(new RequestServiceGoal(new Service("B"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("D"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("E"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("J"), null), this);
Thread.sleep(500);
}
for (int i = 3; i < 6; i++) {
RemedialServiceProvider supporter = this.supportingAgents.get(i);
supporter.addGoal(new RequestServiceGoal(new Service("C"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("G"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("N"), null), this);
supporter.addGoal(new RequestServiceGoal(new Service("X"), null), this);
Thread.sleep(500);
}
client.addGoal(new MonitorMetricsGoal(), this);
this.iteration++;
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void goalPerformed(GoalEvent event) {
if (event.getStatus().isFinished() && event.getGoal() instanceof MonitorMetricsGoal) {
if (iteration < ITERATIONS) {
if (iteration == providerFailure) {
RemedialServiceProvider agent = this.providerAgents.get(15);
@SuppressWarnings("unchecked")
Belief<String, Boolean> failure = (Belief<String, Boolean>) agent.getCapability().getBeliefBase()
.getBelief("failure");
failure.setValue(true);
System.out.println("Setting failure to " + agent.getLocalName());
} else if (iteration == linkFailure) {
Link link = new Link(new Component("AGENT21"), new Component("AGENT30"), new Service("X"));
LinkMonitor.getInstance().getAnomalousLinks().add(link);
System.out.println("Setting failure to link: " + link);
} else if (iteration == providerAndLinkFailure) {
RemedialServiceProvider agent = this.providerAgents.get(6);
@SuppressWarnings("unchecked")
Belief<String, Boolean> failure = (Belief<String, Boolean>) agent.getCapability().getBeliefBase()
.getBelief("failure");
failure.setValue(true);
Link link = new Link(new Component("AGENT02"), new Component("AGENT07"), new Service("D"));
LinkMonitor.getInstance().getAnomalousLinks().add(link);
System.out.println("Setting failure to " + agent.getLocalName() + " and link " + link);
}
run();
} else {
Instant finishedAt = Instant.now();
System.out.println("Iterations finished in " + Duration.between(startedAt, finishedAt).getSeconds());
}
}
}
public ArrayList<RemedialServiceProvider> createProviderAgents() {
ArrayList<RemedialServiceProvider> agents = new ArrayList<>();
HashMap<Service, ArrayList<Service>> agentServices = new HashMap<>();
ArrayList<Service> serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("B"));
serviceDependences.add(new Service("C"));
agentServices.put(new Service("A"), serviceDependences);
HashMap<Service, Component> currentProviders = new HashMap<>();
currentProviders.put(new Service("B"), new Component("AGENT02"));
currentProviders.put(new Service("C"), new Component("AGENT04"));
RemedialCapability capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("A"), 1);
RemedialServiceProvider agent = new RemedialServiceProvider("AGENT01", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("D"));
serviceDependences.add(new Service("E"));
agentServices.put(new Service("B"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("D"), new Component("AGENT07"));
currentProviders.put(new Service("E"), new Component("AGENT08"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("B"), 2);
agent = new RemedialServiceProvider("AGENT02", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("F"));
agentServices.put(new Service("B"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("F"), new Component("AGENT10"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("B"), 5);
agent = new RemedialServiceProvider("AGENT03", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("G"));
agentServices.put(new Service("C"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("G"), new Component("AGENT11"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("C"), 2);
agent = new RemedialServiceProvider("AGENT04", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("H"));
agentServices.put(new Service("C"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("H"), new Component("AGENT13"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("C"), 5);
agent = new RemedialServiceProvider("AGENT05", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("I"));
agentServices.put(new Service("D"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("I"), new Component("AGENT14"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("D"), 5);
agent = new RemedialServiceProvider("AGENT06", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("D"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("D"), 2);
agent = new RemedialServiceProvider("AGENT07", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("J"));
agentServices.put(new Service("E"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("J"), new Component("AGENT16"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("E"), 2);
agent = new RemedialServiceProvider("AGENT08", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("K"));
agentServices.put(new Service("E"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("K"), new Component("AGENT17"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("E"), 5);
agent = new RemedialServiceProvider("AGENT09", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("L"));
serviceDependences.add(new Service("M"));
agentServices.put(new Service("F"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("L"), new Component("AGENT18"));
currentProviders.put(new Service("M"), new Component("AGENT19"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("F"), 4);
agent = new RemedialServiceProvider("AGENT10", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("N"));
agentServices.put(new Service("G"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("N"), new Component("AGENT21"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("G"), 2);
agent = new RemedialServiceProvider("AGENT11", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("O"));
serviceDependences.add(new Service("P"));
agentServices.put(new Service("G"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("O"), new Component("AGENT22"));
currentProviders.put(new Service("P"), new Component("AGENT23"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("G"), 5);
agent = new RemedialServiceProvider("AGENT12", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("Q"));
agentServices.put(new Service("H"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("Q"), new Component("AGENT24"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("H"), 4);
agent = new RemedialServiceProvider("AGENT13", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("I"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("I"), 4);
agent = new RemedialServiceProvider("AGENT14", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("R"));
serviceDependences.add(new Service("S"));
agentServices.put(new Service("J"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("R"), new Component("AGENT25"));
currentProviders.put(new Service("S"), new Component("AGENT26"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("J"), 5);
agent = new RemedialServiceProvider("AGENT15", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("J"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("J"), 2);
agent = new RemedialServiceProvider("AGENT16", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("T"));
agentServices.put(new Service("K"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("T"), new Component("AGENT27"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("K"), 4);
agent = new RemedialServiceProvider("AGENT17", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("L"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("L"), 4);
agent = new RemedialServiceProvider("AGENT18", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("M"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("M"), 4);
agent = new RemedialServiceProvider("AGENT19", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("U"));
serviceDependences.add(new Service("V"));
agentServices.put(new Service("N"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("U"), new Component("AGENT28"));
currentProviders.put(new Service("V"), new Component("AGENT29"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("N"), 5);
agent = new RemedialServiceProvider("AGENT20", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
serviceDependences.add(new Service("X"));
agentServices.put(new Service("N"), serviceDependences);
currentProviders = new HashMap<>();
currentProviders.put(new Service("X"), new Component("AGENT30"));
capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
capability.setServiceCost(new Service("N"), 2);
agent = new RemedialServiceProvider("AGENT21", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("O"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("O"), 4);
agent = new RemedialServiceProvider("AGENT22", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("P"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("P"), 4);
agent = new RemedialServiceProvider("AGENT23", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("Q"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("Q"), 4);
agent = new RemedialServiceProvider("AGENT24", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("R"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("R"), 4);
agent = new RemedialServiceProvider("AGENT25", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("S"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("S"), 4);
agent = new RemedialServiceProvider("AGENT26", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("T"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("T"), 4);
agent = new RemedialServiceProvider("AGENT27", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("U"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("U"), 4);
agent = new RemedialServiceProvider("AGENT28", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("V"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("V"), 4);
agent = new RemedialServiceProvider("AGENT29", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("X"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("X"), 2);
agent = new RemedialServiceProvider("AGENT30", capability);
agents.add(agent);
agentServices = new HashMap<>();
serviceDependences = new ArrayList<>();
agentServices.put(new Service("X"), serviceDependences);
capability = new RemedialCapability(agentServices);
capability.setServiceCost(new Service("X"), 5);
agent = new RemedialServiceProvider("AGENT31", capability);
agents.add(agent);
return agents;
}
public ArrayList<RemedialServiceProvider> createSupportingAgents() {
ArrayList<RemedialServiceProvider> agents = new ArrayList<>();
HashMap<Service, ArrayList<Service>> agentServices = new HashMap<>();
HashMap<Service, Component> currentProviders = new HashMap<>();
currentProviders.put(new Service("B"), new Component("AGENT02"));
currentProviders.put(new Service("D"), new Component("AGENT07"));
currentProviders.put(new Service("E"), new Component("AGENT08"));
currentProviders.put(new Service("J"), new Component("AGENT16"));
for (int i = 1; i <= 3; i++) {
RemedialCapability capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
RemedialServiceProvider agent = new RemedialServiceProvider("SUPPORT" + i, capability);
agents.add(agent);
}
currentProviders = new HashMap<>();
currentProviders.put(new Service("C"), new Component("AGENT04"));
currentProviders.put(new Service("G"), new Component("AGENT11"));
currentProviders.put(new Service("N"), new Component("AGENT21"));
currentProviders.put(new Service("X"), new Component("AGENT30"));
for (int i = 4; i <= 6; i++) {
RemedialCapability capability = new RemedialCapability(agentServices);
capability.setCurrentProviders(currentProviders);
RemedialServiceProvider agent = new RemedialServiceProvider("SUPPORT" + i, capability);
agents.add(agent);
}
return agents;
}
private void setupDB(RemedialServiceProvider agent) {
TraceDAO dao = new TraceDAO(agent.getAID().getLocalName());
dao.dropCollection();
}
}