Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java8
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java16
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java69
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java90
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java12
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java4
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java24
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java12
10 files changed, 125 insertions, 117 deletions
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 512d797390..b170267b5e 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
@@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.internal.server;
import org.eclipse.emf.cdo.common.CDOProtocolConstants;
import org.eclipse.emf.cdo.common.CDOProtocolView;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.id.CDOIDObject;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
import org.eclipse.emf.cdo.common.model.CDOClass;
@@ -197,7 +198,7 @@ public class Session extends Container<IView> implements ISession, CDOIDProvider
return new View(this, viewID, type);
}
- public void notifyInvalidation(long timeStamp, List<CDOID> dirtyIDs)
+ public void notifyInvalidation(long timeStamp, List<CDOIDAndVersion> dirtyIDs)
{
try
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
index 02cfb5ad0a..1661ad37f7 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
@@ -12,7 +12,7 @@
**************************************************************************/
package org.eclipse.emf.cdo.internal.server;
-import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.internal.server.bundle.OM;
import org.eclipse.emf.cdo.internal.server.protocol.CDOServerProtocol;
import org.eclipse.emf.cdo.server.ISession;
@@ -104,7 +104,7 @@ public class SessionManager extends Container<ISession> implements ISessionManag
}
}
- public void notifyInvalidation(long timeStamp, List<CDOID> dirtyIDs, Session excludedSession)
+ public void notifyInvalidation(long timeStamp, List<CDOIDAndVersion> dirtyIDs, Session excludedSession)
{
for (Session session : getSessions())
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java
index 25cc439d40..d75426c8c0 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java
@@ -11,9 +11,11 @@
package org.eclipse.emf.cdo.internal.server;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory;
import org.eclipse.emf.cdo.common.id.CDOIDTemp;
+import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOPackage;
import org.eclipse.emf.cdo.common.model.CDOPackageManager;
import org.eclipse.emf.cdo.common.model.core.CDOCorePackage;
@@ -199,10 +201,12 @@ public class Transaction extends View implements ITransaction, IStoreWriter.Comm
int modifications = dirtyObjectDeltas.length;
if (success && modifications > 0)
{
- List<CDOID> dirtyIDs = new ArrayList<CDOID>(modifications);
+ List<CDOIDAndVersion> dirtyIDs = new ArrayList<CDOIDAndVersion>(modifications);
for (int i = 0; i < modifications; i++)
{
- dirtyIDs.add(dirtyObjectDeltas[i].getID());
+ CDORevisionDelta delta = dirtyObjectDeltas[i];
+ CDOIDAndVersion dirtyID = CDOIDUtil.createIDAndVersion(delta.getID(), delta.getOriginVersion());
+ dirtyIDs.add(dirtyID);
}
SessionManager sessionManager = (SessionManager)repository.getSessionManager();
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java
index 1a6c64fa7d..90951c8036 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java
@@ -12,8 +12,7 @@
package org.eclipse.emf.cdo.internal.server.protocol;
import org.eclipse.emf.cdo.common.CDOProtocolConstants;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.internal.server.bundle.OM;
import org.eclipse.net4j.channel.IChannel;
@@ -33,9 +32,9 @@ public class InvalidationNotification extends Request
private long timeStamp;
- private List<CDOID> dirtyIDs;
+ private List<CDOIDAndVersion> dirtyIDs;
- public InvalidationNotification(IChannel channel, long timeStamp, List<CDOID> dirtyIDs)
+ public InvalidationNotification(IChannel channel, long timeStamp, List<CDOIDAndVersion> dirtyIDs)
{
super(channel);
this.timeStamp = timeStamp;
@@ -63,9 +62,14 @@ public class InvalidationNotification extends Request
}
out.writeInt(dirtyIDs.size());
- for (CDOID dirtyID : dirtyIDs)
+ for (CDOIDAndVersion dirtyID : dirtyIDs)
{
- CDOIDUtil.write(out, dirtyID);
+ if (PROTOCOL.isEnabled())
+ {
+ PROTOCOL.format("Writing dirty ID: {0}", dirtyID);
+ }
+
+ dirtyID.write(out, false);
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
index c32e966b63..cd24637a7f 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
@@ -14,11 +14,14 @@ import org.eclipse.emf.cdo.CDOSession;
import org.eclipse.emf.cdo.CDOSessionInvalidationEvent;
import org.eclipse.emf.cdo.CDOTransaction;
import org.eclipse.emf.cdo.CDOView;
+import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.internal.cdo.CDOTransactionImpl;
+
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
@@ -336,4 +339,70 @@ public class InvalidationTest extends AbstractCDOTest
msg("Checking after commit");
assertEquals(false, timeOuter.timedOut());
}
+
+ /**
+ * @see http://bugs.eclipse.org/236784
+ */
+ public void testInvalidateAndCache() throws Exception
+ {
+ msg("Opening sessionA");
+ CDOSession sessionA = openModel1Session();
+
+ msg("Opening transactionA");
+ final CDOTransactionImpl transactionA = (CDOTransactionImpl)sessionA.openTransaction();
+ final CDOID cdoidA;
+
+ // *************************************************************
+ {
+ msg("Creating categoryA");
+ Category categoryA = Model1Factory.eINSTANCE.createCategory();
+ categoryA.setName("categoryA");
+
+ msg("Creating companyA");
+ Company companyA = Model1Factory.eINSTANCE.createCompany();
+
+ msg("Adding categories");
+ companyA.getCategories().add(categoryA);
+
+ msg("Creating resource");
+ CDOResource resourceA = transactionA.createResource("/test1");
+
+ msg("Adding companyA");
+ resourceA.getContents().add(companyA);
+
+ msg("Committing");
+ transactionA.commit();
+
+ cdoidA = categoryA.cdoID();
+ transactionA.removeObject(cdoidA);
+ }
+
+ // *************************************************************
+ msg("Opening sessionB");
+ CDOSession sessionB = openSession();
+
+ msg("Opening transactionB");
+ CDOTransaction transactionB = sessionB.openTransaction();
+ Category categoryB = (Category)transactionB.getObject(cdoidA, true);
+
+ msg("Changing name");
+ categoryB.setName("CHANGED NAME");
+
+ msg("\n\n\n\n\n\n\n\n\n\n\nCommitting");
+ transactionB.commit();
+
+ msg("Checking after commit");
+ boolean timedOut = new PollingTimeOuter(200, 100)
+ {
+ @Override
+ protected boolean successful()
+ {
+ Category categoryA = (Category)transactionA.getObject(cdoidA, true);
+ String name = categoryA.getName();
+ return "CHANGED NAME".equals(name);
+ }
+ }.timedOut();
+
+ assertEquals(false, timedOut);
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java
deleted file mode 100644
index b0b18b3ce1..0000000000
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/***************************************************************************
- * Copyright (c) 2004 - 2008 Eike Stepper, Germany.
- * 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.CDOSession;
-import org.eclipse.emf.cdo.CDOTransaction;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.tests.model1.Category;
-import org.eclipse.emf.cdo.tests.model1.Company;
-import org.eclipse.emf.cdo.tests.model1.Model1Factory;
-
-import org.eclipse.emf.internal.cdo.CDOTransactionImpl;
-
-/**
- * @author Eike Stepper
- */
-public class SessionTest extends AbstractCDOTest
-{
- public void testInvalidateAndCache() throws Exception
- {
- msg("Opening sessionA");
- CDOSession sessionA = openModel1Session();
-
- msg("Opening transactionA");
- final CDOTransactionImpl transactionA = (CDOTransactionImpl)sessionA.openTransaction();
- final CDOID cdoidA;
-
- // *************************************************************
- {
- msg("Creating categoryA");
- Category categoryA = Model1Factory.eINSTANCE.createCategory();
- categoryA.setName("categoryA");
-
- msg("Creating companyA");
- Company companyA = Model1Factory.eINSTANCE.createCompany();
-
- msg("Adding categories");
- companyA.getCategories().add(categoryA);
-
- msg("Creating resource");
- CDOResource resourceA = transactionA.createResource("/test1");
-
- msg("Adding companyA");
- resourceA.getContents().add(companyA);
-
- msg("Committing");
- transactionA.commit();
-
- cdoidA = categoryA.cdoID();
- transactionA.removeObject(cdoidA);
- }
-
- // *************************************************************
- msg("Opening sessionB");
- CDOSession sessionB = openSession();
-
- msg("Opening transactionB");
- CDOTransaction transactionB = sessionB.openTransaction();
- Category categoryB = (Category)transactionB.getObject(cdoidA, true);
-
- msg("Changing name");
- categoryB.setName("CHANGED NAME");
-
- msg("\n\n\n\n\n\n\n\n\n\n\nCommitting");
- transactionB.commit();
-
- msg("Checking after commit");
- boolean timedOut = new PollingTimeOuter(200, 100)
- {
- @Override
- protected boolean successful()
- {
- Category categoryA = (Category)transactionA.getObject(cdoidA, true);
- String name = categoryA.getName();
- return "CHANGED NAME".equals(name);
- }
- }.timedOut();
-
- assertEquals(false, timedOut);
- }
-}
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java
index 78f3594657..d2f37e7b09 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java
@@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.CDOTransactionFinishedEvent;
import org.eclipse.emf.cdo.CDOTransactionStartedEvent;
import org.eclipse.emf.cdo.CDOView;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.internal.ui.ItemsProcessor;
import org.eclipse.emf.internal.cdo.InternalCDOObject;
@@ -29,6 +30,7 @@ import org.eclipse.net4j.util.lifecycle.ILifecycleEvent;
import org.eclipse.jface.viewers.TreeViewer;
+import java.util.HashSet;
import java.util.Set;
/**
@@ -159,8 +161,14 @@ public class CDOEventHandler
treeViewer = viewer;
}
- protected void sessionInvalidated(Set<CDOID> dirtyOIDs)
+ protected void sessionInvalidated(Set<CDOIDAndVersion> dirtyOIDs)
{
+ Set<CDOID> idsWithoutVersion = new HashSet<CDOID>();
+ for (CDOIDAndVersion idAandVersion : dirtyOIDs)
+ {
+ idsWithoutVersion.add(idAandVersion.getID());
+ }
+
new ItemsProcessor(view)
{
@Override
@@ -169,7 +177,7 @@ public class CDOEventHandler
objectInvalidated(cdoObject);
viewer.refresh(cdoObject.cdoInternalInstance(), true);
}
- }.processCDOObjects(treeViewer, dirtyOIDs);
+ }.processCDOObjects(treeViewer, idsWithoutVersion);
}
protected void objectInvalidated(InternalCDOObject cdoObject)
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java
index 57c0cea688..62198d56d3 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java
@@ -10,7 +10,7 @@
**************************************************************************/
package org.eclipse.emf.cdo;
-import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import java.util.Set;
@@ -29,5 +29,5 @@ public interface CDOSessionInvalidationEvent extends CDOSessionEvent
*/
public long getTimeStamp();
- public Set<CDOID> getDirtyOIDs();
+ public Set<CDOIDAndVersion> getDirtyOIDs();
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
index d83cf69752..43f10f795b 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
@@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.CDOSessionInvalidationEvent;
import org.eclipse.emf.cdo.CDOView;
import org.eclipse.emf.cdo.common.CDOProtocolConstants;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.id.CDOIDLibraryDescriptor;
import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
import org.eclipse.emf.cdo.common.id.CDOIDObject;
@@ -26,6 +27,7 @@ import org.eclipse.emf.cdo.common.model.CDOClassRef;
import org.eclipse.emf.cdo.common.model.CDOPackage;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.util.TransportException;
+import org.eclipse.emf.cdo.spi.common.InternalCDORevision;
import org.eclipse.emf.cdo.util.CDOPackageRegistry;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.LegacySystemNotAvailableException;
@@ -543,8 +545,18 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD
types.put(id, type);
}
- public void notifyInvalidation(long timeStamp, Set<CDOID> dirtyOIDs, CDOViewImpl excludedView)
+ public void notifyInvalidation(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, CDOViewImpl excludedView)
{
+ for (CDOIDAndVersion dirtyOID : dirtyOIDs)
+ {
+ InternalCDORevision revision = getRevisionManager().getRevisionByVersion(dirtyOID.getID(), 0,
+ dirtyOID.getVersion(), false);
+ if (revision != null)
+ {
+ revision.setRevised(timeStamp - 1);
+ }
+ }
+
dirtyOIDs = Collections.unmodifiableSet(dirtyOIDs);
for (CDOViewImpl view : getViews())
{
@@ -564,7 +576,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD
fireInvalidationEvent(timeStamp, dirtyOIDs, excludedView);
}
- public void fireInvalidationEvent(long timeStamp, Set<CDOID> dirtyOIDs, CDOViewImpl excludedView)
+ public void fireInvalidationEvent(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, CDOViewImpl excludedView)
{
fireEvent(new InvalidationEvent(excludedView, timeStamp, dirtyOIDs));
}
@@ -814,9 +826,9 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD
private long timeStamp;
- private Set<CDOID> dirtyOIDs;
+ private Set<CDOIDAndVersion> dirtyOIDs;
- public InvalidationEvent(CDOViewImpl view, long timeStamp, Set<CDOID> dirtyOIDs)
+ public InvalidationEvent(CDOViewImpl view, long timeStamp, Set<CDOIDAndVersion> dirtyOIDs)
{
super(CDOSessionImpl.this);
this.view = view;
@@ -839,7 +851,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD
return timeStamp;
}
- public Set<CDOID> getDirtyOIDs()
+ public Set<CDOIDAndVersion> getDirtyOIDs()
{
return dirtyOIDs;
}
@@ -847,7 +859,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD
@Override
public String toString()
{
- return "CDOSessionInvalidationEvent" + dirtyOIDs;
+ return "CDOSessionInvalidationEvent: " + dirtyOIDs;
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
index 603baf4631..9a013d9827 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
@@ -531,12 +531,12 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
InternalCDORevision revision = (InternalCDORevision)object.cdoRevision();
revision.setRevised(timeStamp - 1);
- CDOViewImpl view = (CDOViewImpl)object.cdoView();
- InternalCDORevision baseRevision = view.getRevision(object.cdoID(), false);
- if (baseRevision != null && baseRevision.getVersion() + 1 == revision.getVersion())
- {
- baseRevision.setRevised(timeStamp - 1);
- }
+ // CDOViewImpl view = (CDOViewImpl)object.cdoView();
+ // InternalCDORevision baseRevision = view.getRevision(object.cdoID(), false);
+ // if (baseRevision != null && baseRevision.getVersion() + 1 == revision.getVersion())
+ // {
+ // baseRevision.setRevised(timeStamp - 1);
+ // }
}
}

Back to the top