Author: [log in to unmask] Date: Sat Mar 7 16:05:59 2015 New Revision: 2358 Log: Merge fixes from trunk to monitoring-app dev branch. Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/AIDAServer.java Removed: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java Modified: java/branches/monitoring-app-dev/ (props changed) java/branches/monitoring-app-dev/pom.xml java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/Commands.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/Configuration.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java Modified: java/branches/monitoring-app-dev/pom.xml ============================================================================= --- java/branches/monitoring-app-dev/pom.xml (original) +++ java/branches/monitoring-app-dev/pom.xml Sat Mar 7 16:05:59 2015 @@ -130,5 +130,10 @@ <artifactId>jlfgr</artifactId> <version>1.0</version> </dependency> + <dependency> + <groupId>org.freehep</groupId> + <artifactId>freehep-jaida-remote</artifactId> + <version>3.4.11</version> + </dependency> </dependencies> </project> Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/Commands.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/Commands.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/Commands.java Sat Mar 7 16:05:59 2015 @@ -41,6 +41,9 @@ static final String EXIT = "exit"; static final String LOG_LEVEL_FILTER_CHANGED = "logLevelFilterChanged"; + + static final String START_AIDA_SERVER = "startAIDAServer"; + static final String STOP_AIDA_SERVER = "stopAIDAServer"; //////////////////////////////////////////// static final String BLOCKING_CHANGED = "blockingChanged"; Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java Sat Mar 7 16:05:59 2015 @@ -11,7 +11,6 @@ import javax.swing.JComboBox; import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem; -import org.hps.monitoring.application.model.ConfigurationListener; import org.hps.monitoring.application.model.ConfigurationModel; import org.hps.monitoring.application.model.ConnectionStatus; import org.hps.monitoring.application.model.ConnectionStatusModel; @@ -28,7 +27,7 @@ * * @author Jeremy McCormick <[log in to unmask]> */ -class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener, ConfigurationListener { +class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener{ ConnectionStatusModel connectionModel; ConfigurationModel configurationModel; @@ -65,16 +64,9 @@ setEditable(false); this.configurationModel = configurationModel; connectionModel.addPropertyChangeListener(this); - configurationModel.addConfigurationListener(this); + configurationModel.addPropertyChangeListener(this); } - void setSelectedItem() { - DataSourceItem item = findItem(configurationModel.getDataSourcePath(), getDataSourceType(configurationModel.getDataSourcePath())); - if (item != null) { - setSelectedItem(item); - } - } - boolean contains(DataSourceItem item) { return ((DefaultComboBoxModel<DataSourceItem>) getModel()).getIndexOf(item) != -1; } @@ -91,12 +83,35 @@ setEnabled(false); } } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) { - String path = configurationModel.getDataSourcePath(); - DataSourceType type = getDataSourceType(path); - addDataSourceItem(path, type); - setSelectedItem(); + if (configurationModel.hasValidProperty(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) { + String path = configurationModel.getDataSourcePath(); + DataSourceType type = getDataSourceType(path); + if (type.isFile()) { + DataSourceItem item = findItem(path, type); + if (item == null) { + item = addDataSourceItem(path, type); + } + if (configurationModel.getDataSourceType().isFile()) { + setSelectedItem(item); + } + } + } } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) { - setSelectedItem(); + if (configurationModel.getDataSourceType() == DataSourceType.ET_SERVER) { + DataSourceItem item = findEtItem(); + if (item == null) { + item = new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER); + } + setSelectedItem(item); + } else { + if (configurationModel.hasValidProperty(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) { + DataSourceItem item = findItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); + if (item == null) { + item = addDataSourceItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); + } + setSelectedItem(item); + } + } } else if (evt.getPropertyName().equals(ConfigurationModel.HOST_PROPERTY)) { updateEtItem(); } else if (evt.getPropertyName().equals(ConfigurationModel.ET_NAME_PROPERTY)) { @@ -125,46 +140,18 @@ // Update the model with data source settings. configurationModel.removePropertyChangeListener(this); DataSourceItem item = (DataSourceItem) getSelectedItem(); - configurationModel.setDataSourceType(item.type); - if (item.type != DataSourceType.ET_SERVER) { - configurationModel.setDataSourcePath(item.name); + if (item != null) { + configurationModel.setDataSourceType(item.type); + if (item.type != DataSourceType.ET_SERVER) { + configurationModel.setDataSourcePath(item.name); + } } } finally { configurationModel.addPropertyChangeListener(this); } } } - - public void configurationChanged(ConfigurationModel configurationModel) { - - // Clear the data source list. - removeAllItems(); - - // Add the default ET item. - this.removeActionListener(this); - try { - addItem(new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER)); - - // Add a file source if one has been provided. - if (configurationModel.getDataSourcePath() != null) { - // Add an item for this data source. - DataSourceItem newItem = new DataSourceItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); - //System.out.println("adding new item " + newItem.name + " " + newItem.type); - addItem(newItem); - if (configurationModel.getDataSourceType().isFile()) { - //System.out.println("setting selected"); - setSelectedItem(newItem); - } - } - } finally { - this.addActionListener(this); - } - - // Don't add as property change listener until after configuration has been initialized. - configurationModel.removePropertyChangeListener(this); - configurationModel.addPropertyChangeListener(this); - } - + public void addItem(DataSourceItem item) { // Do not add invalid looking items. if (item.name == null || item.name.length() == 0) { @@ -196,15 +183,19 @@ return null; } - void addDataSourceItem(String path, DataSourceType type) { + DataSourceItem addDataSourceItem(String path, DataSourceType type) { DataSourceItem newItem = new DataSourceItem(path, type); - if (!contains(newItem)) { - addItem(newItem); - } + addItem(newItem); + return newItem; } void updateEtItem() { DataSourceItem item = findEtItem(); - item.name = configurationModel.getEtPath(); + if (item == null) { + item = new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER); + addItem(item); + } else { + item.name = configurationModel.getEtPath(); + } } } Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java Sat Mar 7 16:05:59 2015 @@ -39,6 +39,7 @@ JMenuItem closeFileItem; JMenuItem openFileItem; JMenu settingsMenu; + JMenuItem serverItem; ConfigurationModel configurationModel; MenuBar(ConfigurationModel configurationModel, ConnectionStatusModel connectionModel, ActionListener listener) { @@ -118,13 +119,21 @@ savePlotsItem.setToolTipText("Save plots to AIDA file"); plotsMenu.add(savePlotsItem); - JMenuItem clearPlotsItem = new JMenuItem("Clear plots"); + JMenuItem clearPlotsItem = new JMenuItem("Clear Plots"); clearPlotsItem.setMnemonic(KeyEvent.VK_C); clearPlotsItem.setActionCommand(CLEAR_PLOTS); clearPlotsItem.addActionListener(listener); clearPlotsItem.setEnabled(true); clearPlotsItem.setToolTipText("Clear the AIDA plots"); plotsMenu.add(clearPlotsItem); + + serverItem = new JMenuItem("Start AIDA Server"); + serverItem.setMnemonic(KeyEvent.VK_A); + serverItem.setActionCommand(Commands.START_AIDA_SERVER); + serverItem.setEnabled(true); + serverItem.setToolTipText("Start AIDA RMI server"); + serverItem.addActionListener(listener); + plotsMenu.add(serverItem); JMenu toolsMenu = new JMenu("Tools"); toolsMenu.setMnemonic(KeyEvent.VK_T); @@ -165,54 +174,6 @@ defaultsItem.setEnabled(true); defaultsItem.setToolTipText("Restore the window defaults"); windowMenu.add(defaultsItem); - - /* - - JMenu logMenu = new JMenu("Log"); - logMenu.setMnemonic(KeyEvent.VK_L); - add(logMenu); - - logItem = new JMenuItem("Redirect to File ..."); - logItem.setMnemonic(KeyEvent.VK_F); - logItem.setActionCommand(CHOOSE_LOG_FILE); - //logItem.addActionListener(this); - logItem.setEnabled(true); - logItem.setToolTipText("Redirect std out and err to a file."); - logMenu.add(logItem); - - terminalItem = new JMenuItem("Redirect to Terminal"); - terminalItem.setMnemonic(KeyEvent.VK_T); - terminalItem.setActionCommand(LOG_TO_TERMINAL); - //terminalItem.addActionListener(this); - terminalItem.setEnabled(false); - terminalItem.setToolTipText("Redirect std out and err back to the terminal."); - logMenu.add(terminalItem); - - JMenuItem saveLogItem = new JMenuItem("Save Log Table to File ..."); - saveLogItem.setMnemonic(KeyEvent.VK_S); - saveLogItem.setActionCommand(SAVE_LOG_TABLE); - //saveLogItem.addActionListener(this); - saveLogItem.setToolTipText("Save the log records to a tab delimited text file."); - logMenu.add(saveLogItem); - - JMenuItem clearLogItem = new JMenuItem("Clear Log Table"); - //clearLogItem.addActionListener(this); - clearLogItem.setMnemonic(KeyEvent.VK_C); - clearLogItem.setActionCommand(CLEAR_LOG_TABLE); - clearLogItem.setToolTipText("Clear the log table of all messages."); - logMenu.add(clearLogItem); - - JMenu utilMenu = new JMenu("Util"); - plotsMenu.setMnemonic(KeyEvent.VK_U); - add(utilMenu); - - JMenuItem screenshotItem = new JMenuItem("Take a Screenshot ..."); - screenshotItem.setMnemonic(KeyEvent.VK_N); - screenshotItem.setActionCommand(SCREENSHOT); - //screenshotItem.addActionListener(this); - screenshotItem.setToolTipText("Save a screenshot to file"); - utilMenu.add(screenshotItem); - */ } @Override @@ -236,4 +197,19 @@ } } + void setServerConnected(boolean connected) { + if (connected) { + serverItem = new JMenuItem("Stop AIDA Server"); + serverItem.setMnemonic(KeyEvent.VK_A); + serverItem.setActionCommand(Commands.STOP_AIDA_SERVER); + serverItem.setEnabled(true); + serverItem.setToolTipText("Stop the running AIDA RMI server"); + } else { + serverItem = new JMenuItem("Start AIDA Server"); + serverItem.setMnemonic(KeyEvent.VK_A); + serverItem.setActionCommand(Commands.START_AIDA_SERVER); + serverItem.setEnabled(true); + serverItem.setToolTipText("Start AIDA RMI server"); + } + } } Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java Sat Mar 7 16:05:59 2015 @@ -32,13 +32,13 @@ import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; -import org.hps.conditions.database.DatabaseConditionsManager; import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem; import org.hps.monitoring.application.LogTable.LogRecordModel; import org.hps.monitoring.application.model.Configuration; import org.hps.monitoring.application.model.ConfigurationModel; import org.hps.monitoring.application.model.ConnectionStatusModel; import org.hps.monitoring.application.model.RunModel; +import org.hps.monitoring.application.util.AIDAServer; import org.hps.monitoring.application.util.DialogUtil; import org.hps.monitoring.application.util.ErrorHandler; import org.hps.monitoring.application.util.EvioFileFilter; @@ -94,6 +94,8 @@ // Encapsulation of ET connection and event processing. EventProcessing processing; + + AIDAServer server = new AIDAServer("hps-monitoring"); // Filters for opening files. static final FileFilter lcioFilter = new FileNameExtensionFilter("LCIO files", "slcio"); @@ -229,7 +231,11 @@ saveLogTable(); } else if (Commands.CLEAR_LOG_TABLE.equals(cmd)) { getLogRecordModel().clear(); - } + } else if (Commands.START_AIDA_SERVER.equals(cmd)) { + startAIDAServer(); + } else if (Commands.STOP_AIDA_SERVER.equals(cmd)) { + stopAIDAServer(); + } } /** @@ -280,6 +286,10 @@ * @param configuration The new configuration. */ void loadConfiguration(Configuration configuration) { + + // HACK: Clear data source combo box for new config. + frame.dataSourceComboBox.removeAllItems(); + // Set the Configuration on the ConfigurationModel which will trigger all the PropertyChangelListeners. configurationModel.setConfiguration(configuration); if (configuration.getFile() != null) @@ -640,4 +650,28 @@ void saveLogTable() { saveTable(frame.logPanel.logTable); } + + /** + * Start the AIDA RMI server. + */ + void startAIDAServer() { + boolean started = server.start(); + frame.menu.setServerConnected(started); + if (started) { + logger.info("AIDA server started at " + server.getName()); + DialogUtil.showInfoDialog(frame, "AIDA Server Started", "The AIDA server was started."); + } else { + DialogUtil.showErrorDialog(frame, "AIDA Server Error", "The AIDA server failed to start."); + } + } + + /** + * Stop the AIDA server. + */ + void stopAIDAServer() { + server.disconnect(); + frame.menu.setServerConnected(false); + logger.info("AIDA server stopped"); + DialogUtil.showInfoDialog(frame, "AIDA Server Stopped", "The AIDA server was stopped."); + } } Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java Sat Mar 7 16:05:59 2015 @@ -30,6 +30,7 @@ SystemStatusTable systemStatusTable; JPanel buttonsPanel; TriggerDiagnosticsPanel triggerPanel; + MenuBar menu; JSplitPane mainSplitPane; JSplitPane rightSplitPane; @@ -120,6 +121,7 @@ // Vertical split pane in left panel. leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, runPanel, tableTabbedPane); + leftSplitPane.setResizeWeight(0.5); leftPanel.add(leftSplitPane, BorderLayout.CENTER); // Create the right panel. @@ -146,7 +148,7 @@ bottomPanel.add(mainSplitPane, BorderLayout.CENTER); // Create the menu bar. - MenuBar menu = new MenuBar(application.configurationModel, application.connectionModel, application); + menu = new MenuBar(application.configurationModel, application.connectionModel, application); setJMenuBar(menu); dataSourceComboBox.addActionListener(menu); Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/Configuration.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/Configuration.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/Configuration.java Sat Mar 7 16:05:59 2015 @@ -75,7 +75,11 @@ * @return True if configuration has value for the key. */ boolean hasKey(String key) { - return properties.getProperty(key) != null; + try { + return properties.containsKey(key); + } catch (java.lang.NullPointerException e) { + return false; + } } /** @@ -164,7 +168,7 @@ * @param key The properties key. * @return True if properties key is valid. */ - private boolean checkKey(String key) { + boolean checkKey(String key) { return hasKey(key) && properties.getProperty(key) != null; } Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java Sat Mar 7 16:05:59 2015 @@ -1,8 +1,6 @@ package org.hps.monitoring.application.model; import java.io.File; -import java.util.ArrayList; -import java.util.List; import java.util.logging.Level; import org.hps.record.enums.DataSourceType; @@ -16,8 +14,6 @@ public final class ConfigurationModel extends AbstractModel { Configuration configuration; - - List<ConfigurationListener> listeners = new ArrayList<ConfigurationListener>(); // Job setting properties. public static final String DETECTOR_NAME_PROPERTY = "DetectorName"; @@ -69,22 +65,11 @@ fireModelChanged(); } - public void addConfigurationListener(ConfigurationListener listener) { - listeners.add(listener); - } - public void setConfiguration(Configuration configuration) { this.configuration = configuration; fireModelChanged(); - fireConfigurationChanged(); - } - - void fireConfigurationChanged() { - for (ConfigurationListener listener : listeners) { - listener.configurationChanged(this); - } - } - + } + public Configuration getConfiguration() { return this.configuration; } @@ -423,7 +408,7 @@ } public boolean hasValidProperty(String key) { - return configuration.hasKey(key) && configuration.get(key) != null; + return configuration.checkKey(key); } @Override Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/AIDAServer.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/AIDAServer.java (added) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/AIDAServer.java Sat Mar 7 16:05:59 2015 @@ -0,0 +1,72 @@ +package org.hps.monitoring.application.util; + +import hep.aida.dev.IDevTree; +import hep.aida.ref.remote.RemoteServer; +import hep.aida.ref.remote.rmi.RmiRemoteUtils; +import hep.aida.ref.remote.rmi.server.RmiServerImpl; + +import java.net.InetAddress; +import java.rmi.RemoteException; + +import org.lcsim.util.aida.AIDA; + +/** + * AIDA RMI server wrapper. + * @author Jeremy McCormick <[log in to unmask]> + */ +public class AIDAServer { + + RmiServerImpl server; + String name; + boolean connected = false; + + /** + * Class constructor. + * @param name The name of the AIDA server. + */ + public AIDAServer(String name) { + this.name = name; + } + + /** + * Start the remote AIDA server. + * @return True if server started successfully; false if an error occurred during initialization. + */ + public boolean start() { + RemoteServer treeServer = new RemoteServer((IDevTree) AIDA.defaultInstance().tree()); + try { + server = new RmiServerImpl(treeServer, "/" + name); + connected = true; + } + catch (Exception e) { + e.printStackTrace(); + connected = false; + } + return connected; + } + + /** + * Close the server down by disconnecting it. + */ + public void disconnect() { + server.disconnect(); + connected = false; + } + + /** + * True if connected. + * @return True if connected to server. + */ + public boolean connected() { + return connected; + } + + public String getName() { + try { + return InetAddress.getLocalHost().getCanonicalHostName() + server.getBindName() + ":" + RmiRemoteUtils.port; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +}