Author: [log in to unmask]
Date: Fri Apr 17 12:19:49 2015
New Revision: 2739
Log:
Improve error handling when setting properties in AbstractModel. A missing property is no longer a fatal error and will just print a warning message now.
Modified:
java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/model/AbstractModel.java
Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/model/AbstractModel.java
=============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/model/AbstractModel.java (original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/model/AbstractModel.java Fri Apr 17 12:19:49 2015
@@ -10,8 +10,13 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javassist.Modifier;
+
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
/**
* An abstract class which updates a set of listeners when there are property changes to a backing model.
@@ -19,6 +24,12 @@
* @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class AbstractModel {
+
+ /**
+ * Setup logging.
+ */
+ private static final Logger LOGGER = LogUtil.create(AbstractModel.class.getName(), new DefaultLogFormatter(),
+ Level.INFO);
/**
* This method will extract property names from a class, which in this package's conventions are statically
@@ -76,7 +87,9 @@
* @param properties the list of property names
*/
void firePropertiesChanged(final Collection<String> properties) {
- propertyLoop: for (final String property : properties) {
+ for (final String property : properties) {
+
+ // Find the getter for this property.
Method getMethod = null;
for (final Method method : this.getClass().getMethods()) {
if (method.getName().equals("get" + property)) {
@@ -84,38 +97,44 @@
break;
}
}
- // System.out.println(getMethod.getName());
- try {
- Object value = null;
+
+ // Is there a valid get method for the property?
+ if (getMethod != null) {
+ LOGGER.fine("property: " + property + ", method: " + getMethod.getName());
try {
- value = getMethod.invoke(this, (Object[]) null);
- // System.out.println(" value = " + value);
- } catch (final NullPointerException e) {
- // 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 (final InvocationTargetException e) {
- // Is the cause of the problem an illegal argument to the method?
- 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 {
- e.printStackTrace();
- throw new RuntimeException(e);
+ Object value = null;
+ try {
+ value = getMethod.invoke(this, (Object[]) null);
+ } catch (final InvocationTargetException e) {
+ // Is the cause of the problem an illegal argument to the method?
+ if (e.getCause() instanceof IllegalArgumentException) {
+ // Property key is not in the configuration (this should not happen under normal
+ // circumstances).
+ LOGGER.log(Level.WARNING, "Property key missing from configuration: " + property, e);
+ continue;
+ } else {
+ // Something else went wrong, which we assume is a fatal error.
+ LOGGER.log(Level.SEVERE, "Error setting property: " + property, e);
+ throw new RuntimeException("Error setting property: " + property, e);
+ }
}
+ if (value != null) {
+ this.firePropertyChange(property, value, value);
+ for (final PropertyChangeListener listener : this.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) {
+ // This should not usually happen.
+ LOGGER.log(Level.SEVERE, "Error setting property: " + property, e);
+ throw new RuntimeException("Error setting property: " + property, e);
}
- if (value != null) {
- this.firePropertyChange(property, value, value);
- for (final PropertyChangeListener listener : this.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) {
- e.printStackTrace();
- throw new RuntimeException(e);
+ } else {
+ // There was no getter found for the property which is a non-fatal warning.
+ LOGGER.log(Level.WARNING, "Unknown property in configuration: " + property);
}
}
}
|