From 7ee4a17e64c9cd6bea335950d71a046274409cca Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Mon, 22 Aug 2011 14:39:48 +0000 Subject: #7065 ConcurrentModificationException in AbstractWebApplicationContext.endTransaction() and startTransaction() svn changeset:20545/svn branch:6.7 --- .../RemoveTransactionListener.java | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tests/src/com/vaadin/tests/applicationcontext/RemoveTransactionListener.java (limited to 'tests') diff --git a/tests/src/com/vaadin/tests/applicationcontext/RemoveTransactionListener.java b/tests/src/com/vaadin/tests/applicationcontext/RemoveTransactionListener.java new file mode 100644 index 0000000000..8723e23a2a --- /dev/null +++ b/tests/src/com/vaadin/tests/applicationcontext/RemoveTransactionListener.java @@ -0,0 +1,78 @@ +package com.vaadin.tests.applicationcontext; + +import com.vaadin.Application; +import com.vaadin.service.ApplicationContext; +import com.vaadin.service.ApplicationContext.TransactionListener; +import com.vaadin.tests.components.TestBase; +import com.vaadin.tests.util.Log; + +public class RemoveTransactionListener extends TestBase { + + private final Log log = new Log(10); + + @Override + protected void setup() { + // Add one listener that will remove itself from within transactionEnd + getMainWindow().getApplication().getContext() + .addTransactionListener(new TransactionListener() { + public void transactionStart(Application application, + Object transactionData) { + } + + public void transactionEnd(Application application, + Object transactionData) { + removeListener(this); + log.log("Listener removed in transactionEnd"); + } + }); + + // Add one listener that will remove itself from within transactionStart + getMainWindow().getApplication().getContext() + .addTransactionListener(new TransactionListener() { + public void transactionStart(Application application, + Object transactionData) { + removeListener(this); + log.log("Listener removed in transactionStart"); + } + + public void transactionEnd(Application application, + Object transactionData) { + } + }); + + // Add one listener to verify that all listeners are called, as thrown + // ConcurrentModificationException causes subsequent listeners to be + // ignored + getMainWindow().getApplication().getContext() + .addTransactionListener(new TransactionListener() { + public void transactionStart(Application application, + Object transactionData) { + log.log("transactionStart from last listener"); + } + + public void transactionEnd(Application application, + Object transactionData) { + log.log("transactionEnd from last listener"); + } + }); + + addComponent(log); + } + + private void removeListener(TransactionListener l) { + ApplicationContext context = getMainWindow().getApplication() + .getContext(); + context.removeTransactionListener(l); + } + + @Override + protected String getDescription() { + return "Tests that a transaction listener can be removed from within the listener."; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(7065); + } + +} -- cgit v1.2.3