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);
|