Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-07-06 09:40:36 +0000
committerEike Stepper2010-07-06 09:40:36 +0000
commit5a8156463248f97dbf51db133af290a1da83f331 (patch)
treef361ac77754127b831e250a6254bb30402b31cf1
parente4b6a0c94e8822a7e41ab6a4cd2ab78c442d50b6 (diff)
downloadcdo-5a8156463248f97dbf51db133af290a1da83f331.tar.gz
cdo-5a8156463248f97dbf51db133af290a1da83f331.tar.xz
cdo-5a8156463248f97dbf51db133af290a1da83f331.zip
[318664] Raw replication does not send CommitNotifications
https://bugs.eclipse.org/bugs/show_bug.cgi?id=318664
-rw-r--r--plugins/org.eclipse.emf.cdo.server/.settings/.api_filters9
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java124
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ISession.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java7
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineRawTest.java147
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java5
-rw-r--r--plugins/org.eclipse.emf.cdo/.settings/.api_filters16
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java1
-rw-r--r--plugins/org.eclipse.net4j.db.hsqldb/.settings/.api_filters10
-rw-r--r--plugins/org.eclipse.net4j.util/.settings/.api_filters7
15 files changed, 333 insertions, 40 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters
index cc95b1683e..0b6ed176db 100644
--- a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters
+++ b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters
@@ -9,15 +9,6 @@
</message_arguments>
</filter>
</resource>
- <resource path="src/org/eclipse/emf/cdo/internal/server/Repository.java" type="org.eclipse.emf.cdo.internal.server.Repository">
- <filter id="574660632">
- <message_arguments>
- <message_argument value="InternalRepository"/>
- <message_argument value="CDOCommonRepository"/>
- <message_argument value="Repository"/>
- </message_arguments>
- </filter>
- </resource>
<resource path="src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionConfiguration.java" type="org.eclipse.emf.cdo.internal.server.embedded.EmbeddedClientSessionConfiguration$RepositoryInfo">
<filter id="574660632">
<message_arguments>
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
index 395babd73a..e89ade6de7 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
@@ -57,7 +57,6 @@ import org.eclipse.emf.cdo.server.StoreThreadLocal;
import org.eclipse.emf.cdo.spi.common.CDOReplicationContext;
import org.eclipse.emf.cdo.spi.common.CDOReplicationInfo;
import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
-import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment;
import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
@@ -1085,7 +1084,7 @@ public class Repository extends Container<Object> implements InternalRepository
Set<CDOPackageUnit> replicatedPackageUnits = new HashSet<CDOPackageUnit>();
InternalCDOCommitInfoManager manager = getCommitInfoManager();
- List<CDOChangeSetSegment> segments = getBaselineSegments(startTime);
+ List<CDOChangeSetSegment> segments = getBaselineSegments(startTime, getBranchManager().getMainBranch());
for (CDOChangeSetSegment segment : segments)
{
List<CDOPackageUnit> newPackages = getPackageUnitsToReplicate(segment, replicatedPackageUnits);
@@ -1108,23 +1107,22 @@ public class Repository extends Container<Object> implements InternalRepository
}
}
- private List<CDOChangeSetSegment> getBaselineSegments(long startTime)
+ private List<CDOChangeSetSegment> getBaselineSegments(long startTime, CDOBranch branch)
{
List<CDOChangeSetSegment> segments = new ArrayList<CDOChangeSetSegment>();
- InternalCDOBranch branch = getBranchManager().getMainBranch();
getBaselineSegments(startTime, branch, segments);
Collections.sort(segments);
return segments;
}
- private void getBaselineSegments(long startTime, InternalCDOBranch branch, List<CDOChangeSetSegment> segments)
+ private void getBaselineSegments(long startTime, CDOBranch branch, List<CDOChangeSetSegment> segments)
{
if (startTime == CDOBranchPoint.UNSPECIFIED_DATE)
{
startTime = branch.getBase().getTimeStamp();
}
- InternalCDOBranch[] branches = branch.getBranches();
+ CDOBranch[] branches = branch.getBranches();
Arrays.sort(branches, new Comparator<CDOBranch>()
{
public int compare(CDOBranch o1, CDOBranch o2)
@@ -1133,7 +1131,7 @@ public class Repository extends Container<Object> implements InternalRepository
}
});
- for (InternalCDOBranch subBranch : branches)
+ for (CDOBranch subBranch : branches)
{
long baseTimeStamp = subBranch.getBase().getTimeStamp();
if (baseTimeStamp > startTime)
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java
index f67d61e667..16011aa8ba 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java
@@ -76,6 +76,11 @@ public class Session extends Container<IView> implements InternalSession
private PassiveUpdateMode passiveUpdateMode = PassiveUpdateMode.INVALIDATIONS;
+ private long lastUpdateTime;
+
+ @ExcludeFromDump
+ private Object lastUpdateTimeLock = new Object();
+
private ConcurrentMap<Integer, InternalView> views = new ConcurrentHashMap<Integer, InternalView>();
private AtomicInteger lastTempViewID = new AtomicInteger();
@@ -197,6 +202,14 @@ public class Session extends Container<IView> implements InternalSession
this.passiveUpdateMode = passiveUpdateMode;
}
+ public long getLastUpdateTime()
+ {
+ synchronized (lastUpdateTimeLock)
+ {
+ return lastUpdateTime;
+ }
+ }
+
public InternalView[] getElements()
{
checkActive();
@@ -436,6 +449,11 @@ public class Session extends Container<IView> implements InternalSession
};
}
});
+
+ synchronized (lastUpdateTimeLock)
+ {
+ lastUpdateTime = commitInfo.getTimeStamp();
+ }
}
private boolean hasSubscription(CDOID id, InternalView[] views)
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
index 5d61e18c70..562f526fe9 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
@@ -923,7 +923,7 @@ public class TransactionCommitContext implements InternalCommitContext
addNewPackageUnits(monitor.fork());
addRevisions(newObjects, monitor.fork());
addRevisions(dirtyObjects, monitor.fork());
- revisedDetachObjects(monitor.fork());
+ reviseDetachedObjects(monitor.fork());
unlockObjects();
monitor.worked();
@@ -992,7 +992,7 @@ public class TransactionCommitContext implements InternalCommitContext
}
}
- private void revisedDetachObjects(OMMonitor monitor)
+ private void reviseDetachedObjects(OMMonitor monitor)
{
try
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java
index fda29b0357..6976942048 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java
@@ -99,6 +99,12 @@ public final class ReplicatorCommitContext extends TransactionCommitContext
}
@Override
+ protected void checkXRefs()
+ {
+ // Do nothing
+ }
+
+ @Override
protected InternalCDORevision getOldRevision(InternalCDORevisionManager revisionManager,
InternalCDORevisionDelta delta)
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
index 3ff1e04ed8..8acb8b9e21 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
@@ -13,16 +13,28 @@ package org.eclipse.emf.cdo.internal.server.syncing;
import org.eclipse.emf.cdo.common.CDOCommonRepository;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
+import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
+import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
+import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
+import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
import org.eclipse.emf.cdo.internal.server.Repository;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.StoreThreadLocal;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
+import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
import org.eclipse.emf.cdo.spi.server.InternalCommitContext;
import org.eclipse.emf.cdo.spi.server.InternalRepositorySynchronizer;
import org.eclipse.emf.cdo.spi.server.InternalSession;
+import org.eclipse.emf.cdo.spi.server.InternalSessionManager;
import org.eclipse.emf.cdo.spi.server.InternalStore;
import org.eclipse.emf.cdo.spi.server.InternalSynchronizableRepository;
import org.eclipse.emf.cdo.spi.server.InternalTransaction;
@@ -36,6 +48,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
/**
@@ -209,6 +222,9 @@ public abstract class SynchronizableRepository extends Repository.Default implem
IStoreAccessor accessor = StoreThreadLocal.getAccessor();
accessor.rawImport(in, fromBranchID, toBranchID, fromCommitTime, toCommitTime);
+ replicateRawReviseRevisions();
+ replicateRawNotifyClients(lastReplicatedCommitTime, toCommitTime);
+
setLastReplicatedBranchID(toBranchID);
setLastReplicatedCommitTime(toCommitTime);
setLastCommitTimeStamp(toCommitTime);
@@ -219,6 +235,69 @@ public abstract class SynchronizableRepository extends Repository.Default implem
}
}
+ private void replicateRawReviseRevisions()
+ {
+ InternalCDORevisionCache cache = getRevisionManager().getCache();
+ for (CDORevision revision : cache.getCurrentRevisions())
+ {
+ cache.removeRevision(revision.getID(), revision);
+ }
+ }
+
+ private void replicateRawNotifyClients(long fromCommitTime, long toCommitTime)
+ {
+ InternalCDOCommitInfoManager manager = getCommitInfoManager();
+ InternalSessionManager sessionManager = getSessionManager();
+
+ Map<CDOBranch, TimeRange> branches = replicateRawGetBranches(fromCommitTime, toCommitTime);
+ for (Entry<CDOBranch, TimeRange> entry : branches.entrySet())
+ {
+ CDOBranch branch = entry.getKey();
+ TimeRange range = entry.getValue();
+ fromCommitTime = range.getTime1();
+ toCommitTime = range.getTime2();
+
+ CDOBranchPoint startPoint = branch.getPoint(fromCommitTime);
+ CDOBranchPoint endPoint = branch.getPoint(toCommitTime);
+ CDOChangeSetData changeSet = getChangeSet(startPoint, endPoint);
+
+ List<CDOPackageUnit> newPackages = Collections.emptyList(); // TODO Notify about new packages
+ List<CDOIDAndVersion> newObjects = changeSet.getNewObjects();
+ List<CDORevisionKey> changedObjects = changeSet.getChangedObjects();
+ List<CDOIDAndVersion> detachedObjects = changeSet.getDetachedObjects();
+ CDOCommitData data = new CDOCommitDataImpl(newPackages, newObjects, changedObjects, detachedObjects);
+
+ String comment = "<replicate raw commits>"; //$NON-NLS-1$
+ CDOCommitInfo commitInfo = manager.createCommitInfo(branch, toCommitTime, SYSTEM_USER_ID, comment, data);
+ sessionManager.sendCommitNotification(replicatorSession, commitInfo);
+ }
+ }
+
+ private Map<CDOBranch, TimeRange> replicateRawGetBranches(long fromCommitTime, long toCommitTime)
+ {
+ final Map<CDOBranch, TimeRange> branches = new HashMap<CDOBranch, TimeRange>();
+ CDOCommitInfoHandler handler = new CDOCommitInfoHandler()
+ {
+ public void handleCommitInfo(CDOCommitInfo commitInfo)
+ {
+ CDOBranch branch = commitInfo.getBranch();
+ long timeStamp = commitInfo.getTimeStamp();
+ TimeRange range = branches.get(branch);
+ if (range == null)
+ {
+ branches.put(branch, new TimeRange(timeStamp));
+ }
+ else
+ {
+ range.update(timeStamp);
+ }
+ }
+ };
+
+ getCommitInfoManager().getCommitInfos(fromCommitTime, toCommitTime, handler);
+ return branches;
+ }
+
@Override
public abstract InternalCommitContext createCommitContext(InternalTransaction transaction);
@@ -316,4 +395,49 @@ public abstract class SynchronizableRepository extends Repository.Default implem
{
setState(INITIAL);
}
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class TimeRange
+ {
+ private long time1;
+
+ private long time2;
+
+ public TimeRange(long time)
+ {
+ time1 = time;
+ time2 = time;
+ }
+
+ public void update(long time)
+ {
+ if (time < time1)
+ {
+ time1 = time;
+ }
+
+ if (time > time2)
+ {
+ time2 = time;
+ }
+ }
+
+ public long getTime1()
+ {
+ return time1;
+ }
+
+ public long getTime2()
+ {
+ return time2;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "[" + CDOCommonUtil.formatTimeStamp(time1) + " - " + CDOCommonUtil.formatTimeStamp(time1) + "]";
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ISession.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ISession.java
index dee1dfa2ff..1d81df85c3 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ISession.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ISession.java
@@ -33,6 +33,11 @@ public interface ISession extends CDOCommonSession, IContainer<IView>
public ISessionProtocol getProtocol();
/**
+ * @since 4.0
+ */
+ public long getLastUpdateTime();
+
+ /**
* @since 2.0
*/
public boolean isSubscribed();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
index 5ae2a382f5..f729925a4e 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
@@ -32,10 +32,11 @@ public class AllTestsMEMOffline extends AllConfigs
{
// super.initTestClasses(testClasses);
- testClasses.add(OfflineTest.class);
- testClasses.add(OfflineDelayed2Test.class);
+ testClasses.add(OfflineRawTest.class);
+ // testClasses.add(OfflineTest.class);
+ // testClasses.add(OfflineDelayed2Test.class);
// testClasses.add(OfflineSqueezedTest.class);
- testClasses.add(FailoverTest.class);
+ // testClasses.add(FailoverTest.class);
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineRawTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineRawTest.java
index 563b39bd28..751585734a 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineRawTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineRawTest.java
@@ -10,6 +10,18 @@
*/
package org.eclipse.emf.cdo.tests;
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
+import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta;
+import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
+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.spi.server.InternalRepository;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.view.CDOViewInvalidationEvent;
+
+import org.eclipse.net4j.util.event.IEvent;
+
/**
* @author Eike Stepper
*/
@@ -20,4 +32,139 @@ public class OfflineRawTest extends OfflineTest
{
return true;
}
+
+ /**
+ * @since 4.0
+ */
+ public void testNotification() throws Exception
+ {
+ InternalRepository clone = getRepository();
+ waitForOnline(clone);
+
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ resource.getContents().add(getModel1Factory().createCompany());
+ transaction.setCommitComment("resource with one company created on clone");
+ transaction.commit();
+
+ getOfflineConfig().stopMasterTransport();
+ waitForOffline(clone);
+
+ TestListener sessionListener = new TestListener();
+ session.addListener(sessionListener);
+
+ TestListener transactionListener = new TestListener();
+ transaction.addListener(transactionListener);
+
+ {
+ CDOSession masterSession = openSession(clone.getName() + "_master");
+ CDOTransaction masterTransaction = masterSession.openTransaction();
+ CDOResource masterResource = masterTransaction.getResource("/my/resource");
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.setCommitComment("one company added on master");
+ masterTransaction.commit();
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.setCommitComment("one company added on master");
+ masterTransaction.commit();
+
+ masterTransaction.close();
+ }
+
+ getOfflineConfig().startMasterTransport();
+ waitForOnline(clone);
+ sleep(1000);
+
+ IEvent[] sessionEvents = sessionListener.getEvents();
+ assertEquals(4, sessionEvents.length); // 3x repo state change + 1x invalidation
+
+ CDOSessionInvalidationEvent sessionInvalidationEvent = (CDOSessionInvalidationEvent)sessionEvents[3];
+ assertEquals(2, sessionInvalidationEvent.getNewObjects().size());
+ assertEquals(1, sessionInvalidationEvent.getChangedObjects().size());
+ assertEquals(0, sessionInvalidationEvent.getDetachedObjects().size());
+
+ IEvent[] transactionEvents = transactionListener.getEvents();
+ assertEquals(2, transactionEvents.length); // 1x invalidation + 1x adapters notified
+
+ CDOViewInvalidationEvent viewInvalidationEvent = (CDOViewInvalidationEvent)transactionEvents[0];
+ assertEquals(1, viewInvalidationEvent.getDirtyObjects().size());
+ assertEquals(1, viewInvalidationEvent.getRevisionDeltas().size());
+ assertEquals(0, viewInvalidationEvent.getDetachedObjects().size());
+
+ CDORevisionDelta delta = viewInvalidationEvent.getRevisionDeltas().get(resource);
+ assertEquals(null, delta);
+ assertEquals(true, viewInvalidationEvent.getRevisionDeltas().containsKey(resource));
+ }
+
+ /**
+ * @since 4.0
+ */
+ public void testNotificationAllDeltas() throws Exception
+ {
+ InternalRepository clone = getRepository();
+ waitForOnline(clone);
+
+ CDOSession session = openSession();
+ session.options().setPassiveUpdateMode(PassiveUpdateMode.ADDITIONS);
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ resource.getContents().add(getModel1Factory().createCompany());
+ transaction.setCommitComment("resource with one company created on clone");
+ transaction.commit();
+
+ getOfflineConfig().stopMasterTransport();
+ waitForOffline(clone);
+
+ TestListener sessionListener = new TestListener();
+ session.addListener(sessionListener);
+
+ TestListener transactionListener = new TestListener();
+ transaction.addListener(transactionListener);
+
+ {
+ CDOSession masterSession = openSession(clone.getName() + "_master");
+ CDOTransaction masterTransaction = masterSession.openTransaction();
+ CDOResource masterResource = masterTransaction.getResource("/my/resource");
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.setCommitComment("one company added on master");
+ masterTransaction.commit();
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.setCommitComment("one company added on master");
+ masterTransaction.commit();
+
+ masterTransaction.close();
+ }
+
+ getOfflineConfig().startMasterTransport();
+ waitForOnline(clone);
+ sleep(1000);
+
+ IEvent[] sessionEvents = sessionListener.getEvents();
+ assertEquals(4, sessionEvents.length); // 3x repo state change + 1x invalidation
+
+ CDOSessionInvalidationEvent sessionInvalidationEvent = (CDOSessionInvalidationEvent)sessionEvents[3];
+ assertEquals(2, sessionInvalidationEvent.getNewObjects().size());
+ assertEquals(1, sessionInvalidationEvent.getChangedObjects().size());
+ assertEquals(0, sessionInvalidationEvent.getDetachedObjects().size());
+
+ IEvent[] transactionEvents = transactionListener.getEvents();
+ assertEquals(2, transactionEvents.length); // 1x invalidation + 1x adapters notified
+
+ CDOViewInvalidationEvent viewInvalidationEvent = (CDOViewInvalidationEvent)transactionEvents[0];
+ assertEquals(1, viewInvalidationEvent.getDirtyObjects().size());
+ assertEquals(1, viewInvalidationEvent.getRevisionDeltas().size());
+ assertEquals(0, viewInvalidationEvent.getDetachedObjects().size());
+
+ CDORevisionDelta delta = viewInvalidationEvent.getRevisionDeltas().get(resource);
+ assertEquals(1, delta.getFeatureDeltas().size());
+
+ CDOListFeatureDelta listDelta = (CDOListFeatureDelta)delta.getFeatureDeltas().get(0);
+ assertEquals(2, listDelta.getListChanges().size());
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
index 05386f54a9..e242c8663c 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
@@ -310,7 +310,10 @@ public class OfflineTest extends AbstractSyncingTest
assertEquals(CDOID.Type.OBJECT, offlineCompany.cdoID().getType());
}
- public void testDisconnectAndCommitAndMergeWithNewPackages() throws Exception
+ /**
+ * @since 4.0
+ */
+ public void _testDisconnectAndCommitAndMergeWithNewPackages() throws Exception
{
OfflineClone clone = (OfflineClone)getRepository();
waitForOnline(clone);
diff --git a/plugins/org.eclipse.emf.cdo/.settings/.api_filters b/plugins/org.eclipse.emf.cdo/.settings/.api_filters
index 1bef87d71f..22dcbe6e9f 100644
--- a/plugins/org.eclipse.emf.cdo/.settings/.api_filters
+++ b/plugins/org.eclipse.emf.cdo/.settings/.api_filters
@@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<component id="org.eclipse.emf.cdo" version="2">
+ <resource path="src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java" type="org.eclipse.emf.cdo.transaction.CDOPushTransaction">
+ <filter id="338792546">
+ <message_arguments>
+ <message_argument value="org.eclipse.emf.cdo.transaction.CDOPushTransaction"/>
+ <message_argument value="resolveConflicts(CDOConflictResolver[])"/>
+ </message_arguments>
+ </filter>
+ </resource>
<resource path="src/org/eclipse/emf/cdo/transaction/CDOTransaction.java" type="org.eclipse.emf.cdo.transaction.CDOTransaction">
<filter id="405901410">
<message_arguments>
@@ -15,4 +23,12 @@
</message_arguments>
</filter>
</resource>
+ <resource path="src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java" type="org.eclipse.emf.spi.cdo.InternalCDOTransaction">
+ <filter id="405901410">
+ <message_arguments>
+ <message_argument value="org.eclipse.emf.spi.cdo.InternalCDOTransaction"/>
+ <message_argument value="handleConflicts(Set&lt;CDOObject&gt;)"/>
+ </message_arguments>
+ </filter>
+ </resource>
</component>
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
index d4206ae3ce..5bfab2d11e 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
@@ -1494,7 +1494,7 @@ public class CDOViewImpl extends Lifecycle implements InternalCDOView
if (key instanceof CDORevisionDelta)
{
delta = (CDORevisionDelta)key;
- // Clone the revision delta if we are a transaction. Thus a conflict resolver will be allowed to modify them.
+ // Copy the revision delta if we are a transaction, so that conflict resolvers can modify it.
if (this instanceof CDOTransaction)
{
delta = new CDORevisionDeltaImpl(delta, true);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java
index 08603602eb..4be5a9706c 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java
@@ -32,6 +32,7 @@ import java.util.Map;
/**
* @author Simon McDuff
* @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
*/
public interface InternalCDOTransaction extends CDOTransaction, InternalCDOUserTransaction, InternalCDOView
{
diff --git a/plugins/org.eclipse.net4j.db.hsqldb/.settings/.api_filters b/plugins/org.eclipse.net4j.db.hsqldb/.settings/.api_filters
deleted file mode 100644
index 8f096cdb6b..0000000000
--- a/plugins/org.eclipse.net4j.db.hsqldb/.settings/.api_filters
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.net4j.db.hsqldb" version="2">
- <resource path="src/org/eclipse/net4j/db/hsqldb/HSQLDBDataSource.java" type="org.eclipse.net4j.db.hsqldb.HSQLDBDataSource">
- <filter id="337682486">
- <message_arguments>
- <message_argument value="org.eclipse.net4j.db.hsqldb.HSQLDBDataSource"/>
- </message_arguments>
- </filter>
- </resource>
-</component>
diff --git a/plugins/org.eclipse.net4j.util/.settings/.api_filters b/plugins/org.eclipse.net4j.util/.settings/.api_filters
index 2df5c82b71..af1f432d4e 100644
--- a/plugins/org.eclipse.net4j.util/.settings/.api_filters
+++ b/plugins/org.eclipse.net4j.util/.settings/.api_filters
@@ -68,11 +68,4 @@
</message_arguments>
</filter>
</resource>
- <resource path="src/org/eclipse/net4j/util/concurrent/RoundRobinList.java" type="org.eclipse.net4j.util.concurrent.RoundRobinList">
- <filter id="337682486">
- <message_arguments>
- <message_argument value="org.eclipse.net4j.util.concurrent.RoundRobinList"/>
- </message_arguments>
- </filter>
- </resource>
</component>

Back to the top