Issue #1742 Fixed concurrent mod exception in DAT config updates

Change-Id: I78ddb871e2bdc3c4200d9c32ae5d9fbd729f116e

Former-commit-id: 8f3cbb79c086845d49b7a877359cac3f83fc1c1c
This commit is contained in:
Dave Hladky 2013-08-16 10:49:43 -05:00
parent 2b491f11ad
commit 111ffab3c9
5 changed files with 121 additions and 50 deletions

View file

@ -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
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 13, 2013 1742 dhladky fixed concurrent mod exception on update
*
* </pre>
*
*/
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<MonitorConfigListener> listeners = new ArrayList<MonitorConfigListener>();
private CopyOnWriteArrayList<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>();
/** 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);
}
}
}

View file

@ -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
*
* </pre>
*
@ -74,9 +79,11 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver {
private LocalizationFile lf = null;
private java.util.concurrent.CopyOnWriteArrayList<MonitorConfigListener> listeners = new java.util.concurrent.CopyOnWriteArrayList<MonitorConfigListener>();// DR 14404
//private ArrayList<MonitorConfigListener> listeners = new ArrayList<MonitorConfigListener>();// DR 14404
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(FFMPRunConfigurationManager.class);
private CopyOnWriteArrayList<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>();
/** 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);
}
}

View file

@ -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
*
* </pre>
*
@ -84,6 +88,9 @@ public class FFMPSourceConfigurationManager implements
private List<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>();
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);
}
}
}
}

View file

@ -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
* </pre>
*
* @author dhladky
@ -71,8 +76,11 @@ public class FFMPTemplateConfigurationManager implements
private LocalizationFile lf = null;
private ArrayList<MonitorConfigListener> listeners = new ArrayList<MonitorConfigListener>();
private CopyOnWriteArrayList<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>();
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();
}
}

View file

@ -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
*
* </pre>
*
@ -63,7 +65,7 @@ public class SCANRunSiteConfigurationManager implements
private LocalizationFile lf = null;
private ArrayList<MonitorConfigListener> listeners = new ArrayList<MonitorConfigListener>();
private List<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>();
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<MonitorConfigListener> 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) {