From 704b40ecc9b331a68ae7ed7982591f798bdf54fd Mon Sep 17 00:00:00 2001 From: william Date: Tue, 7 Jun 2022 21:07:49 -0400 Subject: [PATCH] Add static network --- src/configuration/ConfigurationParser.java | 8 +- .../SimulationConfiguration.java | 2 +- .../SimulationConfigurationSingleton.java | 26 ++++++- src/configuration/SimulationData.java | 4 +- src/configuration/XmlConfigurationParser.java | 13 ++-- src/metadata/BuildingMetadata.java | 6 +- src/metadata/FactoryInput.java | 2 +- src/metadata/FactoryMetadata.java | 2 +- src/metadata/FactoryOutput.java | 2 +- src/metadata/WarehouseInput.java | 2 +- src/metadata/WarehouseMetadata.java | 6 +- src/simulation/Building.java | 12 +-- src/simulation/BuildingState.java | 2 +- src/simulation/Component.java | 2 +- src/simulation/ComponentRoute.java | 2 +- src/simulation/ComponentType.java | 2 +- src/simulation/Factory.java | 2 +- src/simulation/Route.java | 2 +- src/simulation/Warehouse.java | 30 +++++++- src/simulation/WarehouseObserver.java | 10 ++- src/simulation/WarehouseSubject.java | 7 +- src/view/MainPanel.java | 75 +++++++++++++++++-- src/view/MainWindow.java | 4 +- src/view/WindowMenu.java | 23 +++++- 24 files changed, 198 insertions(+), 48 deletions(-) diff --git a/src/configuration/ConfigurationParser.java b/src/configuration/ConfigurationParser.java index 54bae30..3e45e11 100644 --- a/src/configuration/ConfigurationParser.java +++ b/src/configuration/ConfigurationParser.java @@ -1,11 +1,13 @@ package configuration; +import java.io.File; + public interface ConfigurationParser { /** - * Analyse et lit une configuration de simulation depuis un fichier au chemin donné. + * Analyse et lit une configuration de simulation depuis un fichier. * - * @param path Le chemin vers le fichier de configuration. + * @param file Le fichier de configuration. * @return La configuration de simulation correspondant au contenu du fichier. */ - SimulationConfiguration parseConfiguration(String path) throws ConfigurationParsingException; + SimulationConfiguration parseConfiguration(File file) throws ConfigurationParsingException; } diff --git a/src/configuration/SimulationConfiguration.java b/src/configuration/SimulationConfiguration.java index 9d41541..447ec2c 100644 --- a/src/configuration/SimulationConfiguration.java +++ b/src/configuration/SimulationConfiguration.java @@ -1,6 +1,6 @@ package configuration; -import model.metadata.BuildingMetadata; +import metadata.BuildingMetadata; import java.util.Map; diff --git a/src/configuration/SimulationConfigurationSingleton.java b/src/configuration/SimulationConfigurationSingleton.java index a7e0976..21ea034 100644 --- a/src/configuration/SimulationConfigurationSingleton.java +++ b/src/configuration/SimulationConfigurationSingleton.java @@ -1,2 +1,26 @@ -package configuration;public class SingletonConfigurationSingleton { +package configuration; + +public class SimulationConfigurationSingleton { + private static SimulationConfigurationSingleton instance; + + public static SimulationConfigurationSingleton getInstance() { + if (instance == null) { + instance = new SimulationConfigurationSingleton(); + } + + return instance; + } + + private SimulationConfiguration configuration; + + private SimulationConfigurationSingleton() { + } + + public void setConfiguration(SimulationConfiguration config) { + this.configuration = config; + } + + public SimulationConfiguration getConfiguration() { + return configuration; + } } diff --git a/src/configuration/SimulationData.java b/src/configuration/SimulationData.java index cbee077..0deb959 100644 --- a/src/configuration/SimulationData.java +++ b/src/configuration/SimulationData.java @@ -1,7 +1,7 @@ package configuration; -import model.Building; -import model.Route; +import simulation.Building; +import simulation.Route; import java.util.Collection; diff --git a/src/configuration/XmlConfigurationParser.java b/src/configuration/XmlConfigurationParser.java index 88f3da3..58c4b99 100644 --- a/src/configuration/XmlConfigurationParser.java +++ b/src/configuration/XmlConfigurationParser.java @@ -1,15 +1,16 @@ package configuration; -import model.*; -import model.metadata.*; +import metadata.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.SAXException; +import simulation.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -36,8 +37,8 @@ public class XmlConfigurationParser implements ConfigurationParser { public static final String ATTRIBUTE_TO = "vers"; @Override - public SimulationConfiguration parseConfiguration(String path) throws ConfigurationParsingException { - Document document = parseDocument(path); + public SimulationConfiguration parseConfiguration(File file) throws ConfigurationParsingException { + Document document = parseDocument(file); Map buildingsMetadata = parseBuildingsMetadata(document); SimulationData simulationData = parseSimulationData(document); @@ -45,12 +46,12 @@ public class XmlConfigurationParser implements ConfigurationParser { return new SimulationConfiguration(buildingsMetadata, simulationData); } - private Document parseDocument(String path) throws ConfigurationParsingException { + private Document parseDocument(File file) throws ConfigurationParsingException { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(path); + Document document = builder.parse(file); document.getDocumentElement().normalize(); return document; diff --git a/src/metadata/BuildingMetadata.java b/src/metadata/BuildingMetadata.java index 4eac8ea..0822af8 100644 --- a/src/metadata/BuildingMetadata.java +++ b/src/metadata/BuildingMetadata.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.BuildingState; @@ -6,8 +6,8 @@ import java.util.Map; import java.util.Objects; public abstract class BuildingMetadata { - private final String type; - private final Map iconsPaths; + protected final String type; + protected final Map iconsPaths; public BuildingMetadata(String type, Map iconsPaths) { this.type = type; diff --git a/src/metadata/FactoryInput.java b/src/metadata/FactoryInput.java index d8562e4..4152036 100644 --- a/src/metadata/FactoryInput.java +++ b/src/metadata/FactoryInput.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.ComponentType; diff --git a/src/metadata/FactoryMetadata.java b/src/metadata/FactoryMetadata.java index ba104fd..d075157 100644 --- a/src/metadata/FactoryMetadata.java +++ b/src/metadata/FactoryMetadata.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.BuildingState; diff --git a/src/metadata/FactoryOutput.java b/src/metadata/FactoryOutput.java index fddb8b2..683c081 100644 --- a/src/metadata/FactoryOutput.java +++ b/src/metadata/FactoryOutput.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.ComponentType; diff --git a/src/metadata/WarehouseInput.java b/src/metadata/WarehouseInput.java index 7f23603..32bf7c3 100644 --- a/src/metadata/WarehouseInput.java +++ b/src/metadata/WarehouseInput.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.ComponentType; diff --git a/src/metadata/WarehouseMetadata.java b/src/metadata/WarehouseMetadata.java index 956bbe7..a5f7067 100644 --- a/src/metadata/WarehouseMetadata.java +++ b/src/metadata/WarehouseMetadata.java @@ -1,4 +1,4 @@ -package model.metadata; +package metadata; import simulation.BuildingState; @@ -13,6 +13,10 @@ public class WarehouseMetadata extends BuildingMetadata { this.input = input; } + public WarehouseInput getInput() { + return input; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/simulation/Building.java b/src/simulation/Building.java index 6cfd0c3..8634bd7 100644 --- a/src/simulation/Building.java +++ b/src/simulation/Building.java @@ -1,11 +1,11 @@ -package model; +package simulation; public abstract class Building { - private final int id; - private final String type; - private final int x; - private final int y; - private BuildingState state = BuildingState.EMPTY; + protected final int id; + protected final String type; + protected final int x; + protected final int y; + protected BuildingState state = BuildingState.EMPTY; protected Building(int id, String type, int x, int y) { this.id = id; diff --git a/src/simulation/BuildingState.java b/src/simulation/BuildingState.java index c85d989..c57c91d 100644 --- a/src/simulation/BuildingState.java +++ b/src/simulation/BuildingState.java @@ -1,4 +1,4 @@ -package model; +package simulation; import java.util.Arrays; import java.util.Objects; diff --git a/src/simulation/Component.java b/src/simulation/Component.java index 33d1571..c358e2c 100644 --- a/src/simulation/Component.java +++ b/src/simulation/Component.java @@ -1,4 +1,4 @@ -package model; +package simulation; import java.util.Objects; diff --git a/src/simulation/ComponentRoute.java b/src/simulation/ComponentRoute.java index 1dff189..81ff2d3 100644 --- a/src/simulation/ComponentRoute.java +++ b/src/simulation/ComponentRoute.java @@ -1,4 +1,4 @@ -package model; +package simulation; public class ComponentRoute { private final Building outputBuilding; diff --git a/src/simulation/ComponentType.java b/src/simulation/ComponentType.java index d3fee65..9afe438 100644 --- a/src/simulation/ComponentType.java +++ b/src/simulation/ComponentType.java @@ -1,4 +1,4 @@ -package model; +package simulation; import java.util.Arrays; import java.util.Objects; diff --git a/src/simulation/Factory.java b/src/simulation/Factory.java index 0123bf4..1e2350a 100644 --- a/src/simulation/Factory.java +++ b/src/simulation/Factory.java @@ -1,4 +1,4 @@ -package model; +package simulation; public class Factory extends Building { public Factory(int id, String type, int x, int y) { diff --git a/src/simulation/Route.java b/src/simulation/Route.java index 6e9bdfd..0750b62 100644 --- a/src/simulation/Route.java +++ b/src/simulation/Route.java @@ -1,4 +1,4 @@ -package model; +package simulation; import java.util.Objects; diff --git a/src/simulation/Warehouse.java b/src/simulation/Warehouse.java index f0a6d29..8e50e7e 100644 --- a/src/simulation/Warehouse.java +++ b/src/simulation/Warehouse.java @@ -1,14 +1,40 @@ -package model; +package simulation; + +import configuration.SimulationConfigurationSingleton; +import metadata.WarehouseMetadata; + +import java.util.ArrayList; +import java.util.Collection; + +public class Warehouse extends Building implements WarehouseSubject { + private final Collection planes = new ArrayList<>(); + private final Collection observers = new ArrayList<>(); + private final int capacity = ((WarehouseMetadata) SimulationConfigurationSingleton.getInstance() + .getConfiguration().getMetadata().get(getType())) + .getInput().getCapacity(); -public class Warehouse extends Building { public Warehouse(int id, String type, int x, int y) { super(id, type, x, y); } @Override public void processInput(Component input) { + planes.add(input); } private void sellComponent() { } + + public void attach(WarehouseObserver observer) { + observers.add(observer); + } + + public void dettach(WarehouseObserver observer) { + observers.remove(observer); + } + + public void notifyObservers() { + boolean isFull = planes.size() >= capacity; + observers.forEach(o -> o.update(isFull)); + } } diff --git a/src/simulation/WarehouseObserver.java b/src/simulation/WarehouseObserver.java index 566d591..dc3adc0 100644 --- a/src/simulation/WarehouseObserver.java +++ b/src/simulation/WarehouseObserver.java @@ -1,2 +1,10 @@ -package simulation;public interface WarehouseObserver { +package simulation; + +public interface WarehouseObserver { + /** + * Méthode appelée lorsque l'état d'un entrepot change. + * + * @param full Si l'entrepot est plein ou non + */ + void update(boolean full); } diff --git a/src/simulation/WarehouseSubject.java b/src/simulation/WarehouseSubject.java index 5ce127e..2e2c09b 100644 --- a/src/simulation/WarehouseSubject.java +++ b/src/simulation/WarehouseSubject.java @@ -1,2 +1,7 @@ -package simulation;public class WarehouseSubject { +package simulation; + +public interface WarehouseSubject { + void attach(WarehouseObserver observer); + void dettach(WarehouseObserver observer); + void notifyObservers(); } diff --git a/src/view/MainPanel.java b/src/view/MainPanel.java index 2558700..2f14812 100644 --- a/src/view/MainPanel.java +++ b/src/view/MainPanel.java @@ -1,23 +1,88 @@ package view; +import configuration.SimulationConfiguration; +import configuration.SimulationConfigurationSingleton; +import configuration.SimulationData; +import metadata.BuildingMetadata; +import simulation.Building; +import simulation.BuildingState; +import simulation.Route; + +import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.io.Serial; +import java.util.HashMap; +import java.util.Map; public class MainPanel extends JPanel { @Serial private static final long serialVersionUID = 1L; - private Point position = new Point(0, 0); - private Point speed = new Point(1, 1); - private int size = 32; + private final Map icons = new HashMap<>(); + private final Map buildingsById = new HashMap<>(); + + private SimulationConfiguration configuration; + private SimulationData simulationData; + + public void reloadSimulation() { + configuration = SimulationConfigurationSingleton.getInstance().getConfiguration(); + simulationData = configuration.getSimulationData(); + + buildingsById.clear(); + simulationData.getBuildings().forEach(b -> buildingsById.put(b.getId(), b)); + + icons.clear(); + configuration.getMetadata().values().forEach(m -> { + try { + loadImage(m); + } catch (IOException e) { + System.err.println("Could not load simulation icons"); + } + }); + } @Override public void paint(Graphics g) { super.paint(g); // On ajoute à la position le delta x et y de la vitesse - position.translate(speed.x, speed.y); - g.fillRect(position.x, position.y, size, size); +// position.translate(speed.x, speed.y); +// g.fillRect(position.x, position.y, size, size); + + if (configuration == null) return; + + simulationData.getRoutes().forEach(r -> paintRoute(r, g)); + simulationData.getBuildings().forEach(b -> paintBuilding(b, g)); + } + + private void paintBuilding(Building building, Graphics g) { + Image icon = icons.get(building.getType()); + g.drawImage(icon, building.getX(), building.getY(), null); + } + + private void paintRoute(Route route, Graphics g) { + Building fromBuilding = buildingsById.get(route.getFrom()); + Image fromIcon = icons.get(fromBuilding.getType()); + + Building toBuilding = buildingsById.get(route.getTo()); + Image toIcon = icons.get(toBuilding.getType()); + + g.drawLine( + fromBuilding.getX() + fromIcon.getWidth(null) / 2, + fromBuilding.getY() + fromIcon.getHeight(null) / 2, + toBuilding.getX() + toIcon.getWidth(null) / 2, + toBuilding.getY() + toIcon.getHeight(null) / 2 + ); + } + + private void loadImage(BuildingMetadata metadata) throws IOException { + String iconPath = metadata.getIconsPaths().get(BuildingState.EMPTY); + BufferedImage image = ImageIO.read(new File(iconPath)); + + icons.put(metadata.getType(), image); } } diff --git a/src/view/MainWindow.java b/src/view/MainWindow.java index c23a3f2..db65f62 100644 --- a/src/view/MainWindow.java +++ b/src/view/MainWindow.java @@ -14,7 +14,7 @@ public class MainWindow extends JFrame implements PropertyChangeListener { public MainWindow() { MainPanel mainPanel = new MainPanel(); - WindowMenu menu = new WindowMenu(); + WindowMenu menu = new WindowMenu(mainPanel); add(mainPanel); add(menu, BorderLayout.NORTH); @@ -38,7 +38,7 @@ public class MainWindow extends JFrame implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent event) { if (event.getPropertyName().equals("TEST")) { repaint(); - System.out.println(event.getNewValue()); +// System.out.println(event.getNewValue()); } } } diff --git a/src/view/WindowMenu.java b/src/view/WindowMenu.java index 9791372..0a84b3c 100644 --- a/src/view/WindowMenu.java +++ b/src/view/WindowMenu.java @@ -1,5 +1,7 @@ package view; +import configuration.*; + import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.filechooser.FileSystemView; @@ -18,7 +20,12 @@ public class WindowMenu extends JMenuBar { private static final String MENU_HELP_TITLE = "Aide"; private static final String MENU_HELP_ABOUT = "À propos de..."; - public WindowMenu() { + private final ConfigurationParser configParser = new XmlConfigurationParser(); + private final MainPanel mainPanel; + + public WindowMenu(MainPanel mainPanel) { + this.mainPanel = mainPanel; + addFileMenu(); addSimulationMenu(); addHelpMenu(); @@ -42,9 +49,17 @@ public class WindowMenu extends JMenuBar { int returnValue = fileChooser.showOpenDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { - // TODO - Parser le fichier XML sélectionné File selectedFile = fileChooser.getSelectedFile(); - System.out.println(selectedFile.getAbsoluteFile()); + + try { + SimulationConfiguration configuration = configParser.parseConfiguration(selectedFile); + SimulationConfigurationSingleton.getInstance().setConfiguration(configuration); + + mainPanel.reloadSimulation(); + } catch (ConfigurationParsingException ex) { + // TODO WN: Handle exception + throw new RuntimeException("Failed to parse config file", ex); + } } }); @@ -85,7 +100,7 @@ public class WindowMenu extends JMenuBar { aboutMenu.addActionListener((ActionEvent e) -> { JOptionPane.showMessageDialog(null, - "

Application simulation une chaine de production d'avions.


" + + "

Application de simulation une chaine de production d'avions.


" + "

©   2017   Ghizlane El Boussaidi

" + "

©   2017   Dany Boisvert

" + "

©   2017   Vincent Mattard


" +