Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java11
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDOSessionRecoveryEventImpl.java17
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/ReconnectingCDOSessionImpl.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/RecoveringCDOSessionImpl.java9
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java230
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/ISessionConfig.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/ConfigTest.java11
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/SessionConfig.java5
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java2
-rw-r--r--plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/AbstractOMTest.java47
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/ContainerEvent.java13
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/SingleDeltaContainerEvent.java4
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/LifecycleEvent.java6
14 files changed, 346 insertions, 18 deletions
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
index 1820111348..10cbc23a39 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
@@ -17,6 +17,8 @@
*/
package org.eclipse.emf.cdo.internal.net4j;
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.common.util.NotAuthenticatedException;
import org.eclipse.emf.cdo.internal.common.model.CDOPackageRegistryImpl;
@@ -241,9 +243,14 @@ public class CDONet4jSessionImpl extends CDOSessionImpl implements org.eclipse.e
try
{
+ String userID = getUserID();
+ boolean passiveUpdateEnabled = options().isPassiveUpdateEnabled();
+ PassiveUpdateMode passiveUpdateMode = options().getPassiveUpdateMode();
+ LockNotificationMode lockNotificationMode = options().getLockNotificationMode();
+
// TODO (CD) The next call is on the CDOClientProtocol; shouldn't it be on the DelegatingSessionProtocol instead?
- OpenSessionResult result = protocol.openSession(repositoryName, getUserID(), options().isPassiveUpdateEnabled(),
- options().getPassiveUpdateMode(), options().getLockNotificationMode());
+ OpenSessionResult result = protocol.openSession(repositoryName, userID, passiveUpdateEnabled, passiveUpdateMode,
+ lockNotificationMode);
if (result == null)
{
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDOSessionRecoveryEventImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDOSessionRecoveryEventImpl.java
index a723f02be0..4252719611 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDOSessionRecoveryEventImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDOSessionRecoveryEventImpl.java
@@ -13,28 +13,37 @@ package org.eclipse.emf.cdo.internal.net4j;
import org.eclipse.emf.cdo.net4j.CDOSessionRecoveryEvent;
import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.net4j.util.event.Event;
+
/**
* @author Caspar De Groot
*/
-public class CDOSessionRecoveryEventImpl implements CDOSessionRecoveryEvent
+public class CDOSessionRecoveryEventImpl extends Event implements CDOSessionRecoveryEvent
{
- private CDOSession source;
+ private static final long serialVersionUID = 1L;
private Type type;
public CDOSessionRecoveryEventImpl(CDOSession source, Type type)
{
+ super(source);
this.type = type;
- this.source = source;
}
+ @Override
public CDOSession getSource()
{
- return source;
+ return (CDOSession)super.getSource();
}
public Type getType()
{
return type;
}
+
+ @Override
+ protected String formatAdditionalParameters()
+ {
+ return "type=" + type;
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/ReconnectingCDOSessionImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/ReconnectingCDOSessionImpl.java
index 55b0f81027..9794ed2edf 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/ReconnectingCDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/ReconnectingCDOSessionImpl.java
@@ -12,6 +12,7 @@ package org.eclipse.emf.cdo.internal.net4j;
import org.eclipse.net4j.connector.ConnectorException;
import org.eclipse.net4j.connector.IConnector;
+import org.eclipse.net4j.util.lifecycle.LifecycleException;
/**
* @author Caspar De Groot
@@ -90,6 +91,10 @@ public class ReconnectingCDOSessionImpl extends RecoveringCDOSessionImpl
{
failedAttempts++;
}
+ catch (LifecycleException ex)
+ {
+ failedAttempts++;
+ }
}
if (newConnector == null)
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/RecoveringCDOSessionImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/RecoveringCDOSessionImpl.java
index 3ef57b7eee..cd54976ce6 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/RecoveringCDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/RecoveringCDOSessionImpl.java
@@ -137,7 +137,11 @@ public abstract class RecoveringCDOSessionImpl extends CDONet4jSessionImpl
runnable.run(newSessionProtocol);
}
- fireEvent(createRecoveryFinishedEvent());
+ boolean passiveUpdateEnabled = options().isPassiveUpdateEnabled();
+ refresh(passiveUpdateEnabled);
+
+ CDOSessionEvent event = createRecoveryFinishedEvent();
+ fireEvent(event);
}
protected void handleProtocolChange(CDOSessionProtocol oldProtocol, CDOSessionProtocol newProtocol)
@@ -185,7 +189,8 @@ public abstract class RecoveringCDOSessionImpl extends CDONet4jSessionImpl
protected IConnector getTCPConnector(String description)
{
- return Net4jUtil.getConnector(getContainer(), "tcp", description, connectorTimeout);
+ IManagedContainer container = getContainer();
+ return Net4jUtil.getConnector(container, "tcp", description, connectorTimeout);
}
protected List<AfterRecoveryRunnable> recoverSession()
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
index 950458b8e0..4628d31ab9 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
@@ -52,6 +52,7 @@ public class AllConfigs extends ConfigTestSuite
testClasses.add(UnsetTest.class);
testClasses.add(StateMachineTest.class);
testClasses.add(SessionTest.class);
+ testClasses.add(ReconnectingSessionTest.class);
testClasses.add(RevisionManagerTest.class);
testClasses.add(RevisionManagerClientSideTest.class);
testClasses.add(BranchingTest.class);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java
new file mode 100644
index 0000000000..0518fff630
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2014 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.net4j.CDONet4jSession;
+import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
+import org.eclipse.emf.cdo.net4j.CDOSessionRecoveryEvent;
+import org.eclipse.emf.cdo.net4j.ReconnectingCDOSessionConfiguration;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.tests.config.ISessionConfig;
+import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
+import org.eclipse.emf.cdo.tests.config.impl.SessionConfig;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.net4j.connector.IConnector;
+import org.eclipse.net4j.tcp.ITCPAcceptor;
+import org.eclipse.net4j.tcp.TCPUtil;
+import org.eclipse.net4j.util.container.IManagedContainer;
+import org.eclipse.net4j.util.event.IEvent;
+import org.eclipse.net4j.util.event.IListener;
+import org.eclipse.net4j.util.io.IOUtil;
+import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Eike Stepper
+ */
+@Requires(ISessionConfig.CAPABILITY_NET4J_TCP)
+public class ReconnectingSessionTest extends AbstractCDOTest
+{
+ private static final String ADDRESS2 = SessionConfig.Net4j.TCP.CONNECTOR_HOST + ":2040";
+
+ @Override
+ protected void doSetUp() throws Exception
+ {
+ disableConsole();
+ super.doSetUp();
+ }
+
+ public void testReconnect() throws Exception
+ {
+ disableConsole();
+
+ CDOSession session1 = openSession();
+ CDOTransaction transaction = session1.openTransaction();
+ CDOResource resource1 = transaction.createResource(getResourcePath("res1"));
+ resource1.getContents().add(getModel1Factory().createCategory());
+ transaction.commit();
+
+ ITCPAcceptor acceptor = null;
+ CDONet4jSession session2 = null;
+
+ try
+ {
+ IManagedContainer serverContainer = getServerContainer();
+ dumpEvents(serverContainer);
+
+ acceptor = TCPUtil.getAcceptor(serverContainer, ADDRESS2);
+ dumpEvents(acceptor);
+
+ String repositoryName = session1.getRepositoryInfo().getName();
+ IManagedContainer clientContainer = getClientContainer();
+ dumpEvents(clientContainer);
+
+ ReconnectingCDOSessionConfiguration configuration = CDONet4jUtil.createReconnectingSessionConfiguration(ADDRESS2,
+ repositoryName, clientContainer);
+ configuration.setHeartBeatEnabled(true);
+
+ session2 = (CDONet4jSession)openSession(configuration);
+ dumpEvents(session2);
+
+ final CountDownLatch recoveryStarted = new CountDownLatch(1);
+ final CountDownLatch recoveryFinished = new CountDownLatch(1);
+ session2.addListener(new IListener()
+ {
+ public void notifyEvent(final IEvent event)
+ {
+ if (event instanceof CDOSessionRecoveryEvent)
+ {
+ CDOSessionRecoveryEvent recoveryEvent = (CDOSessionRecoveryEvent)event;
+ switch (recoveryEvent.getType())
+ {
+ case STARTED:
+ recoveryStarted.countDown();
+ break;
+ case FINISHED:
+ recoveryFinished.countDown();
+ break;
+ }
+ }
+ }
+ });
+
+ IConnector connector2 = (IConnector)session2.options().getNet4jProtocol().getChannel().getMultiplexer();
+ dumpEvents(connector2);
+
+ CDOView view = session2.openView();
+ CDOResource resource2 = view.getResource(getResourcePath("res1"));
+ assertEquals(1, resource2.getContents().size());
+
+ resource1.getContents().add(getModel1Factory().createCategory());
+ commitAndSync(transaction, view);
+ assertEquals(2, resource2.getContents().size());
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Deactivating acceptor...");
+ LifecycleUtil.deactivate(acceptor);
+ recoveryStarted.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Reactivating acceptor...");
+ acceptor = TCPUtil.getAcceptor(serverContainer, ADDRESS2);
+ dumpEvents(acceptor);
+ recoveryFinished.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Committing...");
+ resource1.getContents().add(getModel1Factory().createCategory());
+ commitAndSync(transaction, view);
+ assertEquals(3, resource2.getContents().size());
+ }
+ finally
+ {
+ LifecycleUtil.deactivate(session2);
+ LifecycleUtil.deactivate(acceptor);
+ }
+ }
+
+ public void testReconnectWithCommitsWhileUnconnected() throws Exception
+ {
+ disableConsole();
+
+ CDOSession session1 = openSession();
+ CDOTransaction transaction = session1.openTransaction();
+ CDOResource resource1 = transaction.createResource(getResourcePath("res1"));
+ resource1.getContents().add(getModel1Factory().createCategory());
+ transaction.commit();
+
+ ITCPAcceptor acceptor = null;
+ CDONet4jSession session2 = null;
+
+ try
+ {
+ IManagedContainer serverContainer = getServerContainer();
+ dumpEvents(serverContainer);
+
+ acceptor = TCPUtil.getAcceptor(serverContainer, ADDRESS2);
+ dumpEvents(acceptor);
+
+ String repositoryName = session1.getRepositoryInfo().getName();
+ IManagedContainer clientContainer = getClientContainer();
+ dumpEvents(clientContainer);
+
+ ReconnectingCDOSessionConfiguration configuration = CDONet4jUtil.createReconnectingSessionConfiguration(ADDRESS2,
+ repositoryName, clientContainer);
+ configuration.setHeartBeatEnabled(true);
+
+ session2 = (CDONet4jSession)openSession(configuration);
+ dumpEvents(session2);
+
+ final CountDownLatch recoveryStarted = new CountDownLatch(1);
+ final CountDownLatch recoveryFinished = new CountDownLatch(1);
+ session2.addListener(new IListener()
+ {
+ public void notifyEvent(final IEvent event)
+ {
+ if (event instanceof CDOSessionRecoveryEvent)
+ {
+ CDOSessionRecoveryEvent recoveryEvent = (CDOSessionRecoveryEvent)event;
+ switch (recoveryEvent.getType())
+ {
+ case STARTED:
+ recoveryStarted.countDown();
+ break;
+ case FINISHED:
+ recoveryFinished.countDown();
+ break;
+ }
+ }
+ }
+ });
+
+ IConnector connector2 = (IConnector)session2.options().getNet4jProtocol().getChannel().getMultiplexer();
+ dumpEvents(connector2);
+
+ CDOView view = session2.openView();
+ CDOResource resource2 = view.getResource(getResourcePath("res1"));
+ assertEquals(1, resource2.getContents().size());
+
+ resource1.getContents().add(getModel1Factory().createCategory());
+ commitAndSync(transaction, view);
+ assertEquals(2, resource2.getContents().size());
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Deactivating acceptor...");
+ LifecycleUtil.deactivate(acceptor);
+ recoveryStarted.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Committing...");
+ resource1.getContents().add(getModel1Factory().createCategory());
+ transaction.commit();
+
+ IOUtil.OUT().println();
+ IOUtil.OUT().println("Reactivating acceptor...");
+ acceptor = TCPUtil.getAcceptor(serverContainer, ADDRESS2);
+ dumpEvents(acceptor);
+ recoveryFinished.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ assertEquals(3, resource2.getContents().size());
+ }
+ finally
+ {
+ LifecycleUtil.deactivate(session2);
+ LifecycleUtil.deactivate(acceptor);
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/ISessionConfig.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/ISessionConfig.java
index 8e6f22658b..c31605182b 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/ISessionConfig.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/ISessionConfig.java
@@ -11,6 +11,7 @@
package org.eclipse.emf.cdo.tests.config;
import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.session.CDOSessionConfiguration;
import org.eclipse.net4j.util.container.IManagedContainer;
@@ -44,4 +45,6 @@ public interface ISessionConfig extends IConfig
public CDOSession openSession();
public CDOSession openSession(String repositoryName);
+
+ public CDOSession openSession(CDOSessionConfiguration configuration);
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/ConfigTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/ConfigTest.java
index 1fd7b3e669..cc0c3f7927 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/ConfigTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/ConfigTest.java
@@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.common.revision.CDORevisionManager;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.session.CDOSessionConfiguration;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.spi.server.InternalStore.NoChangeSets;
@@ -372,6 +373,16 @@ public abstract class ConfigTest extends AbstractOMTest implements IConstants
/**
* @category Session
*/
+ public CDOSession openSession(CDOSessionConfiguration configuration)
+ {
+ determineCodeLink();
+ ISessionConfig sessionConfig = getSessionConfig();
+ return sessionConfig.openSession(configuration);
+ }
+
+ /**
+ * @category Session
+ */
public CDOSession openSession(IPasswordCredentials credentials)
{
if (credentials != null)
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/SessionConfig.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/SessionConfig.java
index c16fb2e986..8cb638ea12 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/SessionConfig.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/SessionConfig.java
@@ -159,6 +159,11 @@ public abstract class SessionConfig extends Config implements ISessionConfig
configuration.setCredentialsProvider(credentialsProvider);
}
+ return openSession(configuration);
+ }
+
+ public CDOSession openSession(CDOSessionConfiguration configuration)
+ {
CDOSession session = configuration.openSession();
configureSession(session);
session.addListener(sessionListener);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
index 5ea8ea7e75..804d2f8e5a 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
@@ -614,7 +614,7 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme
return refresh(false);
}
- private long refresh(boolean enablePassiveUpdates)
+ protected final long refresh(boolean enablePassiveUpdates)
{
Map<CDOBranch, List<InternalCDOView>> views = new HashMap<CDOBranch, List<InternalCDOView>>();
Map<CDOBranch, Map<CDOID, InternalCDORevision>> viewedRevisions = new HashMap<CDOBranch, Map<CDOID, InternalCDORevision>>();
diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/AbstractOMTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/AbstractOMTest.java
index b073c1c0dc..9912df358d 100644
--- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/AbstractOMTest.java
+++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/AbstractOMTest.java
@@ -16,7 +16,9 @@ import org.eclipse.net4j.util.ReflectUtil;
import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
import org.eclipse.net4j.util.concurrent.TrackableTimerTask;
import org.eclipse.net4j.util.event.EventUtil;
+import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
+import org.eclipse.net4j.util.event.INotifier;
import org.eclipse.net4j.util.io.IORuntimeException;
import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.io.TMPUtil;
@@ -60,12 +62,20 @@ public abstract class AbstractOMTest extends TestCase
public static final long DEFAULT_TIMEOUT_EXPECTED = 3 * 1000;
- private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, AbstractOMTest.class);
-
public static boolean EXTERNAL_LOG;
public static boolean SUPPRESS_OUTPUT;
+ private static final IListener DUMPER = new IListener()
+ {
+ public void notifyEvent(IEvent event)
+ {
+ IOUtil.OUT().println(event);
+ }
+ };
+
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, AbstractOMTest.class);
+
private static boolean consoleEnabled;
private static String testName;
@@ -691,6 +701,39 @@ public abstract class AbstractOMTest extends TestCase
}
}
+ public static void dumpEvents(Object notifier)
+ {
+ dumpEvents(notifier, true);
+ }
+
+ public static void dumpEvents(Object notifier, boolean on)
+ {
+ if (notifier instanceof INotifier)
+ {
+ INotifier iNotifier = (INotifier)notifier;
+ IListener[] listeners = iNotifier.getListeners();
+
+ boolean wasOn = false;
+ for (int i = 0; i < listeners.length; i++)
+ {
+ if (listeners[i] == DUMPER)
+ {
+ wasOn = true;
+ break;
+ }
+ }
+
+ if (on && !wasOn)
+ {
+ iNotifier.addListener(DUMPER);
+ }
+ else if (!on && wasOn)
+ {
+ iNotifier.removeListener(DUMPER);
+ }
+ }
+ }
+
public static void skipTest(boolean skip)
{
if (skip)
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/ContainerEvent.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/ContainerEvent.java
index 6f39f176d6..8b24636004 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/ContainerEvent.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/ContainerEvent.java
@@ -13,13 +13,12 @@ package org.eclipse.net4j.util.container;
import org.eclipse.net4j.util.container.IContainerEventVisitor.Filtered;
import org.eclipse.net4j.util.event.Event;
-import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
/**
* A default {@link IContainerEvent container event} implementation.
- *
+ *
* @author Eike Stepper
* @noextend This class is not intended to be subclassed by clients.
* @apiviz.exclude
@@ -121,17 +120,21 @@ public class ContainerEvent<E> extends Event implements IContainerEvent<E>
}
@Override
- public String toString()
+ protected String formatAdditionalParameters()
{
StringBuilder builder = new StringBuilder();
for (IContainerDelta<E> delta : getDeltas())
{
- builder.append(", "); //$NON-NLS-1$
+ if (builder.length() != 0)
+ {
+ builder.append(", "); //$NON-NLS-1$
+ }
+
builder.append(delta.getKind());
builder.append("="); //$NON-NLS-1$
builder.append(delta.getElement());
}
- return MessageFormat.format("ContainerEvent[source={0}{1}]", getSource(), builder.toString()); //$NON-NLS-1$
+ return builder.toString();
}
}
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/SingleDeltaContainerEvent.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/SingleDeltaContainerEvent.java
index 925c01acec..47f565a303 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/SingleDeltaContainerEvent.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/SingleDeltaContainerEvent.java
@@ -17,7 +17,7 @@ import java.text.MessageFormat;
/**
* A {@link IContainerEvent container event} with a single element {@link IContainerDelta delta}.
- *
+ *
* @author Eike Stepper
* @noextend This class is not intended to be subclassed by clients.
* @apiviz.exclude
@@ -97,6 +97,6 @@ public class SingleDeltaContainerEvent<E> extends Event implements IContainerEve
@Override
public String toString()
{
- return MessageFormat.format("ContainerEvent[source={0}, {1}={2}]", getSource(), getDeltaElement(), getDeltaKind()); //$NON-NLS-1$
+ return MessageFormat.format("ContainerEvent[source={0}, {1}={2}]", getSource(), getDeltaKind(), getDeltaElement()); //$NON-NLS-1$
}
}
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/LifecycleEvent.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/LifecycleEvent.java
index 4cdcccf184..873cd046b3 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/LifecycleEvent.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/LifecycleEvent.java
@@ -52,4 +52,10 @@ public class LifecycleEvent extends Event implements ILifecycleEvent
{
return kind;
}
+
+ @Override
+ protected String formatAdditionalParameters()
+ {
+ return "kind=" + kind;
+ }
}

Back to the top