Author: [log in to unmask] Date: Tue Dec 9 16:31:46 2014 New Revision: 1664 Log: Add preliminary support for user specified run numbers in the monitoring app. Also included are a few fixes and error checks that I am still working on. Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/Commands.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/JobSettingsPanel.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/AbstractModel.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/Configuration.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/ConfigurationModel.java Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/Commands.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/Commands.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/Commands.java Tue Dec 9 16:31:46 2014 @@ -21,6 +21,7 @@ static final String DISCONNECT_ON_END_RUN_CHANGED = "disconnectOnEndRunChanged"; static final String EVENT_BUILDER_CHANGED = "eventBuilderChanged"; static final String EXIT = "exit"; + static final String FREEZE_CONDITIONS_CHANGED = "freezeConditionsChanged"; static final String LOAD_DEFAULT_CONFIG_FILE = "loadDefaultConfigFile"; static final String LOG_LEVEL_CHANGED = "logLevelChanged"; static final String LOG_TO_FILE = "logToFile"; @@ -42,6 +43,7 @@ static final String SHOW_SETTINGS = "showSettings"; static final String STEERING_TYPE_CHANGED = "steeringTypeChanged"; static final String STEERING_RESOURCE_CHANGED = "steeringResourceChanged"; + static final String USER_RUN_NUMBER_CHANGED = "userRunNumberChanged"; static final String VERBOSE_CHANGED = "verboseChanged"; static final String VALIDATE_DATA_FILE = "validateDataFile"; static final String WAIT_MODE_CHANGED = "waitModeChanged"; Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/JobSettingsPanel.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/JobSettingsPanel.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/JobSettingsPanel.java Tue Dec 9 16:31:46 2014 @@ -1,26 +1,7 @@ package org.hps.monitoring.gui; -import static org.hps.monitoring.gui.Commands.AIDA_AUTO_SAVE_CHANGED; -import static org.hps.monitoring.gui.Commands.DISCONNECT_ON_END_RUN_CHANGED; -import static org.hps.monitoring.gui.Commands.DISCONNECT_ON_ERROR_CHANGED; -import static org.hps.monitoring.gui.Commands.DETECTOR_NAME_CHANGED; -import static org.hps.monitoring.gui.Commands.EVENT_BUILDER_CHANGED; -import static org.hps.monitoring.gui.Commands.LOG_LEVEL_CHANGED; -import static org.hps.monitoring.gui.Commands.LOG_TO_FILE_CHANGED; -import static org.hps.monitoring.gui.Commands.STEERING_RESOURCE_CHANGED; -import static org.hps.monitoring.gui.Commands.STEERING_TYPE_CHANGED; -import static org.hps.monitoring.gui.model.ConfigurationModel.AIDA_AUTO_SAVE_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.AIDA_FILE_NAME_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.DETECTOR_NAME_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.DISCONNECT_ON_END_RUN_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.DISCONNECT_ON_ERROR_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.EVENT_BUILDER_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.LOG_FILE_NAME_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.LOG_LEVEL_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.LOG_TO_FILE_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.STEERING_FILE_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.STEERING_RESOURCE_PROPERTY; -import static org.hps.monitoring.gui.model.ConfigurationModel.STEERING_TYPE_PROPERTY; +import static org.hps.monitoring.gui.Commands.*; +import static org.hps.monitoring.gui.model.ConfigurationModel.*; import java.awt.GridBagLayout; import java.awt.Insets; @@ -65,19 +46,21 @@ */ class JobSettingsPanel extends AbstractFieldsPanel { - private JTextField aidaSaveFileNameField; - private JCheckBox aidaAutoSaveCheckbox; + private JComboBox<?> steeringResourcesComboBox; + private JTextField steeringFileField; + private JComboBox<?> steeringTypeComboBox; + private JComboBox<String> detectorNameComboBox; + private JComboBox<String> eventBuilderComboBox; + private JTextField userRunNumberField; + private JCheckBox freezeConditionsCheckBox; private JCheckBox disconnectOnErrorCheckBox; private JCheckBox disconnectOnEndRunCheckBox; - private JComboBox<String> detectorNameComboBox; - private JComboBox<String> eventBuilderComboBox; + private JTextField aidaSaveFileNameField; + private JCheckBox aidaAutoSaveCheckbox; private JTextField logFileNameField; private JComboBox<?> logLevelComboBox; private JCheckBox logToFileCheckbox; - private JTextField steeringFileField; - private JComboBox<?> steeringResourcesComboBox; - private JComboBox<?> steeringTypeComboBox; - + // The package where steering resources must be located. static final String STEERING_PACKAGE = "org/hps/steering/monitoring/"; @@ -105,42 +88,52 @@ super(new Insets(4, 2, 2, 4), true); setLayout(new GridBagLayout()); - disconnectOnErrorCheckBox = addCheckBox("Disconnect on error", false, true); - disconnectOnErrorCheckBox.setActionCommand(DISCONNECT_ON_ERROR_CHANGED); - disconnectOnErrorCheckBox.addActionListener(this); - - disconnectOnEndRunCheckBox = addCheckBox("Disconnect on end run", false, true); - disconnectOnEndRunCheckBox.setActionCommand(DISCONNECT_ON_END_RUN_CHANGED); - disconnectOnEndRunCheckBox.addActionListener(this); - - logLevelComboBox = addComboBox("Log Level", LOG_LEVELS); - logLevelComboBox.setActionCommand(Commands.LOG_LEVEL_CHANGED); - logLevelComboBox.addActionListener(this); - + steeringResourcesComboBox = addComboBoxMultiline("Steering File Resource", findSteeringResources(STEERING_PACKAGE)); + steeringResourcesComboBox.setActionCommand(STEERING_RESOURCE_CHANGED); + steeringResourcesComboBox.addActionListener(this); + + steeringFileField = addField("Steering File", 35); + steeringFileField.addPropertyChangeListener("value", this); + + JButton steeringFileButton = addButton("Select Steering File"); + steeringFileButton.setActionCommand(Commands.CHOOSE_STEERING_FILE); + steeringFileButton.addActionListener(this); + steeringTypeComboBox = addComboBox("Steering Type", new String[] { SteeringType.RESOURCE.name(), SteeringType.FILE.name() }); steeringTypeComboBox.setActionCommand(STEERING_TYPE_CHANGED); steeringTypeComboBox.addActionListener(this); - - steeringFileField = addField("Steering File", 35); - steeringFileField.addPropertyChangeListener("value", this); - - JButton steeringFileButton = addButton("Select Steering File"); - steeringFileButton.setActionCommand(Commands.CHOOSE_STEERING_FILE); - steeringFileButton.addActionListener(this); - - steeringResourcesComboBox = addComboBoxMultiline("Steering File Resource", findSteeringResources(STEERING_PACKAGE)); - steeringResourcesComboBox.setActionCommand(STEERING_RESOURCE_CHANGED); - steeringResourcesComboBox.addActionListener(this); - + detectorNameComboBox = addComboBox("Detector Name", this.findDetectorNames()); detectorNameComboBox.setActionCommand(DETECTOR_NAME_CHANGED); detectorNameComboBox.addActionListener(this); + userRunNumberField = addField("User Run Number", "", 10, false); + userRunNumberField.addPropertyChangeListener("value", this); + userRunNumberField.setActionCommand(USER_RUN_NUMBER_CHANGED); + userRunNumberField.setEnabled(true); + userRunNumberField.setEditable(true); + + freezeConditionsCheckBox = addCheckBox("Freeze detector conditions", false, true); + freezeConditionsCheckBox.addActionListener(this); + freezeConditionsCheckBox.setActionCommand(FREEZE_CONDITIONS_CHANGED); + eventBuilderComboBox = addComboBox("LCSim Event Builder", this.findEventBuilderClassNames()); eventBuilderComboBox.setSize(24, eventBuilderComboBox.getPreferredSize().height); eventBuilderComboBox.setActionCommand(EVENT_BUILDER_CHANGED); eventBuilderComboBox.addActionListener(this); + disconnectOnErrorCheckBox = addCheckBox("Disconnect on error", false, true); + disconnectOnErrorCheckBox.setActionCommand(DISCONNECT_ON_ERROR_CHANGED); + disconnectOnErrorCheckBox.addActionListener(this); + + disconnectOnEndRunCheckBox = addCheckBox("Disconnect on end run", false, true); + disconnectOnEndRunCheckBox.setActionCommand(DISCONNECT_ON_END_RUN_CHANGED); + disconnectOnEndRunCheckBox.addActionListener(this); + + logLevelComboBox = addComboBox("Log Level", LOG_LEVELS); + logLevelComboBox.setActionCommand(Commands.LOG_LEVEL_CHANGED); + logLevelComboBox.addActionListener(this); + logToFileCheckbox = addCheckBox("Log to File", false, false); logToFileCheckbox.setEnabled(false); logToFileCheckbox.setActionCommand(LOG_TO_FILE_CHANGED); @@ -154,7 +147,7 @@ aidaAutoSaveCheckbox.setActionCommand(AIDA_AUTO_SAVE_CHANGED); aidaSaveFileNameField = addField("AIDA Auto Save File Name", "", 30, false); - aidaSaveFileNameField.addPropertyChangeListener("value", this); + aidaSaveFileNameField.addPropertyChangeListener("value", this); } @Override @@ -192,6 +185,7 @@ logFileNameField.addActionListener(listener); logToFileCheckbox.addActionListener(listener); steeringResourcesComboBox.addActionListener(listener); + freezeConditionsCheckBox.addActionListener(listener); } /** @@ -270,7 +264,13 @@ configurationModel.setEventBuilderClassName((String) eventBuilderComboBox.getSelectedItem()); } else if (DETECTOR_NAME_CHANGED.equals(e.getActionCommand())) { configurationModel.setDetectorName((String) detectorNameComboBox.getSelectedItem()); - } + } else if (FREEZE_CONDITIONS_CHANGED.equals(e.getActionCommand())) { + if (configurationModel.hasPropertyValue(USER_RUN_NUMBER_PROPERTY) && configurationModel.getUserRunNumber() != null) { + configurationModel.setFreezeConditions(freezeConditionsCheckBox.isSelected()); + } else { + throw new IllegalArgumentException("Conditions system may only be frozen if there is a valid user run number."); + } + } } /** @@ -294,6 +294,27 @@ configurationModel.setAidaFileName(aidaSaveFileNameField.getText()); } else if (source == aidaAutoSaveCheckbox) { configurationModel.setAidaAutoSave(aidaAutoSaveCheckbox.isSelected()); + } else if (source == userRunNumberField) { + // Is run number being reset to null or empty? + if (userRunNumberField.getText() == null || userRunNumberField.getText().isEmpty()) { + System.out.println("resetting user run number back to null"); + // Update the model to null user run number and do not freeze the conditions system. + configurationModel.setUserRunNumber(null); + configurationModel.setFreezeConditions(false); + } else { + try { + System.out.println("setting new user run number " + evt.getNewValue()); + // Parse the run number. Need to catch errors because it might be an invalid string. + int userRunNumber = Integer.parseInt(userRunNumberField.getText()); + configurationModel.setUserRunNumber(userRunNumber); + configurationModel.setFreezeConditions(true); + System.out.println("successfully set run number to userRunNumber"); + } catch (NumberFormatException e) { + System.out.println("bad number format so ignoring user run number " + evt.getNewValue()); + userRunNumberField.setText((String) evt.getOldValue()); + throw new IllegalArgumentException("The value " + evt.getNewValue() + " is not a valid run number."); + } + } } } @@ -332,9 +353,24 @@ } else if (evt.getPropertyName().equals(STEERING_TYPE_PROPERTY)) { steeringTypeComboBox.setSelectedIndex(((SteeringType) value).ordinal()); } else if (evt.getPropertyName().equals(STEERING_FILE_PROPERTY)) { - steeringFileField.setText(((File) value).getPath()); + if (value != null) { + steeringFileField.setText(((File) value).getPath()); + } else { + // A null value here is actually okay and means this field should be reset to have no value. + steeringFileField.setText(null); + } } else if (evt.getPropertyName().equals(STEERING_RESOURCE_PROPERTY)) { steeringResourcesComboBox.setSelectedItem(value); + } else if (evt.getPropertyName().equals(USER_RUN_NUMBER_PROPERTY)) { + if (value != null) { + userRunNumberField.setText(Integer.toString((int)value)); + } else { + userRunNumberField.setText(null); + } + } else if (evt.getPropertyName().equals(FREEZE_CONDITIONS_PROPERTY)) { + if (value != null) { + freezeConditionsCheckBox.setSelected((Boolean) value); + } } } } Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java Tue Dec 9 16:31:46 2014 @@ -74,6 +74,7 @@ import javax.swing.table.DefaultTableModel; import org.freehep.record.loop.RecordLoop.Command; +import org.hps.conditions.database.DatabaseConditionsManager; import org.hps.job.JobManager; import org.hps.monitoring.enums.ConnectionStatus; import org.hps.monitoring.enums.SteeringType; @@ -335,7 +336,9 @@ return; Object value = evt.getNewValue(); if (evt.getPropertyName().equals(SAVE_LAYOUT_PROPERTY)) { - saveLayoutItem.setSelected((Boolean) value); + if (value != null) { + saveLayoutItem.setSelected((Boolean) value); + } } else if (evt.getPropertyName().equals(MONITORING_APPLICATION_LAYOUT_PROPERTY)) { updateWindowConfiguration(new WindowConfiguration((String) value)); } else if (evt.getPropertyName().equals(ConfigurationModel.SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY)) { @@ -351,15 +354,9 @@ System.err.println("ERROR: The plotWindow is null!"); } } else if (evt.getPropertyName().equals(ConfigurationModel.LOG_TO_FILE_PROPERTY)) { - - // System.out.println("propertyChange - " + evt.getPropertyName()); - // System.out.println(" value: " + value); - if ((Boolean) value == true) { - // System.out.println("setting logToFile - " + configurationModel.getLogFileName()); logToFile(new File(configurationModel.getLogFileName())); } else { - // System.out.println("setting logToTerminal"); logToTerminal(); } } @@ -552,7 +549,9 @@ saveLayoutItem.setActionCommand(SAVE_LAYOUT); saveLayoutItem.addActionListener(this); saveLayoutItem.setToolTipText("Include current GUI layout when saving settings."); - saveLayoutItem.setSelected(configurationModel.getSaveLayout()); + if (configurationModel.hasPropertyValue(ConfigurationModel.SAVE_LAYOUT_PROPERTY)) { + saveLayoutItem.setSelected(configurationModel.getSaveLayout()); + } saveLayoutItem.addPropertyChangeListener(this); applicationMenu.add(saveLayoutItem); @@ -651,7 +650,7 @@ logTableModel.insertRow(logTable.getRowCount(), row); // Print all messages to System.out so they show up in the terminal or log file output. - System.out.println(row[0] + " :: " + this.getClass().getSimpleName() + " :: " + row[1] + " :: " + row[2]); + System.out.println(row[0] + " :: " + MonitoringApplication.class.getSimpleName() + " :: " + row[1] + " :: " + row[2]); } public void close() throws SecurityException { @@ -1109,7 +1108,7 @@ log(Level.CONFIG, "Set steering to <" + steering + "> with type <" + (steeringType == SteeringType.RESOURCE ? "RESOURCE" : "FILE") + ">"); try { - // Create job manager and configure. + // Create and the job manager. The conditions manager is instantiated from this call but not configured. jobManager = new JobManager(); jobManager.setPerformDryRun(true); if (steeringType == SteeringType.RESOURCE) { @@ -1120,6 +1119,24 @@ // Setup the event builder to translate from EVIO to LCIO. createEventBuilder(); + + // Is there a user specified run number from the JobPanel? + if (configurationModel.hasPropertyValue(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.hasPropertyValue(ConfigurationModel.FREEZE_CONDITIONS_PROPERTY)) { + // Freeze the conditions system to ignore run numbers from the events. + logger.config("user configured to freeze conditions system from monitoring app"); + conditionsManager.freeze(); + } else { + // Allow run numbers to be picked up from the events. + logger.config("user run number specified but conditions system is NOT frozen"); + conditionsManager.unfreeze(); + } + } log(Level.INFO, "LCSim setup was successful."); @@ -1161,6 +1178,7 @@ } // Set the detector name on the event builder so it can find conditions data. + // FIXME: This call should be made unnecessary by modifying the EventBuilder API to remove setDetectorName. eventBuilder.setDetectorName(configurationModel.getDetectorName()); ConditionsManager.defaultInstance().addConditionsListener(eventBuilder); @@ -1615,8 +1633,7 @@ */ private void loadConfiguration() { - // Set the Configuration on the ConfigurationModel which will trigger all the - // PropertyChangelListeners. + // Set the Configuration on the ConfigurationModel which will trigger all the PropertyChangelListeners. configurationModel.setConfiguration(configuration); // Log that a new configuration was loaded. Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/AbstractModel.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/AbstractModel.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/AbstractModel.java Tue Dec 9 16:31:46 2014 @@ -7,13 +7,13 @@ import java.lang.reflect.Method; /** - * Abstract class that updates listeners from property changes in a backing model object. + * An abstract class which updates a set of listeners when there are property changes to a backing model. * @author Jeremy McCormick <[log in to unmask]> */ public abstract class AbstractModel { protected PropertyChangeSupport propertyChangeSupport; - protected boolean listenersEnabled = true; + protected boolean listenersEnabled = true; public AbstractModel() { propertyChangeSupport = new PropertyChangeSupport(this); @@ -51,7 +51,7 @@ public void fireAllChanged() { if (!listenersEnabled) return; - for (String property : getPropertyNames()) { + propertyLoop: for (String property : getPropertyNames()) { Method getMethod = null; for (Method method : getClass().getMethods()) { if (method.getName().equals("get" + property)) { @@ -64,19 +64,28 @@ try { value = getMethod.invoke(this, (Object[]) null); } catch (NullPointerException e) { - throw new RuntimeException("No get method exists for property: " + property, e); - } - // Is the value non-null? - // (Null values are actually okay. It just means the property is not set.) - if (value != null) { - firePropertyChange(property, value, value); - for (PropertyChangeListener listener : propertyChangeSupport.getPropertyChangeListeners()) { - // FIXME: For some reason calling the propertyChangeSupport methods directly - // here doesn't work!!! - listener.propertyChange(new PropertyChangeEvent(this, property, value, value)); + // This means there is no get method for the property which is a throwable error. + throw new RuntimeException("Property " + property + " is missing a get method.", e); + } catch (InvocationTargetException e) { + // Is the cause of the problem an illegal argument to the method? + System.out.println("cause: " + e.getCause().getClass().getCanonicalName()); + if (e.getCause() instanceof IllegalArgumentException) { + // For this error, assume that the key itself is missing from the configuration which is a warning. + System.err.println("The key " + property + " is not set in the configuration."); + continue propertyLoop; + } else { + throw new RuntimeException(e); } } - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // Is the value non-null? Null values are actually okay. + //if (value != null) { + firePropertyChange(property, value, value); + for (PropertyChangeListener listener : propertyChangeSupport.getPropertyChangeListeners()) { + // FIXME: For some reason calling the propertyChangeSupport methods directly here doesn't work! + listener.propertyChange(new PropertyChangeEvent(this, property, value, value)); + } + //} + } catch (IllegalAccessException | IllegalArgumentException e) { throw new RuntimeException(e); } } Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/Configuration.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/Configuration.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/Configuration.java Tue Dec 9 16:31:46 2014 @@ -9,8 +9,9 @@ /** * This class provides a list of key, value pairs backed by a <code>Properties</code> object. The - * accessor methods to get these values are not public, because the {@link ConfigurationModel} - * should be used instead. + * getter and setter methods for these values are not public, because the + * {@link org.hps.monitoring.gui.model.ConfigurationModel} class should be used instead + * to get or set application configuration values. */ public final class Configuration { @@ -83,7 +84,11 @@ * @return The value or null if does not exist. */ String get(String key) { - return properties.getProperty(key); + if (checkKey(key)) { + return properties.getProperty(key); + } else { + throw new IllegalArgumentException("The key " + key + " does not exist in this configuration with a valid value."); + } } /** @@ -92,7 +97,11 @@ * @return The value or null if does not exist. */ Boolean getBoolean(String key) { - return Boolean.parseBoolean(properties.getProperty(key)); + if (checkKey(key)) { + return Boolean.parseBoolean(properties.getProperty(key)); + } else { + return null; + } } /** @@ -101,7 +110,11 @@ * @return The value or null if does not exist. */ Double getDouble(String key) { - return Double.parseDouble(properties.getProperty(key)); + if (checkKey(key)) { + return Double.parseDouble(properties.getProperty(key)); + } else { + return null; + } } /** @@ -110,7 +123,11 @@ * @return The value or null if does not exist. */ Integer getInteger(String key) { - return Integer.parseInt(properties.getProperty(key)); + if (checkKey(key)) { + return Integer.parseInt(properties.getProperty(key)); + } else { + return null; + } } /** @@ -124,6 +141,15 @@ } catch (IOException e) { throw new RuntimeException("Error saving properties file.", e); } + } + + /** + * Check if the properties contains the key and if it has a non-null value. + * @param key The properties key. + * @return True if properties key is valid. + */ + private boolean checkKey(String key) { + return hasKey(key) && properties.getProperty(key) != null; } /** Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/ConfigurationModel.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/ConfigurationModel.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/ConfigurationModel.java Tue Dec 9 16:31:46 2014 @@ -1,7 +1,6 @@ package org.hps.monitoring.gui.model; import java.io.File; -import java.util.List; import java.util.logging.Level; import org.hps.monitoring.enums.SteeringType; @@ -16,17 +15,21 @@ // TODO: Should set methods check if new value is equal to old and then ignore if so? // FIXME: When the set methods are called, e.g. from GUI updates, this triggers // a property change event that pushes the values back to the GUI again. +// FIXME: Should check if property exists in set methods before retrieving old value for all set methods. +// FIXME: Should use objects instead of primitive types so that null can be used (e.g. for run number etc.). +// TODO: How to handle null values? public final class ConfigurationModel extends AbstractModel { Configuration config; - // Job settings + // Job setting properties. public static final String AIDA_AUTO_SAVE_PROPERTY = "AidaAutoSave"; public static final String AIDA_FILE_NAME_PROPERTY = "AidaFileName"; public static final String DETECTOR_NAME_PROPERTY = "DetectorName"; public static final String DISCONNECT_ON_ERROR_PROPERTY = "DisconnectOnError"; public static final String DISCONNECT_ON_END_RUN_PROPERTY = "DisconnectOnEndRun"; public static final String EVENT_BUILDER_PROPERTY = "EventBuilderClassName"; + public static final String FREEZE_CONDITIONS_PROPERTY = "FreezeConditions"; public static final String LOG_FILE_NAME_PROPERTY = "LogFileName"; public static final String LOG_LEVEL_PROPERTY = "LogLevel"; public static final String LOG_TO_FILE_PROPERTY = "LogToFile"; @@ -37,13 +40,14 @@ public static final String STEERING_TYPE_PROPERTY = "SteeringType"; public static final String STEERING_FILE_PROPERTY = "SteeringFile"; public static final String STEERING_RESOURCE_PROPERTY = "SteeringResource"; - - // Data source + public static final String USER_RUN_NUMBER_PROPERTY = "UserRunNumber"; + + // Data source properties. public static final String DATA_SOURCE_TYPE_PROPERTY = "DataSourceType"; public static final String DATA_SOURCE_PATH_PROPERTY = "DataSourcePath"; public static final String PROCESSING_STAGE_PROPERTY = "ProcessingStage"; - // ET connection parameters + // ET connection parameters. public static final String ET_NAME_PROPERTY = "EtName"; public static final String HOST_PROPERTY = "Host"; public static final String PORT_PROPERTY = "Port"; @@ -57,19 +61,50 @@ public static final String WAIT_TIME_PROPERTY = "WaitTime"; public static final String PRESCALE_PROPERTY = "Prescale"; + // These key values are primarily used to figure out what properties need to be persisted when + // writing to a text file. static final String[] CONFIG_PROPERTIES = new String[] { // Job settings - AIDA_AUTO_SAVE_PROPERTY, AIDA_FILE_NAME_PROPERTY, DETECTOR_NAME_PROPERTY, DISCONNECT_ON_ERROR_PROPERTY, DISCONNECT_ON_END_RUN_PROPERTY, EVENT_BUILDER_PROPERTY, LOG_FILE_NAME_PROPERTY, LOG_LEVEL_PROPERTY, LOG_TO_FILE_PROPERTY, STEERING_FILE_PROPERTY, STEERING_RESOURCE_PROPERTY, STEERING_TYPE_PROPERTY, + AIDA_AUTO_SAVE_PROPERTY, + AIDA_FILE_NAME_PROPERTY, + DETECTOR_NAME_PROPERTY, + DISCONNECT_ON_ERROR_PROPERTY, + DISCONNECT_ON_END_RUN_PROPERTY, + EVENT_BUILDER_PROPERTY, + FREEZE_CONDITIONS_PROPERTY, + LOG_FILE_NAME_PROPERTY, + LOG_LEVEL_PROPERTY, + LOG_TO_FILE_PROPERTY, + STEERING_FILE_PROPERTY, + STEERING_RESOURCE_PROPERTY, + STEERING_TYPE_PROPERTY, + USER_RUN_NUMBER_PROPERTY, // Data source - DATA_SOURCE_TYPE_PROPERTY, DATA_SOURCE_PATH_PROPERTY, PROCESSING_STAGE_PROPERTY, + DATA_SOURCE_TYPE_PROPERTY, + DATA_SOURCE_PATH_PROPERTY, + PROCESSING_STAGE_PROPERTY, // ET parameters - ET_NAME_PROPERTY, HOST_PROPERTY, PORT_PROPERTY, BLOCKING_PROPERTY, VERBOSE_PROPERTY, STATION_NAME_PROPERTY, CHUNK_SIZE_PROPERTY, QUEUE_SIZE_PROPERTY, STATION_POSITION_PROPERTY, WAIT_MODE_PROPERTY, WAIT_TIME_PROPERTY, PRESCALE_PROPERTY, + ET_NAME_PROPERTY, + HOST_PROPERTY, + PORT_PROPERTY, + BLOCKING_PROPERTY, + VERBOSE_PROPERTY, + STATION_NAME_PROPERTY, + CHUNK_SIZE_PROPERTY, + QUEUE_SIZE_PROPERTY, + STATION_POSITION_PROPERTY, + WAIT_MODE_PROPERTY, + WAIT_TIME_PROPERTY, + PRESCALE_PROPERTY, // GUI layout - SAVE_LAYOUT_PROPERTY, MONITORING_APPLICATION_LAYOUT_PROPERTY, PLOT_FRAME_LAYOUT_PROPERTY, SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY }; + SAVE_LAYOUT_PROPERTY, + MONITORING_APPLICATION_LAYOUT_PROPERTY, + PLOT_FRAME_LAYOUT_PROPERTY, + SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY }; String detectorName; @@ -153,7 +188,7 @@ firePropertyChange(EVENT_BUILDER_PROPERTY, oldValue, getEventBuilderClassName()); } - public boolean getLogToFile() { + public Boolean getLogToFile() { return config.getBoolean(LOG_TO_FILE_PROPERTY); } @@ -173,7 +208,7 @@ firePropertyChange(LOG_FILE_NAME_PROPERTY, oldValue, getLogFileName()); } - public boolean getAidaAutoSave() { + public Boolean getAidaAutoSave() { return config.equals(AIDA_AUTO_SAVE_PROPERTY); } @@ -193,7 +228,7 @@ firePropertyChange(AIDA_FILE_NAME_PROPERTY, oldValue, aidaFileName); } - public boolean getDisconnectOnError() { + public Boolean getDisconnectOnError() { return config.getBoolean(DISCONNECT_ON_ERROR_PROPERTY); } @@ -203,7 +238,7 @@ firePropertyChange(DISCONNECT_ON_ERROR_PROPERTY, oldValue, getDisconnectOnError()); } - public boolean getDisconnectOnEndRun() { + public Boolean getDisconnectOnEndRun() { return config.getBoolean(DISCONNECT_ON_END_RUN_PROPERTY); } @@ -265,7 +300,7 @@ firePropertyChange(HOST_PROPERTY, oldValue, getHost()); } - public int getPort() { + public Integer getPort() { return config.getInteger(PORT_PROPERTY); } @@ -275,7 +310,7 @@ firePropertyChange(PORT_PROPERTY, oldValue, getPort()); } - public boolean getBlocking() { + public Boolean getBlocking() { return config.getBoolean(BLOCKING_PROPERTY); } @@ -285,7 +320,7 @@ firePropertyChange(BLOCKING_PROPERTY, oldValue, getBlocking()); } - public boolean getVerbose() { + public Boolean getVerbose() { return config.getBoolean(VERBOSE_PROPERTY); } @@ -305,7 +340,7 @@ firePropertyChange(STATION_NAME_PROPERTY, oldValue, getStationName()); } - public int getChunkSize() { + public Integer getChunkSize() { return config.getInteger(CHUNK_SIZE_PROPERTY); } @@ -315,7 +350,7 @@ firePropertyChange(CHUNK_SIZE_PROPERTY, oldValue, getChunkSize()); } - public int getQueueSize() { + public Integer getQueueSize() { return config.getInteger(QUEUE_SIZE_PROPERTY); } @@ -325,7 +360,7 @@ firePropertyChange(QUEUE_SIZE_PROPERTY, oldValue, getQueueSize()); } - public int getStationPosition() { + public Integer getStationPosition() { return config.getInteger(STATION_POSITION_PROPERTY); } @@ -345,7 +380,7 @@ firePropertyChange(WAIT_MODE_PROPERTY, oldValue, getWaitMode()); } - public int getWaitTime() { + public Integer getWaitTime() { return config.getInteger(WAIT_TIME_PROPERTY); } @@ -355,7 +390,7 @@ firePropertyChange(WAIT_TIME_PROPERTY, oldValue, getWaitTime()); } - public int getPrescale() { + public Integer getPrescale() { return config.getInteger(PRESCALE_PROPERTY); } @@ -364,8 +399,34 @@ config.set(PRESCALE_PROPERTY, prescale); firePropertyChange(PRESCALE_PROPERTY, oldValue, getPrescale()); } - - public boolean getSaveLayout() { + + public void setUserRunNumber(Integer userRunNumber) { + Integer oldValue = null; + if (hasPropertyValue(USER_RUN_NUMBER_PROPERTY)) { + oldValue = getUserRunNumber(); + } + config.set(USER_RUN_NUMBER_PROPERTY, userRunNumber); + firePropertyChange(USER_RUN_NUMBER_PROPERTY, oldValue, getUserRunNumber()); + } + + public Integer getUserRunNumber() { + return config.getInteger(USER_RUN_NUMBER_PROPERTY); + } + + public void setFreezeConditions(boolean freezeConditions) { + Boolean oldValue = null; + if (hasPropertyValue(FREEZE_CONDITIONS_PROPERTY)) { + oldValue = getFreezeConditions(); + } + config.set(FREEZE_CONDITIONS_PROPERTY, freezeConditions); + firePropertyChange(FREEZE_CONDITIONS_PROPERTY, oldValue, freezeConditions); + } + + public Boolean getFreezeConditions() { + return config.getBoolean(FREEZE_CONDITIONS_PROPERTY); + } + + public Boolean getSaveLayout() { return config.getBoolean(SAVE_LAYOUT_PROPERTY); } @@ -412,7 +473,11 @@ firePropertyChange(property, oldValue, null); } } - + + public boolean hasPropertyValue(String key) { + return config.hasKey(key) ? true : false; + } + @Override public String[] getPropertyNames() { return CONFIG_PROPERTIES;