diff options
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; + } } |