Author: [log in to unmask] Date: Thu Mar 12 13:26:04 2015 New Revision: 2414 Log: First working version of conditions data display in monitoring (dev branch). HPSJAVA-445 Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTable.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.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 Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTable.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTable.java (added) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTable.java Thu Mar 12 13:26:04 2015 @@ -0,0 +1,98 @@ +/** + * + */ +package org.hps.monitoring.application; + +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.hps.conditions.api.ConditionsObject; +import org.hps.conditions.api.ConditionsObjectCollection; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.database.TableMetaData; + +/** + * @author Jeremy McCormick <[log in to unmask]> + */ +public class ConditionsCollectionTable extends JTable { + + static class ConditionsTableModel extends AbstractTableModel { + + ConditionsObjectCollection<?> collection; + int columnCount; + int rowCount; + String[] columnNames; + DatabaseConditionsManager manager; + + ConditionsTableModel(DatabaseConditionsManager manager) { + this.manager = manager; + } + + void setTableName(String tableName) { + TableMetaData tableInfo = manager.findTableMetaData(tableName); + ConditionsObjectCollection<?> collection = + manager.getCachedConditions(tableInfo.getCollectionClass(), tableName).getCachedData(); + setCollection(collection); + } + + void setCollection(ConditionsObjectCollection<?> collection) { + + // Set collection data. + this.collection = collection; + rowCount = this.collection.size(); + + System.out.println(collection.getConditionsRecord().getTableName() + " has size " + collection.size() ); + + // Set column names and count from table meta data. + TableMetaData tableInfo = manager.findTableMetaData(collection.getConditionsRecord().getTableName()); + setupColumns(tableInfo); + + System.out.println("firing table changes"); + + fireTableStructureChanged(); + } + + private void setupColumns(TableMetaData tableInfo) { + + int fieldNameCount = tableInfo.getFieldNames().length; + columnCount = fieldNameCount + 1; + columnNames = new String[columnCount]; + columnNames[0] = "id"; + for (int i = 0; i < fieldNameCount; i++) { + columnNames[i + 1] = tableInfo.getFieldNames()[i]; + System.out.println("column " + (i + 1) + " = " + tableInfo.getFieldNames()[i]); + } + + System.out.println("column count set to " + columnCount); + } + + @Override + public int getRowCount() { + System.out.println("getRowCount - " + rowCount); + return rowCount; + } + + @Override + public int getColumnCount() { + return columnCount; + } + + @Override + public String getColumnName(int columnIndex) { + return columnNames[columnIndex]; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + System.out.println("getValueAt - " + rowIndex + " " + columnIndex); + ConditionsObject object = collection.get(rowIndex); + if (columnIndex == 0) { + System.out.println(" row id = " + object.getRowId()); + return object.getRowId(); + } else { + System.out.println(" " + columnNames[columnIndex] + " = " + object.getFieldValue(columnNames[columnIndex])); + return object.getFieldValue(columnNames[columnIndex]); + } + } + } +} Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java (added) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java Thu Mar 12 13:26:04 2015 @@ -0,0 +1,73 @@ +package org.hps.monitoring.application; + +import javax.swing.table.AbstractTableModel; + +import org.hps.conditions.api.ConditionsObject; +import org.hps.conditions.api.ConditionsObjectCollection; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.database.TableMetaData; + +/** + * + * @author Jeremy McCormick <[log in to unmask]> + * + */ +class ConditionsCollectionTableModel extends AbstractTableModel { + + ConditionsObjectCollection<?> collection; + int columnCount; + int rowCount; + String[] columnNames; + DatabaseConditionsManager manager; + + ConditionsCollectionTableModel(DatabaseConditionsManager manager, ConditionsObjectCollection<?> collection) { + + // Set collection data. + this.collection = collection; + rowCount = this.collection.size(); + + String tableName = collection.getConditionsRecord().getTableName(); + TableMetaData tableInfo = manager.findTableMetaData(tableName); + + // Set column names and count from table meta data. + setupColumns(tableInfo); + } + + private void setupColumns(TableMetaData tableInfo) { + int fieldNameCount = tableInfo.getFieldNames().length; + columnCount = fieldNameCount + 1; + columnNames = new String[columnCount]; + columnNames[0] = "id"; + for (int i = 0; i < fieldNameCount; i++) { + columnNames[i + 1] = tableInfo.getFieldNames()[i]; + System.out.println("column " + (i + 1) + " = " + tableInfo.getFieldNames()[i]); + } + + System.out.println("column count set to " + columnCount); + } + + @Override + public int getRowCount() { + return rowCount; + } + + @Override + public int getColumnCount() { + return columnCount; + } + + @Override + public String getColumnName(int columnIndex) { + return columnNames[columnIndex]; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + ConditionsObject object = collection.get(rowIndex); + if (columnIndex == 0) { + return object.getRowId(); + } else { + return object.getFieldValue(columnNames[columnIndex]); + } + } +} Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java (added) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java Thu Mar 12 13:26:04 2015 @@ -0,0 +1,91 @@ +/** + * + */ +package org.hps.monitoring.application; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; + +import org.hps.conditions.api.ConditionsObjectCollection; +import org.hps.conditions.api.ConditionsRecord; +import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.lcsim.conditions.ConditionsEvent; +import org.lcsim.conditions.ConditionsListener; + +/** + * @author Jeremy McCormick <[log in to unmask]> + * + */ +public class ConditionsPanel extends JPanel { + + JList<String> conditionsList = new JList<String>(); + JTable conditionsTable = new ConditionsCollectionTable(); + Map<String, ConditionsCollectionTableModel> tableModels; + + ConditionsPanel() { + super(new BorderLayout()); + + conditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + conditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + String tableName = (String) conditionsList.getSelectedValue(); + conditionsTable.setModel(tableModels.get(tableName)); + conditionsTable.revalidate(); + } + }); + + //conditionsList.setPreferredSize(new Dimension(150, 400)); + JScrollPane pane = new JScrollPane(conditionsTable); + conditionsTable.setModel(new DefaultTableModel()); + //conditionsTable.setPreferredSize(new Dimension(400, 400)); + //pane.setPreferredSize(new Dimension(300, 400)); + + add(conditionsList, BorderLayout.WEST); + add(pane, BorderLayout.EAST); + } + + class ConditionsPanelListener implements ConditionsListener { + + @Override + public void conditionsChanged(ConditionsEvent event) { + + DatabaseConditionsManager manager = (DatabaseConditionsManager) event.getConditionsManager(); + + tableModels = new LinkedHashMap<String, ConditionsCollectionTableModel>(); + + // Set list of table names. + ConditionsRecordCollection records = + manager.getCachedConditions(ConditionsRecordCollection.class, "conditions").getCachedData(); + records.sortByKey(); + conditionsList.removeAll(); + Set<String> tableNames = new LinkedHashSet<String>(); + for (ConditionsRecord record : records) { + tableNames.add(record.getTableName()); + } + conditionsList.setListData(tableNames.toArray(new String[] {})); + + // Create list of table models. + for (String tableName : tableNames) { + ConditionsObjectCollection<?> collection = manager.getCachedConditions( + manager.findTableMetaData(tableName).getCollectionClass(), + tableName).getCachedData(); + tableModels.put(tableName, new ConditionsCollectionTableModel(manager, collection)); + } + } + } +} Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java Thu Mar 12 13:26:04 2015 @@ -26,6 +26,7 @@ import org.hps.record.evio.EvioDetectorConditionsProcessor; import org.jlab.coda.et.exception.EtClosedException; import org.jlab.coda.et.exception.EtException; +import org.lcsim.conditions.ConditionsListener; import org.lcsim.conditions.ConditionsManager; import org.lcsim.conditions.ConditionsReader; import org.lcsim.util.Driver; @@ -43,6 +44,7 @@ SessionState sessionState; List<CompositeRecordProcessor> processors; List<Driver> drivers; + List<ConditionsListener> conditionsListeners; /** * This class is used to organize the objects for an event processing session. @@ -66,12 +68,14 @@ EventProcessing( MonitoringApplication application, List<CompositeRecordProcessor> processors, - List<Driver> drivers) { + List<Driver> drivers, + List<ConditionsListener> conditionsListeners) { this.application = application; this.sessionState = new SessionState(); this.logger = MonitoringApplication.logger; this.processors = processors; this.drivers = drivers; + this.conditionsListeners = conditionsListeners; } /** @@ -95,6 +99,13 @@ try { // Create and the job manager. The conditions manager is instantiated from this call but not configured. sessionState.jobManager = new JobManager(); + + // Add conditions listeners after new database conditions manager is initialized from job manager. + DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); + for (ConditionsListener conditionsListener : conditionsListeners) { + logger.config("adding conditions listener " + conditionsListener.getClass().getName()); + conditionsManager.addConditionsListener(conditionsListener); + } if (configurationModel.hasValidProperty(ConfigurationModel.DETECTOR_ALIAS_PROPERTY)) { // Set a detector alias. @@ -125,7 +136,6 @@ if (configurationModel.hasValidProperty(ConfigurationModel.USER_RUN_NUMBER_PROPERTY)) { int userRunNumber = configurationModel.getUserRunNumber(); String detectorName = configurationModel.getDetectorName(); - DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); logger.config("setting user run number " + userRunNumber + " with detector " + detectorName); conditionsManager.setDetector(configurationModel.getDetectorName(), userRunNumber); if (configurationModel.hasPropertyKey(ConfigurationModel.FREEZE_CONDITIONS_PROPERTY)) { @@ -439,7 +449,7 @@ * Create a connection to an ET system using current parameters from the GUI. If successful, the * application's ConnectionStatus is changed to CONNECTED. */ - void createEtConnection() { + synchronized void createEtConnection() { // Setup connection to ET system. sessionState.connection = EtSystemUtil.createEtConnection(application.configurationModel); 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 Thu Mar 12 13:26:04 2015 @@ -55,6 +55,7 @@ import org.hps.monitoring.subsys.SystemStatusRegistry; import org.hps.record.composite.CompositeRecordProcessor; import org.hps.record.enums.DataSourceType; +import org.lcsim.conditions.ConditionsListener; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; import org.lcsim.util.log.DefaultLogFormatter; @@ -82,10 +83,10 @@ PrintStream sysErr = System.err; // Application error handling. - final ErrorHandler errorHandler; + ErrorHandler errorHandler; // The main GUI components inside a JFrame. - final MonitoringApplicationFrame frame; + MonitoringApplicationFrame frame; // The primary data models. final RunModel runModel = new RunModel(); @@ -156,35 +157,46 @@ * @param configuration The Configuration object containing application settings. */ MonitoringApplication(Configuration configuration) { - - // Setup the main GUI component. - frame = new MonitoringApplicationFrame(this); - - // Setup the error handler. - errorHandler = new ErrorHandler(frame, logger); + + try { + + // Setup the main GUI component. + frame = new MonitoringApplicationFrame(this); + + // Setup the error handler. + errorHandler = new ErrorHandler(frame, logger); - // Add this class as a listener on the configuration model. - configurationModel.addPropertyChangeListener(this); - - // Setup the logger. - setupLogger(); + // Add this class as a listener on the configuration model. + configurationModel.addPropertyChangeListener(this); + + // Setup the logger. + setupLogger(); - // Setup AIDA plotting and connect it to the GUI. - setupAida(); - - // Set the configuration. - if (configuration != null) { - // There was a user specified configuration. - this.configuration = configuration; - } else { - // Use the default configuration. - this.configuration = new Configuration(DEFAULT_CONFIGURATION); - } + // Setup AIDA plotting and connect it to the GUI. + setupAida(); + + // Set the configuration. + if (configuration != null) { + // There was a user specified configuration. + this.configuration = configuration; + } else { + // Use the default configuration. + this.configuration = new Configuration(DEFAULT_CONFIGURATION); + } - // Load the configuration. - loadConfiguration(this.configuration); - - logger.info("application initialized successfully"); + // Load the configuration. + loadConfiguration(this.configuration); + + frame.setEnabled(true); + + logger.info("application initialized successfully"); + + } catch (Exception e) { + System.err.println("MonitoringApplication failed to initialize without errors!"); + DialogUtil.showErrorDialog(null, "Error Starting Monitoring Application", "Monitoring application failed to initialize."); + e.printStackTrace(); + System.exit(1); + } } /** @@ -232,6 +244,7 @@ if (Commands.CONNECT.equals(command)) { startSession(); } else if (Commands.DISCONNECT.equals(command)) { + // TODO: Start this on new thread. processing.stop(); } else if (Commands.SAVE_PLOTS.equals(command)) { savePlots(); @@ -401,11 +414,16 @@ List<CompositeRecordProcessor> processors = new ArrayList<CompositeRecordProcessor>(); processors.add(frame.runPanel.new RunPanelUpdater()); + // Add Driver to update the trigger diagnostics tables. List<Driver> drivers = new ArrayList<Driver>(); drivers.add(frame.triggerPanel.new TriggerDiagnosticGUIDriver()); - - // Initialize event processing with the list of processors and reference to the application. - processing = new EventProcessing(this, processors, drivers); + + // Add listener to push conditions changes to conditions panel. + List<ConditionsListener> conditionsListeners = new ArrayList<ConditionsListener>(); + conditionsListeners.add(frame.conditionsPanel.new ConditionsPanelListener()); + + // Instantiate the event processing wrapper. + processing = new EventProcessing(this, processors, drivers, conditionsListeners); // Connect to the ET system, if applicable. processing.connect(); 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 Thu Mar 12 13:26:04 2015 @@ -30,6 +30,7 @@ SystemStatusTable systemStatusTable; JPanel buttonsPanel; TriggerDiagnosticsPanel triggerPanel; + ConditionsPanel conditionsPanel; MenuBar menu; JSplitPane mainSplitPane; @@ -54,6 +55,9 @@ */ public MonitoringApplicationFrame( MonitoringApplication application) { + + // Disable interaction until specifically enabled externally after initialization. + setEnabled(false); // Create the content panel. JPanel contentPanel = new JPanel(); @@ -118,6 +122,10 @@ // Add the trigger diagnostics tables. triggerPanel = new TriggerDiagnosticsPanel(); tableTabbedPane.addTab("Trigger Diagnostics", triggerPanel); + + // Add the conditions panel. + conditionsPanel = new ConditionsPanel(); + tableTabbedPane.addTab("Detector Conditions", conditionsPanel); // Vertical split pane in left panel. leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, runPanel, tableTabbedPane);