diff --git a/src/main/java/com/irit/oppocompo/OCEApplication.java b/src/main/java/com/irit/oppocompo/OCEApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..0cc50ece93c78196fd99141715180870727d405c --- /dev/null +++ b/src/main/java/com/irit/oppocompo/OCEApplication.java @@ -0,0 +1,43 @@ +package com.irit.oppocompo; + +import com.irit.oppocompo.ambient_environments.mockup.ui.MockupController; +import com.irit.oppocompo.end_user_interfaces.ice_adapter.ICEToEndUserInterfaceAdapter; +import com.irit.oppocompo.engine.OCE; +import com.irit.oppocompo.engine.ui.OCEController; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.stage.Stage; + +public class OCEApplication extends Application { + + @Override + public void start(Stage primaryStage) throws Exception { + FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/mockup/ui.fxml")); + primaryStage.setScene( + new Scene( + fxmlLoader.load() + ) + ); + + MockupController mockupController = fxmlLoader.getController(); + + Stage stage = new Stage(); + fxmlLoader = new FXMLLoader(getClass().getResource("/views/engine/ui.fxml")); + stage.setScene( + new Scene( + fxmlLoader.load() + ) + ); + OCEController oceController = fxmlLoader.getController(); + + oceController.setOce(new OCE( + mockupController.getMockup(), + new ICEToEndUserInterfaceAdapter(), + () -> {} + )); + + primaryStage.show(); + stage.show(); + } +} diff --git a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java deleted file mode 100644 index 3175837bd76a1fd7c92ccb325992212429b9d69b..0000000000000000000000000000000000000000 --- a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.irit.oppocompo.ambient_environments.mockup; - - -import javafx.application.Application; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.stage.Stage; - -public class MockupEnvironmentApplication extends Application { - - @Override - public void start(Stage primaryStage) throws Exception { - primaryStage.setScene( - new Scene( - new FXMLLoader( - getClass().getResource("/views/mockup/view.fxml") - ).load() - ) - ); - primaryStage.show(); - } -} diff --git a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java index 444dd7aaba24f262ed0e084692a1d37928631514..093165b59df79ec97fbff4c3bc7a01a6c77e987c 100644 --- a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java +++ b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java @@ -50,4 +50,8 @@ public class MockupController implements Initializable { public void removeComponent(MouseEvent mouseEvent) { mockup.removeComponent(currentComponentsListView.getSelectionModel().getSelectedItem()); } + + public MockupEnvironment getMockup() { + return mockup; + } } diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java index 728ba2165fd41590ab2b15c6490092917c16d276..ce40416777b5a54dfca0919f243b32b83880f0a3 100644 --- a/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java +++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java @@ -6,6 +6,5 @@ import java.util.function.Consumer; public interface EndUserInterface { - void displayAssemblyProposition(Assembly assembly); - void subscribeForUserSubmittedAssemblies(Consumer<Assembly> assemblyConsumer); + void displayAssemblyProposition(Assembly assembly, Consumer<Assembly> userSubmittedAssemblyCallback); } diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java index b1d81f5ccd35ab3c764d1c757623ddd565c5ede1..4264495f1afb4f730c27f0a2ea1ab621f7093ba5 100644 --- a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java +++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java @@ -28,20 +28,20 @@ public class ICEToEndUserInterfaceAdapter implements EndUserInterface { } @Override - public void displayAssemblyProposition(Assembly assembly) { + public void displayAssemblyProposition(Assembly assembly, Consumer<Assembly> userSubmittedAssemblyCallback) { try { iceEditorMarshaller.convertToXml( iceConverter.getEnvironmentFromAssembly(assembly), PropertiesStore.getProperty(PropertiesStore.ICE_INPUT_PATH) ); + + iceOutputWatch.addAssemblyConsumer(a -> { + userSubmittedAssemblyCallback.accept(a); + iceOutputWatch.removeAssemblyConsumer(userSubmittedAssemblyCallback); + }); } catch (JAXBException | IOException e) { e.printStackTrace(); } } - @Override - public void subscribeForUserSubmittedAssemblies(Consumer<Assembly> assemblyConsumer) { - iceOutputWatch.addAssemblyConsumer(assemblyConsumer); - } - } diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java index 203aef2be2e2b2f4bcddd8295e81dac6d1848533..f4113790cf9c5692621b65105da7fb4559b27bda 100644 --- a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java +++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java @@ -59,6 +59,10 @@ public class ICEOutputWatch implements Runnable { observers.add(assemblyConsumer); } + public void removeAssemblyConsumer(Consumer<Assembly> assemblyConsumer) { + observers.remove(assemblyConsumer); + } + private void sendNewAssemblyToObservers() throws FileNotFoundException, JAXBException, SAXException { Assembly assembly = iceConverter.getAssemblyFromEnvironment( iceEditorUnmarshaller.convertFromXml( diff --git a/src/main/java/com/irit/oppocompo/engine/OCE.java b/src/main/java/com/irit/oppocompo/engine/OCE.java index fed42099a1ea36c4343b0c589429a16ac0771e24..e2f3d42cfe8cd505b2cf4db5b42bc068191b045d 100644 --- a/src/main/java/com/irit/oppocompo/engine/OCE.java +++ b/src/main/java/com/irit/oppocompo/engine/OCE.java @@ -1,4 +1,91 @@ package com.irit.oppocompo.engine; +import com.irit.oppocompo.ambient_environments.AmbientEnvironment; +import com.irit.oppocompo.end_user_interfaces.EndUserInterface; +import com.irit.oppocompo.engine.cycle.AdvertiseStep; +import com.irit.oppocompo.engine.cycle.AgreeStep; +import com.irit.oppocompo.engine.cycle.ReplyStep; +import com.irit.oppocompo.engine.cycle.SelectStep; +import com.irit.oppocompo.engine.mas_infrastructure.Infrastructure; +import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent; +import com.irit.oppocompo.entities.*; + +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + public class OCE { + + private final AmbientEnvironment ambientEnvironment; + + private final Infrastructure infrastructure = new Infrastructure(); + + private final EndUserInterface endUserInterface; + + private Assembly assembly = new Assembly(); + + private final Runnable readyForNextCycleCallback; + + public OCE(AmbientEnvironment ambientEnvironment, EndUserInterface endUserInterface, Runnable readyForNextCycleCallback) { + this.ambientEnvironment = ambientEnvironment; + this.endUserInterface = endUserInterface; + this.readyForNextCycleCallback = readyForNextCycleCallback; + } + + public void cycle() { + //maj de la liste des agents... + Set<Component> intersection = ambientEnvironment.getCurrentEnvironment().getComponents().stream().filter(component -> assembly.getComponents().contains(component)).collect(Collectors.toSet()); + + // enlever les agents des composants qui ont disparu + assembly.getComponents().stream().filter( + component -> !intersection.contains(component) + ).forEach( + component -> component.getServices().forEach( + service -> infrastructure.getAgentFactory().removeAgent( + infrastructure.getAgentFactory().getAgents().stream().filter( + agent -> agent.getHandledService().equals(service) + ).findAny().orElse(null)) + ) + ); + + // ajouter les agents des composants qui sont apparu + ambientEnvironment.getCurrentEnvironment().getComponents().stream().filter( + component -> !intersection.contains(component) + ).forEach( + component -> component.getServices().forEach( + service -> infrastructure.getAgentFactory().makeAgent(service) + ) + ); + + assembly = new Assembly(ambientEnvironment.getCurrentEnvironment().getComponents(), new HashSet<>()); + + Set<Binding> bindings; + Set<Agent> requiredServiceAgents = infrastructure.getAgentFactory().getAgents().stream().filter(agent -> agent.getHandledService() instanceof RequiredService).collect(Collectors.toSet()); + Set<Agent> providedServiceAgents = infrastructure.getAgentFactory().getAgents().stream().filter(agent -> agent.getHandledService() instanceof ProvidedService).collect(Collectors.toSet()); + + do { + bindings = new HashSet<>(assembly.getBindings()); + + providedServiceAgents.forEach(agent -> new AdvertiseStep(agent.getHandledService(), agent.getId(), infrastructure.getAgentCommunication()).run()); + + requiredServiceAgents.forEach(agent -> new ReplyStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication()).run()); + + providedServiceAgents.forEach(agent -> new SelectStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication()).run()); + + Set<Agent> requiredServiceAgentsToRemove = new HashSet<>(); + + requiredServiceAgents.forEach(agent -> new AgreeStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication(), assembly, providedServiceAgents, requiredServiceAgents, requiredServiceAgentsToRemove).run()); + + requiredServiceAgents.removeAll(requiredServiceAgentsToRemove); + + } while (!bindings.containsAll(assembly.getBindings())); + + endUserInterface.displayAssemblyProposition(assembly, userSubmittedAssembly -> { + // traiter feedback + System.out.println(assembly.getComponents().size()); + System.out.println(assembly.getBindings().size()); + + readyForNextCycleCallback.run(); + }); + } } diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java new file mode 100644 index 0000000000000000000000000000000000000000..3904fd328175820836565d010d7e592bc6094052 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java @@ -0,0 +1,28 @@ +package com.irit.oppocompo.engine.cycle; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication; +import com.irit.oppocompo.engine.messages.Advertise; +import com.irit.oppocompo.entities.Service; + +import java.util.UUID; + +public class AdvertiseStep implements Runnable { + + private final Service service; + private final UUID ownerId; + private final Communication communicationService; + + + public AdvertiseStep(Service service, UUID ownerId, Communication communicationService) { + this.service = service; + this.ownerId = ownerId; + this.communicationService = communicationService; + } + + @Override + public void run() { + communicationService.broadcastMessage( + new Advertise(ownerId, service) + ); + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java new file mode 100644 index 0000000000000000000000000000000000000000..d8417bbb49112413bbfce51709b2bcae213937d5 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java @@ -0,0 +1,55 @@ +package com.irit.oppocompo.engine.cycle; + +import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent; +import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication; +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; +import com.irit.oppocompo.engine.messages.Agree; +import com.irit.oppocompo.engine.messages.Select; +import com.irit.oppocompo.entities.*; + +import java.util.*; +import java.util.stream.Collectors; + +public class AgreeStep implements Runnable { + + private final Service service; + private final UUID ownerId; + private final Set<Message> messages; + private final Communication communicationService; + private final Assembly assembly; + private final Set<Agent> providedServiceAgents; + private final Set<Agent> requiredServiceAgents; + private final Set<Agent> requiredServiceAgentsToRemove; + + public AgreeStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService, Assembly assembly, Set<Agent> providedServiceAgents, Set<Agent> requiredServiceAgents, Set<Agent> requiredServiceAgentsToRemove) { + this.service = service; + this.ownerId = ownerId; + this.messages = messages; + this.communicationService = communicationService; + this.assembly = assembly; + this.providedServiceAgents = providedServiceAgents; + this.requiredServiceAgents = requiredServiceAgents; + this.requiredServiceAgentsToRemove = requiredServiceAgentsToRemove; + } + + @Override + public void run() { + List<Message> selections = messages.stream().filter(message -> message instanceof Select).collect(Collectors.toList()); + + Message selected = selections.get(new Random().nextInt(selections.size())); + + + // peut-ĂȘtre que c'est pas nĂ©cessaire... + communicationService.sendMessage(new Agree(ownerId), Collections.singleton(selected.getEmitter())); + + Agent requiredAgentOfTheBinding = requiredServiceAgents.stream().filter(agent -> agent.getId().equals(ownerId)).findAny().get(); + Agent providedAgentOfTheBinding = providedServiceAgents.stream().filter(agent -> agent.getId().equals(selected.getEmitter())).findAny().get(); + + assembly.getBindings().add(new Binding((RequiredService) service, (ProvidedService) providedAgentOfTheBinding.getHandledService())); + + requiredServiceAgentsToRemove.add(requiredAgentOfTheBinding); + providedServiceAgents.remove(providedAgentOfTheBinding); + + messages.clear(); + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java new file mode 100644 index 0000000000000000000000000000000000000000..c369ed9a197a8745e945a0affab3d32c4724c11c --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java @@ -0,0 +1,37 @@ +package com.irit.oppocompo.engine.cycle; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication; +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; +import com.irit.oppocompo.engine.messages.Advertise; +import com.irit.oppocompo.engine.messages.Reply; +import com.irit.oppocompo.entities.Service; + +import java.util.Collections; +import java.util.Queue; +import java.util.Set; +import java.util.UUID; + +public class ReplyStep implements Runnable { + + private final Service service; + private final UUID ownerId; + private final Set<Message> messages; + private final Communication communicationService; + + public ReplyStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService) { + this.service = service; + this.ownerId = ownerId; + this.messages = messages; + this.communicationService = communicationService; + } + + @Override + public void run() { + messages.forEach(message -> { + if(message instanceof Advertise && service.getInterfaceId().equals(((Advertise)message).getService().getInterfaceId())) { + communicationService.sendMessage(new Reply(ownerId), Collections.singleton(message.getEmitter())); + } + }); + messages.clear(); + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java new file mode 100644 index 0000000000000000000000000000000000000000..453882ad7cb59e546ca9d139c6771dbec7a8001a --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java @@ -0,0 +1,40 @@ +package com.irit.oppocompo.engine.cycle; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication; +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; +import com.irit.oppocompo.engine.messages.Reply; +import com.irit.oppocompo.engine.messages.Select; +import com.irit.oppocompo.entities.Service; + +import java.util.*; +import java.util.stream.Collectors; + +public class SelectStep implements Runnable { + + private final Service service; + private final UUID ownerId; + private final Set<Message> messages; + private final Communication communicationService; + + public SelectStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService) { + this.service = service; + this.ownerId = ownerId; + this.messages = messages; + this.communicationService = communicationService; + } + + @Override + public void run() { + List<Message> replies = messages.stream().filter( + message -> message instanceof Reply + ).collect(Collectors.toList()); + + if(replies.size() == 0) { + return; + } + + Message selectedReply = replies.get(new Random().nextInt(replies.size())); + communicationService.sendMessage(new Select(ownerId), Collections.singleton(selectedReply.getEmitter())); + messages.clear(); + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java index 4d3acb27e112dea0fbba1442255514271e47568f..1577fe691735d92e56fe5ccc0ee4ff21c63b10ec 100644 --- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java +++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java @@ -6,23 +6,16 @@ import com.irit.oppocompo.entities.Service; import java.util.*; -public class Agent implements Runnable { +public class Agent { private final UUID id = UUID.randomUUID(); private final Service handledService; - private final Queue<Message> messageQueue = new LinkedList<>(); - private final Runnable execution; + private final Set<Message> mailbox = new HashSet<>(); private final Communication communication; - public Agent(Service handledService, Communication communication, Runnable execution) { + public Agent(Service handledService, Communication communication) { this.handledService = handledService; this.communication = communication; - this.execution = execution; - } - - @Override - public void run() { - execution.run(); } public UUID getId() { @@ -37,12 +30,13 @@ public class Agent implements Runnable { return communication; } - public Queue<Message> getMessageQueue() { - return messageQueue; + public Set<Message> getMailbox() { + return mailbox; } @Override public String toString() { return "Agent{" + id + "}"; } + } diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java index b6370ed1916d5e1ff2f5a83fe6fb8960fb5956cd..9f9449101afc08fa7ef7c32f53654b35660a6a92 100644 --- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java +++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java @@ -7,27 +7,27 @@ import java.util.*; public class AgentCommunication implements Communication { private final Map<UUID, Agent> agents = new HashMap<>(); - private final Map<UUID, Queue<Message>> messageQueues = new HashMap<>(); + private final Map<UUID, Set<Message>> mailboxes = new HashMap<>(); public void addAgent(Agent agent) { agents.put(agent.getId(), agent); - messageQueues.put(agent.getId(), agent.getMessageQueue()); + mailboxes.put(agent.getId(), agent.getMailbox()); } public void removeAgentWithId(UUID id) { agents.remove(id); - messageQueues.remove(id); + mailboxes.remove(id); } @Override public void sendMessage(Message message, Set<UUID> receivers) { - receivers.forEach(id -> messageQueues.get(id).add(message)); + receivers.forEach(id -> mailboxes.get(id).add(message)); } @Override public void broadcastMessage(Message message) { - messageQueues.keySet().stream().filter(id -> !id.equals(message.getEmitter())).forEach( - id -> messageQueues.get(id).add(message) + mailboxes.keySet().stream().filter(id -> !id.equals(message.getEmitter())).forEach( + id -> mailboxes.get(id).add(message) ); } } diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java index 956979df7c7b4c9a5513602958dc4fa4b457fe3a..fac515255fd191df5257b4743c58ee1a665cbcce 100644 --- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java +++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java @@ -5,25 +5,36 @@ import com.irit.oppocompo.engine.mas_infrastructure.communication.AgentCommunica import com.irit.oppocompo.engine.mas_infrastructure.scheduler.Scheduler; import com.irit.oppocompo.entities.Service; +import java.util.HashSet; +import java.util.Set; + public class AgentFactory { private final AgentCommunication communication; private final Scheduler scheduler; + private final Set<Agent> agents = new HashSet<>(); + public AgentFactory(AgentCommunication communication, Scheduler scheduler) { this.communication = communication; this.scheduler = scheduler; } - public Agent makeAgent(Service service, Runnable execution) { - Agent agent = new Agent(service, communication, execution); + public Agent makeAgent(Service service) { + Agent agent = new Agent(service, communication); communication.addAgent(agent); scheduler.addAgent(agent); + agents.add(agent); return agent; } public void removeAgent(Agent agent) { communication.removeAgentWithId(agent.getId()); scheduler.removeAgent(agent); + agents.remove(agent); + } + + public Set<Agent> getAgents() { + return agents; } } diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java index 0cd199babb620ff56ac15164d204ad2df2bc5ec9..16f37c7fe721ee98be2c83f5b3c63a9cce87560d 100644 --- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java +++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java @@ -2,12 +2,12 @@ package com.irit.oppocompo.engine.mas_infrastructure.scheduler; import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; public class Scheduler implements SchedulerService { - private final List<Agent> agents = new ArrayList<>(); + private final Set<Agent> agents = new HashSet<>(); private static final int CYCLE_NUMBER = 600; @Override @@ -16,9 +16,9 @@ public class Scheduler implements SchedulerService { } @Override - public void start(List<Agent> agents, int cycleNumber) { + public void start(Set<Agent> agents, int cycleNumber) { for(int i = 0; i < cycleNumber; i++) { - agents.forEach(Agent::run); + agents.forEach(agent -> {}); } } diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java index 2b441a789813b725a3ab057cb2fe403f9a648a30..0ac4d502c4f5254422a6d2bdb4ee9e24deeb75a9 100644 --- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java +++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java @@ -2,10 +2,10 @@ package com.irit.oppocompo.engine.mas_infrastructure.scheduler; import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent; -import java.util.List; +import java.util.Set; public interface SchedulerService { void start(); - void start(List<Agent> agents, int cycleNumber); + void start(Set<Agent> agents, int cycleNumber); } diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java b/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java new file mode 100644 index 0000000000000000000000000000000000000000..f1f461203d4cc139ba305b1f2e296e28177fea4e --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java @@ -0,0 +1,27 @@ +package com.irit.oppocompo.engine.messages; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; +import com.irit.oppocompo.entities.Service; + +import java.util.UUID; + +public class Advertise implements Message { + + private final UUID emitter; + + private final Service service; + + public Advertise(UUID emitter, Service service) { + this.emitter = emitter; + this.service = service; + } + + @Override + public UUID getEmitter() { + return emitter; + } + + public Service getService() { + return service; + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Agree.java b/src/main/java/com/irit/oppocompo/engine/messages/Agree.java new file mode 100644 index 0000000000000000000000000000000000000000..3246284836d2d597849f930b69ab85862a3bf120 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/messages/Agree.java @@ -0,0 +1,19 @@ +package com.irit.oppocompo.engine.messages; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; + +import java.util.UUID; + +public class Agree implements Message { + + private final UUID emitter; + + public Agree(UUID emitter) { + this.emitter = emitter; + } + + @Override + public UUID getEmitter() { + return emitter; + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java b/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java new file mode 100644 index 0000000000000000000000000000000000000000..cda99b8d496c0e1b935060a787e2220ff8dacbc3 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java @@ -0,0 +1,19 @@ +package com.irit.oppocompo.engine.messages; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; + +import java.util.UUID; + +public class Disagree implements Message { + + private final UUID emitter; + + public Disagree(UUID emitter) { + this.emitter = emitter; + } + + @Override + public UUID getEmitter() { + return emitter; + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Reply.java b/src/main/java/com/irit/oppocompo/engine/messages/Reply.java new file mode 100644 index 0000000000000000000000000000000000000000..9d9862f40eadbf89d2943617449fae5df8a986af --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/messages/Reply.java @@ -0,0 +1,19 @@ +package com.irit.oppocompo.engine.messages; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; + +import java.util.UUID; + +public class Reply implements Message { + + private final UUID emitter; + + public Reply(UUID emitter) { + this.emitter = emitter; + } + + @Override + public UUID getEmitter() { + return emitter; + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Select.java b/src/main/java/com/irit/oppocompo/engine/messages/Select.java new file mode 100644 index 0000000000000000000000000000000000000000..8ddd1ed800fa3a5b2fd2ba31c897e36412c4eee1 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/messages/Select.java @@ -0,0 +1,19 @@ +package com.irit.oppocompo.engine.messages; + +import com.irit.oppocompo.engine.mas_infrastructure.communication.Message; + +import java.util.UUID; + +public class Select implements Message { + + private final UUID emitter; + + public Select(UUID emitter) { + this.emitter = emitter; + } + + @Override + public UUID getEmitter() { + return emitter; + } +} diff --git a/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java b/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java new file mode 100644 index 0000000000000000000000000000000000000000..e54ce73474b1a9a0506cef9704b8572caab8ae34 --- /dev/null +++ b/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java @@ -0,0 +1,29 @@ +package com.irit.oppocompo.engine.ui; + +import com.irit.oppocompo.engine.OCE; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Button; + +import java.net.URL; +import java.util.ResourceBundle; + +public class OCEController implements Initializable { + + private OCE oce; + + @Override + public void initialize(URL location, ResourceBundle resources) { + + } + + public void setOce(OCE oce) { + this.oce = oce; + } + + @FXML + public void startOCECycle(ActionEvent actionEvent) { + oce.cycle(); + } +} diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties index 04e04f442c195ae354af03527551e2c0290f9885..586f5ba897412d6b987daa01d39a071d27917137 100644 --- a/src/main/resources/config.properties +++ b/src/main/resources/config.properties @@ -1 +1 @@ -ice.input_filepath = /home/kevin/Downloads/runtime-Editor/org.eclipse.iceEditor.sample/editor.ice_editor \ No newline at end of file +ice.input_filepath = absolute path to org.eclipse.iceEditor.sample/editor.ice_editor \ No newline at end of file diff --git a/src/main/resources/ice_output/assembly.ice_editor b/src/main/resources/ice_output/assembly.ice_editor index 309484cb2f3528a14a82f345201f27a8012d2756..cbb8c82c8d9376923095529668ef597553efc77a 100644 --- a/src/main/resources/ice_output/assembly.ice_editor +++ b/src/main/resources/ice_output/assembly.ice_editor @@ -1,4 +1,16 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <iCE_Editor:Environment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:iCE_Editor="http://www.eclipse.org/sirius/sample/ice_editor"> -<component Name="two"/> -</iCE_Editor:Environment> \ No newline at end of file + <component Name="Slider"> + <service xsi:type="iCE_Editor:RequiredService" Name="Sender" ID="SendIntegers" Cardinality="1" bindProvided="//@component.1/@service.1"/> + </component> + <component Name="Converter"> + <service xsi:type="iCE_Editor:RequiredService" Name="Click" ID="CLick" Cardinality="1" bindProvided="//@component.2/@service.0"/> + <service xsi:type="iCE_Editor:ProvidedService" Name="Convert" ID="SendIntegers" Cardinality="1" bindRequired="//@component.0/@service.0"/> + </component> + <component Name="Lamp 1"> + <service xsi:type="iCE_Editor:ProvidedService" Name="Click" ID="CLick" Cardinality="1" bindRequired="//@component.1/@service.0"/> + </component> + <component Name="Lamp 2"> + <service xsi:type="iCE_Editor:ProvidedService" Name="Click" ID="CLick" Cardinality="1"/> + </component> +</iCE_Editor:Environment> diff --git a/src/main/resources/views/engine/ui.fxml b/src/main/resources/views/engine/ui.fxml new file mode 100644 index 0000000000000000000000000000000000000000..65460060a7c8922cdd96615332e9d8e115daeec1 --- /dev/null +++ b/src/main/resources/views/engine/ui.fxml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.AnchorPane?> + + +<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.irit.oppocompo.engine.ui.OCEController"> + <children> + <Button layoutX="14.0" layoutY="14.0" mnemonicParsing="false" onAction="#startOCECycle" text="Start" /> + </children> +</AnchorPane> diff --git a/src/main/resources/views/mockup/view.fxml b/src/main/resources/views/mockup/ui.fxml similarity index 100% rename from src/main/resources/views/mockup/view.fxml rename to src/main/resources/views/mockup/ui.fxml diff --git a/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java b/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java index 7219c334ed2bf4d7e9dff41ca236f2ed6f6ca9c1..eb5548a908a8a0f0f4ee6a32690660271f8de0b5 100644 --- a/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java +++ b/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java @@ -20,7 +20,7 @@ public class ICEToEndUserInterfaceAdapterIntegrationTest { @Test public void testDisplayAssembly() throws JAXBException, IOException { - new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(makeTestAssembly()); + new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(makeTestAssembly(), assembly -> {}); //Go to ICE and assert *manually* that the assembly is displayed } @@ -42,7 +42,7 @@ public class ICEToEndUserInterfaceAdapterIntegrationTest { @Test public void testOutputWatchIsTriggered() throws JAXBException, IOException, InterruptedException { AtomicBoolean pass = new AtomicBoolean(false); - new ICEToEndUserInterfaceAdapter().subscribeForUserSubmittedAssemblies(assembly -> pass.set(true)); + new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(new Assembly(), assembly -> pass.set(true)); FileWriter myWriter = new FileWriter(ICE_OUTPUT_PATH); myWriter.write(SAMPLE_XML);