diff options
author | Leif Åstrand <leif@vaadin.com> | 2011-08-22 14:39:48 +0000 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2011-08-22 14:39:48 +0000 |
commit | 7ee4a17e64c9cd6bea335950d71a046274409cca (patch) | |
tree | d50d3fba8f4625ad2512032787c61697a663aa07 /src | |
parent | 1c9efd41dc2950f40b4ebfa7dd17c43116e03fe0 (diff) | |
download | vaadin-framework-7ee4a17e64c9cd6bea335950d71a046274409cca.tar.gz vaadin-framework-7ee4a17e64c9cd6bea335950d71a046274409cca.zip |
#7065 ConcurrentModificationException in AbstractWebApplicationContext.endTransaction() and startTransaction()
svn changeset:20545/svn branch:6.7
Diffstat (limited to 'src')
-rw-r--r-- | src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java index 02218f4bc2..752e4c4760 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java @@ -7,6 +7,7 @@ import java.io.PrintWriter; import java.io.Serializable; import java.io.StringWriter; import java.net.URL; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -60,10 +61,12 @@ public abstract class AbstractWebApplicationContext implements * the HTTP or portlet request that triggered the transaction. */ protected void startTransaction(Application application, Object request) { + ArrayList<TransactionListener> currentListeners; synchronized (listeners) { - for (TransactionListener listener : listeners) { - listener.transactionStart(application, request); - } + currentListeners = new ArrayList<TransactionListener>(listeners); + } + for (TransactionListener listener : currentListeners) { + listener.transactionStart(application, request); } } @@ -78,16 +81,19 @@ public abstract class AbstractWebApplicationContext implements protected void endTransaction(Application application, Object request) { LinkedList<Exception> exceptions = null; + ArrayList<TransactionListener> currentListeners; synchronized (listeners) { - for (TransactionListener listener : listeners) { - try { - listener.transactionEnd(application, request); - } catch (final RuntimeException t) { - if (exceptions == null) { - exceptions = new LinkedList<Exception>(); - } - exceptions.add(t); + currentListeners = new ArrayList<TransactionListener>(listeners); + } + + for (TransactionListener listener : currentListeners) { + try { + listener.transactionEnd(application, request); + } catch (final RuntimeException t) { + if (exceptions == null) { + exceptions = new LinkedList<Exception>(); } + exceptions.add(t); } } |