Print

Print


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