diff options
8 files changed, 125 insertions, 21 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsAllConfigs.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsAllConfigs.java index 83e6a887c6..a905b65fa9 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsAllConfigs.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsAllConfigs.java @@ -42,6 +42,7 @@ import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_260764_Test; import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_261218_Test; import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_265114_Test; import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_266857_Test; +import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_267050_Test; import org.eclipse.emf.cdo.tests.config.impl.ConfigTest; import org.eclipse.emf.cdo.tests.config.impl.ConfigTestSuite; @@ -130,6 +131,7 @@ public abstract class AllTestsAllConfigs extends ConfigTestSuite testClasses.add(Bugzilla_261218_Test.class); testClasses.add(Bugzilla_265114_Test.class); testClasses.add(Bugzilla_266857_Test.class); + testClasses.add(Bugzilla_267050_Test.class); // TODO testClasses.add(NonCDOResourceTest.class); // TODO testClasses.add(GeneratedEcoreTest.class); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_267050_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_267050_Test.java new file mode 100644 index 0000000000..f51c1c69d7 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_267050_Test.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2004 - 2009 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: + * Simon McDuff - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.session.CDOSessionInvalidationEvent; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOTransaction; + +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.event.IListener; + +import java.util.Collection; + +/** + * Add new packages infos in the Notifications process at the client side + * + * @see https://bugs.eclipse.org/267050 + * @author Simon McDuff + */ +public class Bugzilla_267050_Test extends AbstractCDOTest +{ + @SuppressWarnings("unchecked") + public void testBugzilla_267050() throws InterruptedException + { + final Collection<CDOPackageUnit> newPackagesUnits[] = new Collection[1]; + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + + CDOSession session2 = openSession(); + session2.addListener(new IListener() + { + public void notifyEvent(IEvent event) + { + if (event instanceof CDOSessionInvalidationEvent) + { + CDOSessionInvalidationEvent e = (CDOSessionInvalidationEvent)event; + newPackagesUnits[0] = e.getNewPackageUnits(); + } + } + }); + + session.getPackageRegistry().putEPackage(getModel1Package()); + + CDOResource res = transaction.createResource("/res"); + Company specialPurchaseOrder = getModel1Factory().createCompany(); + res.getContents().add(specialPurchaseOrder); + transaction.commit(); + + boolean timedOut = new PollingTimeOuter(10, 100) + { + @Override + protected boolean successful() + { + return newPackagesUnits[0] != null; + } + }.timedOut(); + + assertEquals(false, timedOut); + + assertEquals(1, newPackagesUnits[0].size()); + assertEquals(getModel1Package().getNsURI(), newPackagesUnits[0].iterator().next().getTopLevelPackageInfo() + .getPackageURI()); + } +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionInvalidationEvent.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionInvalidationEvent.java index 34dabae819..c49029c18c 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionInvalidationEvent.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionInvalidationEvent.java @@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.session; import org.eclipse.emf.cdo.CDOInvalidationNotification; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.view.CDOAdapterPolicy; import org.eclipse.emf.cdo.view.CDOView; @@ -58,4 +59,10 @@ public interface CDOSessionInvalidationEvent extends CDOSessionEvent * Returns a collection of the {@link CDOID CDOIDs} of the removed objects. */ public Collection<CDOID> getDetachedObjects(); + + /** + * Returns a collection of the new {@link CDOPackageUnit package units}. + */ + public Collection<CDOPackageUnit> getNewPackageUnits(); + } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/CommitNotificationIndication.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/CommitNotificationIndication.java index 1d503bb412..a47030a1e3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/CommitNotificationIndication.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/CommitNotificationIndication.java @@ -28,6 +28,7 @@ import org.eclipse.emf.spi.cdo.InternalCDOSession; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -104,6 +105,6 @@ public class CommitNotificationIndication extends CDOClientIndication detachedObjects.add(in.readCDOID()); } - session.handleCommitNotification(timeStamp, dirtyOIDs, detachedObjects, deltas, null); + session.handleCommitNotification(timeStamp, Arrays.asList(packageUnits), dirtyOIDs, detachedObjects, deltas, null); } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/SyncRevisionsRequest.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/SyncRevisionsRequest.java index 065eda635a..314dfb6e9b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/SyncRevisionsRequest.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/net4j/protocol/SyncRevisionsRequest.java @@ -16,6 +16,7 @@ import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -113,7 +114,8 @@ public class SyncRevisionsRequest extends CDOClientRequest<Collection<CDOTimeSta Collection<CDOID> detachedObjects = getMap(mapofContext, revised).getDetachedObjects(); detachedObjects.add(id); } - + + Collection<CDOPackageUnit> emptyNewPackageUnits = Collections.emptyList(); for (CDOTimeStampContext timestampContext : mapofContext.values()) { Set<CDOIDAndVersion> dirtyObjects = timestampContext.getDirtyObjects(); @@ -125,7 +127,7 @@ public class SyncRevisionsRequest extends CDOClientRequest<Collection<CDOTimeSta ((CDOTimeStampContextImpl)timestampContext).setDirtyObjects(dirtyObjects); ((CDOTimeStampContextImpl)timestampContext).setDetachedObjects(detachedObjects); - getSession().handleSyncResponse(timestampContext.getTimeStamp(), dirtyObjects, detachedObjects); + getSession().handleSyncResponse(timestampContext.getTimeStamp(), emptyNewPackageUnits, dirtyObjects, detachedObjects); } return Collections.unmodifiableCollection(mapofContext.values()); 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 9a8838b44b..5ee1eb8b70 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 @@ -385,24 +385,27 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter /** * @since 2.0 */ - public void handleSyncResponse(long timestamp, Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects) + public void handleSyncResponse(long timestamp, Collection<CDOPackageUnit> newPackageUnits, + Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects) { - handleCommitNotification(timestamp, dirtyOIDs, detachedObjects, null, null, true, false); + handleCommitNotification(timestamp, newPackageUnits, dirtyOIDs, detachedObjects, null, null, true, false); } /** * @since 2.0 */ - public void handleCommitNotification(final long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, - final Collection<CDOID> detachedObjects, final Collection<CDORevisionDelta> deltas, InternalCDOView excludedView) + public void handleCommitNotification(final long timeStamp, final Collection<CDOPackageUnit> newPackageUnits, + Set<CDOIDAndVersion> dirtyOIDs, final Collection<CDOID> detachedObjects, + final Collection<CDORevisionDelta> deltas, InternalCDOView excludedView) { - handleCommitNotification(timeStamp, dirtyOIDs, detachedObjects, deltas, excludedView, options() + handleCommitNotification(timeStamp, newPackageUnits, dirtyOIDs, detachedObjects, deltas, excludedView, options() .isPassiveUpdateEnabled(), true); } - private void handleCommitNotification(final long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, - final Collection<CDOID> detachedObjects, final Collection<CDORevisionDelta> deltas, InternalCDOView excludedView, - final boolean passiveUpdate, boolean async) + private void handleCommitNotification(final long timeStamp, final Collection<CDOPackageUnit> newPackageUnits, + Set<CDOIDAndVersion> dirtyOIDs, final Collection<CDOID> detachedObjects, + final Collection<CDORevisionDelta> deltas, InternalCDOView excludedView, final boolean passiveUpdate, + boolean async) { if (passiveUpdate) { @@ -459,7 +462,7 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - fireInvalidationEvent(timeStamp, dirtyOIDs, detachedObjects, excludedView); + fireInvalidationEvent(timeStamp, newPackageUnits, dirtyOIDs, detachedObjects, excludedView); } private void updateRevisionForRemoteChanges(final long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, @@ -514,12 +517,13 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } /** + * @param packageUnits * @since 2.0 */ - public void fireInvalidationEvent(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects, - InternalCDOView excludedView) + public void fireInvalidationEvent(long timeStamp, Collection<CDOPackageUnit> packageUnits, + Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects, InternalCDOView excludedView) { - fireEvent(new InvalidationEvent(excludedView, timeStamp, dirtyOIDs, detachedObjects)); + fireEvent(new InvalidationEvent(excludedView, timeStamp, packageUnits, dirtyOIDs, detachedObjects)); } @Override @@ -1090,12 +1094,15 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter private Collection<CDOID> detachedObjects; - public InvalidationEvent(InternalCDOView view, long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, - Collection<CDOID> detachedObjects) + private Collection<CDOPackageUnit> newPackageUnits; + + public InvalidationEvent(InternalCDOView view, long timeStamp, Collection<CDOPackageUnit> packageUnits, + Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects) { super(CDOSessionImpl.this); this.view = view; this.timeStamp = timeStamp; + newPackageUnits = packageUnits; this.dirtyOIDs = dirtyOIDs; this.detachedObjects = detachedObjects; } @@ -1125,6 +1132,11 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter return detachedObjects; } + public Collection<CDOPackageUnit> getNewPackageUnits() + { + return newPackageUnits; + } + @Override public String toString() { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java index 9c6e9bd542..0dfe45740a 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java @@ -1305,7 +1305,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa ((InternalCDORevisionDelta)dirtyObjectDelta).adjustReferences(result.getReferenceAdjuster()); } - session.handleCommitNotification(timeStamp, dirtyIDs, detachedIDs, deltasCopy, getTransaction()); + session.handleCommitNotification(timeStamp, newPackageUnits, dirtyIDs, detachedIDs, deltasCopy, + getTransaction()); } lastCommitTime = timeStamp; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java index 50a4de0be3..fcf1618ae7 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; @@ -38,8 +39,10 @@ public interface InternalCDOSession extends CDOSession, CDOIDObjectFactory, public void viewDetached(InternalCDOView view); - public void handleCommitNotification(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, - Collection<CDOID> detachedObjects, Collection<CDORevisionDelta> deltas, InternalCDOView excludedView); + public void handleCommitNotification(long timeStamp, Collection<CDOPackageUnit> newPackageUnits, + Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects, Collection<CDORevisionDelta> deltas, + InternalCDOView excludedView); - public void handleSyncResponse(long timestamp, Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects); + public void handleSyncResponse(long timestamp, Collection<CDOPackageUnit> newPackageUnits, + Set<CDOIDAndVersion> dirtyOIDs, Collection<CDOID> detachedObjects); } |