Browse Source

Adds Edit->Mange Collectors PopUp

Andreas T. Meyer-Berg 5 years ago
parent
commit
d6d7b95cc7

+ 8 - 1
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/MenuBar.java

@@ -15,6 +15,7 @@ import javax.swing.JOptionPane;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.AboutPopUp;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.EditAlgorithmsPopUp;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.EditCollectorsPopUp;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.NetworkTreeWindow;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.SettingsPopUp;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups.SimulationConfigurator;
@@ -112,11 +113,17 @@ public class MenuBar extends JMenuBar {
 		});
 		mnEdit.add(mntmTreeView);
 		
-		JMenuItem mntmManageAlgos = new JMenuItem("ManageAlgos");
+		JMenuItem mntmManageAlgos = new JMenuItem("Manage Algorithms");
 		mntmManageAlgos.addActionListener(a -> {
 			new EditAlgorithmsPopUp(controller, this.getParent());
 		});
 		mnEdit.add(mntmManageAlgos);
+		
+		JMenuItem mntmManageCollectors = new JMenuItem("Manage Collectors");
+		mntmManageCollectors.addActionListener(a -> {
+			new EditCollectorsPopUp(controller, this.getParent());
+		});
+		mnEdit.add(mntmManageCollectors);
 	}
 	
 	/**

+ 256 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/popups/EditCollectorsPopUp.java

@@ -0,0 +1,256 @@
+package de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups;
+
+import javax.swing.JDialog;
+import javax.swing.JList;
+
+
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.PacketCaptureController;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.SimulationController;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.NetworkManipulationAlgorithm;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.PacketCollector;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.util.Utility;
+
+import java.awt.Container;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.Iterator;
+import java.util.Observable;
+import java.util.Observer;
+
+import javax.swing.JButton;
+
+
+/**
+ * PopUp for managing the Collectors/PacketSniffers
+ *
+ * @author Andreas T. Meyer-Berg
+ */
+public class EditCollectorsPopUp extends JDialog implements Observer {
+	/**
+	 * serial
+	 */
+	private static final long serialVersionUID = 1L;
+	
+	/**
+	 * Controller for manipulating the simulation and adding algorithms
+	 */
+	private Controller controller;
+	
+	/**
+	 * Simulation controller for access to the algorithms
+	 */
+	private SimulationController sim;
+	
+	/**
+	 * Packet captureController
+	 */
+	private PacketCaptureController captureController;
+	
+	/**
+	 * Jlist for listing the PacketListener
+	 */
+	private JList<String> list;
+	
+	/**
+	 * Scroll Pane for scrolling in the Algorithm list
+	 */
+	private JScrollPane scrollPanelList;
+	
+	/**
+	 * Mutex, to disable listeners on update
+	 */
+	private boolean mutex = true;
+	/**
+	 * Reference to this
+	 */
+	private EditCollectorsPopUp that = this;
+	
+	/**
+	 * Creates and shows a new EditAlgorithmPopUp
+	 * @param controller controller
+	 * @param parent parent container the location should be set relative to
+	 */
+	public EditCollectorsPopUp(Controller controller, Container parent) {
+		this.controller = controller;
+		sim = this.controller.getSimulationController();
+		captureController = sim.getPacketCaptureController();
+		captureController.addObserver(this);
+		this.setSize(400, 400);
+		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+		setTitle("Manage PacketCollectors/PacketSniffers");
+		this.setIconImage(Utility.loadFile("images/smartHome_icon.png"));
+		getContentPane().setLayout(null);
+		
+		list = null;
+
+		//TODO: Maybe create PacketSniffer ?
+		JButton btnImportAlgorithm = new JButton("Import Algorithm");
+		btnImportAlgorithm.setToolTipText("Import new algorithm, which will be executed after each time step.");
+		btnImportAlgorithm.setBounds(220, 130, 160, 25);
+		getContentPane().add(btnImportAlgorithm);
+		btnImportAlgorithm.addActionListener(a->{
+			if(mutex)
+				return;
+			/**
+			 * PopUp for importing NetworkManipulationAlgo
+			 */
+			ImportPopUp<NetworkManipulationAlgorithm> popUp = new ImportPopUp<NetworkManipulationAlgorithm>(this, NetworkManipulationAlgorithm.class);
+			/**
+			 * Imported Class
+			 */
+			Class<? extends NetworkManipulationAlgorithm> imported = null;
+			/**
+			 * Instance of imported Algorithm class
+			 */
+			NetworkManipulationAlgorithm importedAlgo = null;
+			try {
+				imported = popUp.showPopUp();
+			} catch (Exception e1) {
+				JOptionPane.showMessageDialog(this, "Import failed: " + e1.getMessage());
+				return;
+			}
+			if (imported == null) {
+				// Import cancelled
+				return;
+			}
+			try {
+				/**
+				 * Create and add new instance
+				 */
+				importedAlgo = imported.newInstance();
+				sim.addAlgorithm(importedAlgo, controller);
+				//Refresh gui
+				update(null,null);
+			} catch (Exception e) {
+				JOptionPane.showMessageDialog(this, "Import failed: Missing empty constructor");
+			}
+		});
+		
+		JButton btnRemoveSelected = new JButton("Remove Selected");
+		btnRemoveSelected.setToolTipText("Remove the selected PacketCollector, it will no longer collect packets");
+		btnRemoveSelected.setBounds(220, 160, 160, 25);
+		getContentPane().add(btnRemoveSelected);
+		btnRemoveSelected.addActionListener(a->{
+			if(mutex)
+				return;
+			//TODO:
+			/**
+			 * Selected Index
+			 */
+			int index = list.getSelectedIndex();
+			if(index<0||index>=captureController.getPacketCollectors().size())
+				return;
+			/**
+			 * PacketCollector which should be removed
+			 */
+			PacketCollector p = null;
+			Iterator<PacketCollector> it = captureController.getPacketCollectors().iterator();
+			for(int i = 0; i<index&&it.hasNext();i++){
+				it.next();
+			}
+			if(it.hasNext()){
+				p=it.next();
+				captureController.removePacketCollector(p);
+			}
+		});
+		
+		JButton btnEditSelected = new JButton("Edit Selected");
+		btnEditSelected.setToolTipText("Edit the selected PacketCollector");
+		btnEditSelected.setBounds(220, 190, 160, 25);
+		btnEditSelected.addActionListener(a->{
+			if(mutex)
+				return;
+			//TODO:
+			/**
+			 * Selected Index
+			 */
+			int index = list.getSelectedIndex();
+			if(index<0||index>=captureController.getPacketCollectors().size())
+				return;
+			/**
+			 * PacketCollector which should be edited
+			 */
+			PacketCollector p = null;
+			Iterator<PacketCollector> it = captureController.getPacketCollectors().iterator();
+			for(int i = 0; i<index&&it.hasNext();i++){
+				it.next();
+			}
+			if(it.hasNext()){
+				p=it.next();
+				EditPacketSniffer popUp =new EditPacketSniffer(controller, that, p);
+				popUp.setEnabled(true);
+				popUp.setVisible(true);
+			}
+			
+		});
+		getContentPane().add(btnEditSelected);
+		
+		scrollPanelList = new JScrollPane();
+		scrollPanelList.setBounds(0, 0, 205, 375);
+		getContentPane().add(scrollPanelList);
+		
+		this.addWindowListener(new WindowAdapter() {
+			@Override
+			public void windowClosing(WindowEvent e) {
+				captureController.removeObserver(that);
+			}
+		});
+		update(null,null);
+		this.setResizable(false);
+		this.setLocationRelativeTo(parent);
+		this.setEnabled(true);
+		this.setVisible(true);
+	}
+
+	@Override
+	public void update(Observable o, Object arg) {
+		mutex = true;
+		/**
+		 * Update List
+		 */
+		/**
+		 * Names of the collectors
+		 */
+		String[] collectorNames = new String[captureController.getPacketCollectors().size()];
+		if(captureController.getPacketCollectors().size()!=0){
+		Iterator<PacketCollector> it = captureController.getPacketCollectors().iterator();
+			for(int i=0;i<captureController.getPacketCollectors().size();i++){
+				if(it.hasNext()){
+					PacketCollector p = it.next();
+					if(p.getPacketAlgorithm()==null){
+						collectorNames[i] = "Null";
+					}else{
+						collectorNames[i] = p.getPacketAlgorithm().getClass().getSimpleName();
+					}
+				}else{
+					collectorNames[i] = "Invalid Size";
+				}
+			}
+		}
+		/**
+		 * New list
+		 */
+		JList<String> newList = new JList<String>(collectorNames);
+		newList.setToolTipText("List of all currently active PacketCollectos/PacketSniffers.");
+		newList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+		
+		int pos = scrollPanelList.getVerticalScrollBar().getValue();
+
+		if(list!=null){
+			scrollPanelList.remove(list);
+			newList.setSelectedIndex(list.getSelectedIndex());		
+		}
+		scrollPanelList.setViewportView(newList);
+		scrollPanelList.getVerticalScrollBar().setValue(pos);
+		list = newList;
+		
+		this.repaint();
+		mutex = false;
+		
+	}
+}

+ 5 - 1
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/popups/EditPacketSniffer.java

@@ -260,7 +260,11 @@ public class EditPacketSniffer extends JDialog implements Observer {
 			Iterator<Link> it = collector.getLinks().iterator();
 			for(int i=0;i<collector.getLinks().size();i++){
 				if(it.hasNext()){
-					linkNames[i] = it.next().getName();
+					Link l = it.next();
+					if(l!=null && l.getName()!=null)
+						linkNames[i] = l.getName();
+					else
+						linkNames[i] = "null";
 				}else{
 					linkNames[i] = "invalid Size";
 				}