From 111ffab3c9164103a522566b78b73ca3d30edc9d Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Fri, 16 Aug 2013 10:49:43 -0500 Subject: [PATCH] Issue #1742 Fixed concurrent mod exception in DAT config updates Change-Id: I78ddb871e2bdc3c4200d9c32ae5d9fbd729f116e Former-commit-id: 8f3cbb79c086845d49b7a877359cac3f83fc1c1c --- .../config/FFMPRetentionTimeManager.java | 50 +++++++++++++++---- .../config/FFMPRunConfigurationManager.java | 35 ++++++++----- .../FFMPSourceConfigurationManager.java | 28 ++++++++--- .../FFMPTemplateConfigurationManager.java | 33 ++++++++---- .../SCANRunSiteConfigurationManager.java | 25 +++++----- 5 files changed, 121 insertions(+), 50 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRetentionTimeManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRetentionTimeManager.java index 36d425abfb..e155ccdfb9 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRetentionTimeManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRetentionTimeManager.java @@ -21,9 +21,9 @@ package com.raytheon.uf.common.monitor.config; **/ import java.io.File; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import com.raytheon.uf.common.localization.FileUpdatedMessage; import com.raytheon.uf.common.localization.ILocalizationFileObserver; @@ -36,9 +36,27 @@ import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.monitor.events.MonitorConfigEvent; import com.raytheon.uf.common.monitor.events.MonitorConfigListener; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.edex.database.purge.PurgeRule; import com.raytheon.uf.edex.database.purge.PurgeRuleSet; +/** + * FFMPRetentionTimeManager + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Aug 13, 2013 1742       dhladky     fixed concurrent mod exception on update
+ * 
+ * 
+ * + */ + + public class FFMPRetentionTimeManager implements ILocalizationFileObserver { /** Path to FFMP Source config. */ @@ -52,11 +70,14 @@ public class FFMPRetentionTimeManager implements ILocalizationFileObserver { */ protected PurgeRuleSet configXml; - private final ArrayList listeners = new ArrayList(); + private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); /** Singleton instance of this class */ private static FFMPRetentionTimeManager instance = new FFMPRetentionTimeManager(); + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(FFMPRetentionTimeManager.class); + /* Private Constructor */ private FFMPRetentionTimeManager() { configXml = new PurgeRuleSet(); @@ -103,14 +124,16 @@ public class FFMPRetentionTimeManager implements ILocalizationFileObserver { PurgeRuleSet configXmltmp = null; - configXmltmp = (PurgeRuleSet) SerializationUtil - .jaxbUnmarshalFromXmlFile(file.getAbsolutePath()); + configXmltmp = SerializationUtil.jaxbUnmarshalFromXmlFile( + PurgeRuleSet.class, file.getAbsolutePath()); configXml = configXmltmp; } catch (Exception e) { - System.err.println("No SITE Purge Rule file found"); - e.printStackTrace(); + statusHandler + .handle(Priority.WARN, + "No SITE level purge file found.", + e); } } @@ -143,7 +166,8 @@ public class FFMPRetentionTimeManager implements ILocalizationFileObserver { lf = newXmlFile; } catch (Exception e) { - e.printStackTrace(); + statusHandler.handle(Priority.WARN, + "Couldn't save config.", e); } } @@ -151,12 +175,18 @@ public class FFMPRetentionTimeManager implements ILocalizationFileObserver { @Override public void fileUpdated(FileUpdatedMessage message) { if (message.getFileName().equals(CONFIG_FILE_NAME)) { - readConfigXml(); - // inform listeners - synchronized (listeners) { + try { + readConfigXml(); + + // inform listeners for (MonitorConfigListener fl : listeners) { fl.configChanged(new MonitorConfigEvent(this)); } + + } catch (Exception e) { + statusHandler.handle(Priority.WARN, + "FFMPRetentionTimeManager: " + message.getFileName() + + " couldn't be updated.", e); } } } diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java index 3cbd7cfe4c..8fea0656f9 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java @@ -22,6 +22,7 @@ package com.raytheon.uf.common.monitor.config; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.concurrent.CopyOnWriteArrayList; import com.raytheon.uf.common.localization.FileUpdatedMessage; import com.raytheon.uf.common.localization.ILocalizationFileObserver; @@ -41,6 +42,9 @@ import com.raytheon.uf.common.monitor.xml.SourceOverrideXML; import com.raytheon.uf.common.monitor.xml.SourceXML; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** @@ -53,6 +57,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * ------------ ---------- ----------- -------------------------- * 2012-09-04 DR 14404 gzhang Fixing ConcurrentModificationException * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. + * Aug 13, 2013 1742 dhladky Concurrent mod exception on update fixed * * * @@ -74,9 +79,11 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { private LocalizationFile lf = null; - private java.util.concurrent.CopyOnWriteArrayList listeners = new java.util.concurrent.CopyOnWriteArrayList();// DR 14404 - //private ArrayList listeners = new ArrayList();// DR 14404 - + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(FFMPRunConfigurationManager.class); + + private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); + /** Singleton instance of this class */ private static FFMPRunConfigurationManager instance = new FFMPRunConfigurationManager(); @@ -139,8 +146,7 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { FFMPRunConfigXML configXmltmp = null; - configXmltmp = (FFMPRunConfigXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(file.getAbsolutePath()); + configXmltmp = SerializationUtil.jaxbUnmarshalFromXmlFile(FFMPRunConfigXML.class, file.getAbsolutePath()); configXml = configXmltmp; isPopulated = true; @@ -176,7 +182,8 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { lf = newXmlFile; } catch (Exception e) { - e.printStackTrace(); + statusHandler + .handle(Priority.ERROR, "Couldn't save config file.", e); } } @@ -268,14 +275,18 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { if (message.getFileName().equals(CONFIG_FILE_NAME)) { try { readConfigXml(); + // inform listeners - //synchronized (listeners) {// DR 14404 - for (MonitorConfigListener fl : listeners) { - fl.configChanged(new MonitorConfigEvent(this)); - } - //}// DR 14404 + for (MonitorConfigListener fl : listeners) { + fl.configChanged(new MonitorConfigEvent(this)); + } + } catch (SerializationException e) { - e.printStackTrace(); + statusHandler.handle( + Priority.WARN, + "FFMPRunConfigurationManager: " + + message.getFileName() + + " couldn't be updated.", e); } } diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java index a42b2cf595..20e3e107cc 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java @@ -39,6 +39,9 @@ import com.raytheon.uf.common.monitor.xml.ProductXML; import com.raytheon.uf.common.monitor.xml.SourceXML; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** * FFMPSourceConfigurationManager @@ -50,6 +53,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * ------------ ---------- ----------- -------------------------- * 2012-09-04 DR 14404 gzhang Fixing ConcurrentModificationException * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. + * Aug 18, 2013 1742 dhladky Concurrent mod exception on update fixed * * * @@ -84,6 +88,9 @@ public class FFMPSourceConfigurationManager implements private List listeners = new CopyOnWriteArrayList(); + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(FFMPSourceConfigurationManager.class); + /* Private Constructor */ private FFMPSourceConfigurationManager() { configXml = new FFMPSourceConfigXML(); @@ -137,11 +144,12 @@ public class FFMPSourceConfigurationManager implements FFMPSourceConfigXML configXmltmp = null; try { - configXmltmp = (FFMPSourceConfigXML) SerializationUtil + configXmltmp = SerializationUtil .jaxbUnmarshalFromXmlFile(FFMPSourceConfigXML.class, file); } catch (SerializationException e1) { - e1.printStackTrace(); + statusHandler.handle(Priority.ERROR, + "Couldn't serialize file.", e1); } configXml = configXmltmp; @@ -173,7 +181,8 @@ public class FFMPSourceConfigurationManager implements lf = newXmlFile; lf.addFileUpdatedObserver(this); } catch (Exception e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, + "Couldn't save config file.", e); } } @@ -474,14 +483,19 @@ public class FFMPSourceConfigurationManager implements @Override public void fileUpdated(FileUpdatedMessage message) { if (message.getFileName().equals(CONFIG_FILE_NAME)) { - readConfigXml(); - // inform listeners - //synchronized (listeners) {// DR 14404 + try { + readConfigXml(); + // inform listeners for (MonitorConfigListener fl : listeners) { fl.configChanged(new MonitorConfigEvent(this)); } - //}// DR 14404 + } catch (Exception e) { + statusHandler.handle(Priority.WARN, + "FFMPSourceConfigurationManager: " + message.getFileName() + + " couldn't be updated.", e); + } } + } } diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPTemplateConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPTemplateConfigurationManager.java index 2ed467a8f8..e06c893c07 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPTemplateConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPTemplateConfigurationManager.java @@ -21,6 +21,7 @@ package com.raytheon.uf.common.monitor.config; import java.io.File; import java.util.ArrayList; +import java.util.concurrent.CopyOnWriteArrayList; import com.raytheon.uf.common.localization.FileUpdatedMessage; import com.raytheon.uf.common.localization.ILocalizationFileObserver; @@ -35,6 +36,9 @@ import com.raytheon.uf.common.monitor.events.MonitorConfigListener; import com.raytheon.uf.common.monitor.xml.FFMPTemplateXML; import com.raytheon.uf.common.monitor.xml.VGBXML; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** * Template area configuration xml. @@ -46,6 +50,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * ------------ ---------- ----------- -------------------------- * Feb 12, 2009 lvenable Initial creation * Oct 25, 2012 DR 15514 gzhang Adding getHucLevelsInArray() + * Aug 18, 2013 1742 dhladky Concurrent mod exception on update fixed * * * @author dhladky @@ -71,8 +76,11 @@ public class FFMPTemplateConfigurationManager implements private LocalizationFile lf = null; - private ArrayList listeners = new ArrayList(); - + private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); + + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(FFMPTemplateConfigurationManager.class); + /* Private Constructor */ private FFMPTemplateConfigurationManager() { configXml = new FFMPTemplateXML(); @@ -118,8 +126,9 @@ public class FFMPTemplateConfigurationManager implements } File file = lf.getFile(); - FFMPTemplateXML configXmltmp = (FFMPTemplateXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(file.getAbsolutePath()); + FFMPTemplateXML configXmltmp = SerializationUtil + .jaxbUnmarshalFromXmlFile(FFMPTemplateXML.class, + file.getAbsolutePath()); configXml = configXmltmp; } @@ -151,7 +160,8 @@ public class FFMPTemplateConfigurationManager implements lf = newXmlFile; } catch (Exception e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, + "Couldn't save config file.", e); } } @@ -244,8 +254,9 @@ public class FFMPTemplateConfigurationManager implements @Override public void fileUpdated(FileUpdatedMessage message) { - try { - if (message.getFileName().equals(CONFIG_FILE_NAME)) { + + if (message.getFileName().equals(CONFIG_FILE_NAME)) { + try { readConfigXml(); // inform listeners synchronized (listeners) { @@ -253,9 +264,13 @@ public class FFMPTemplateConfigurationManager implements fl.configChanged(new MonitorConfigEvent(this)); } } + } catch (Exception e) { + statusHandler.handle( + Priority.WARN, + "FFMPTemplateConfigurationManager: " + + message.getFileName() + + " couldn't be updated.", e); } - } catch (Exception e) { - e.printStackTrace(); } } diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/SCANRunSiteConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/SCANRunSiteConfigurationManager.java index 3ba2f8cd4a..6e0ba62f10 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/SCANRunSiteConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/SCANRunSiteConfigurationManager.java @@ -3,6 +3,7 @@ package com.raytheon.uf.common.monitor.config; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import com.raytheon.uf.common.dataplugin.radar.util.RadarsInUseUtil; import com.raytheon.uf.common.localization.FileUpdatedMessage; @@ -34,7 +35,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 02/07/2009 2037 dhladky Initial Creation. - * 02/25/13 1660 D. Hladky Fixed configuration bug in scan. + * 02/25/13 1660 dhladky Fixed configuration bug in scan. + * Aug 13, 2013 1742 dhladky Concurrent mod exception on update fixed * * * @@ -63,7 +65,7 @@ public class SCANRunSiteConfigurationManager implements private LocalizationFile lf = null; - private ArrayList listeners = new ArrayList(); + private List listeners = new CopyOnWriteArrayList(); protected boolean isPopulated; @@ -76,7 +78,6 @@ public class SCANRunSiteConfigurationManager implements } catch (Exception e) { statusHandler.handle(Priority.ERROR, "Can not read the SCAN configuration", e); } - } /** @@ -170,18 +171,18 @@ public class SCANRunSiteConfigurationManager implements try { readConfigXml(); // inform listeners - final ArrayList flistners = listeners; - synchronized (flistners) { - for (MonitorConfigListener fl : flistners) { - fl.configChanged(new MonitorConfigEvent(this)); - } + for (MonitorConfigListener fl : listeners) { + fl.configChanged(new MonitorConfigEvent(this)); } - } catch (SerializationException e) { - statusHandler.handle(Priority.WARN, "SCANRunSiteConfigurationManager: " - + message.getFileName() + " couldn't be updated.", e); + + } catch (Exception e) { + statusHandler.handle( + Priority.WARN, + "SCANRunSiteConfigurationManager: " + + message.getFileName() + + " couldn't be updated.", e); } } - } public void addRunConfig(SCANSiteRunConfigXML configXml) {