[214264] Synchronize listeners
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java index 5620247..d593854 100644 --- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java +++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java
@@ -44,8 +44,8 @@ protected List servers; // lifecycle listeners - protected transient List runtimeListeners; - protected transient List serverListeners; + protected List runtimeListeners = new ArrayList(3); + protected List serverListeners = new ArrayList(3); // cache for disposing servers & runtimes protected List activeBundles; @@ -376,42 +376,44 @@ * */ public void addRuntimeLifecycleListener(IRuntimeLifecycleListener listener) { - Trace.trace(Trace.LISTENERS, "Adding server resource listener " + listener + " to " + this); - - if (runtimeListeners == null) - runtimeListeners = new ArrayList(3); - runtimeListeners.add(listener); + Trace.trace(Trace.LISTENERS, "Adding runtime lifecycle listener " + listener + " to " + this); + + synchronized (runtimeListeners) { + runtimeListeners.add(listener); + } } /* * */ public void removeRuntimeLifecycleListener(IRuntimeLifecycleListener listener) { - Trace.trace(Trace.LISTENERS, "Removing server resource listener " + listener + " from " + this); - - if (runtimeListeners != null) + Trace.trace(Trace.LISTENERS, "Removing runtime lifecycle listener " + listener + " from " + this); + + synchronized (runtimeListeners) { runtimeListeners.remove(listener); + } } /* * */ public void addServerLifecycleListener(IServerLifecycleListener listener) { - Trace.trace(Trace.LISTENERS, "Adding server resource listener " + listener + " to " + this); - - if (serverListeners == null) - serverListeners = new ArrayList(3); - serverListeners.add(listener); + Trace.trace(Trace.LISTENERS, "Adding server lifecycle listener " + listener + " to " + this); + + synchronized (serverListeners) { + serverListeners.add(listener); + } } /* * */ public void removeServerLifecycleListener(IServerLifecycleListener listener) { - Trace.trace(Trace.LISTENERS, "Removing server resource listener " + listener + " from " + this); - - if (serverListeners != null) + Trace.trace(Trace.LISTENERS, "Removing server lifecycle listener " + listener + " from " + this); + + synchronized (serverListeners) { serverListeners.remove(listener); + } } /** @@ -460,24 +462,26 @@ private void fireRuntimeEvent(final IRuntime runtime, byte b) { Trace.trace(Trace.LISTENERS, "->- Firing runtime event: " + runtime.getName() + " ->-"); - if (runtimeListeners == null || runtimeListeners.isEmpty()) + if (runtimeListeners.isEmpty()) return; - - int size = runtimeListeners.size(); - IRuntimeLifecycleListener[] srl = new IRuntimeLifecycleListener[size]; - runtimeListeners.toArray(srl); - - for (int i = 0; i < size; i++) { - Trace.trace(Trace.LISTENERS, " Firing runtime event to " + srl[i]); - try { - if (b == EVENT_ADDED) - srl[i].runtimeAdded(runtime); - else if (b == EVENT_CHANGED) - srl[i].runtimeChanged(runtime); - else - srl[i].runtimeRemoved(runtime); - } catch (Exception e) { - Trace.trace(Trace.SEVERE, " Error firing runtime event to " + srl[i], e); + + synchronized (runtimeListeners) { + int size = runtimeListeners.size(); + IRuntimeLifecycleListener[] srl = new IRuntimeLifecycleListener[size]; + runtimeListeners.toArray(srl); + + for (int i = 0; i < size; i++) { + Trace.trace(Trace.LISTENERS, " Firing runtime event to " + srl[i]); + try { + if (b == EVENT_ADDED) + srl[i].runtimeAdded(runtime); + else if (b == EVENT_CHANGED) + srl[i].runtimeChanged(runtime); + else + srl[i].runtimeRemoved(runtime); + } catch (Exception e) { + Trace.trace(Trace.SEVERE, " Error firing runtime event to " + srl[i], e); + } } } Trace.trace(Trace.LISTENERS, "-<- Done firing runtime event -<-"); @@ -489,24 +493,26 @@ private void fireServerEvent(final IServer server, byte b) { Trace.trace(Trace.LISTENERS, "->- Firing server event: " + server.getName() + " ->-"); - if (serverListeners == null || serverListeners.isEmpty()) + if (serverListeners.isEmpty()) return; - - int size = serverListeners.size(); - IServerLifecycleListener[] srl = new IServerLifecycleListener[size]; - serverListeners.toArray(srl); - - for (int i = 0; i < size; i++) { - Trace.trace(Trace.LISTENERS, " Firing server event to " + srl[i]); - try { - if (b == EVENT_ADDED) - srl[i].serverAdded(server); - else if (b == EVENT_CHANGED) - srl[i].serverChanged(server); - else - srl[i].serverRemoved(server); - } catch (Exception e) { - Trace.trace(Trace.SEVERE, " Error firing server event to " + srl[i], e); + + synchronized (serverListeners) { + int size = serverListeners.size(); + IServerLifecycleListener[] srl = new IServerLifecycleListener[size]; + serverListeners.toArray(srl); + + for (int i = 0; i < size; i++) { + Trace.trace(Trace.LISTENERS, " Firing server event to " + srl[i]); + try { + if (b == EVENT_ADDED) + srl[i].serverAdded(server); + else if (b == EVENT_CHANGED) + srl[i].serverChanged(server); + else + srl[i].serverRemoved(server); + } catch (Exception e) { + Trace.trace(Trace.SEVERE, " Error firing server event to " + srl[i], e); + } } } Trace.trace(Trace.LISTENERS, "-<- Done firing server event -<-");