Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-10-09 17:32:01 +0000
committerEike Stepper2010-10-09 17:32:01 +0000
commitdaed4e7bf5eb819d247df5a8b13424f393850139 (patch)
tree06659e9ffd18648d33cbffbf37631307838973bf /plugins/org.eclipse.emf.cdo.server.ocl
parent72865d3be24ec8c65230fb0eb99e399cda91019b (diff)
downloadcdo-daed4e7bf5eb819d247df5a8b13424f393850139.tar.gz
cdo-daed4e7bf5eb819d247df5a8b13424f393850139.tar.xz
cdo-daed4e7bf5eb819d247df5a8b13424f393850139.zip
[256931] Provide common query language (OCL)
https://bugs.eclipse.org/bugs/show_bug.cgi?id=256931
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.ocl')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java121
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java22
2 files changed, 121 insertions, 22 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java
index da00a092bf..fcc786e985 100644
--- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java
+++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java
@@ -11,12 +11,16 @@
package org.eclipse.emf.cdo.server.ocl;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.commit.CDOChangeKind;
+import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.emf.cdo.common.revision.cache.CDORevisionCacheAdder;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.StoreThreadLocal;
+import org.eclipse.emf.cdo.util.ObjectNotFoundException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.ecore.EClass;
@@ -27,6 +31,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
+import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -39,6 +44,8 @@ public class CDOExtentCreator implements OCLExtentCreator
{
private CDOView view;
+ private CDOChangeSetData changeSetData;
+
private CDORevisionCacheAdder revisionCacheAdder;
public CDOExtentCreator(CDOView view)
@@ -51,6 +58,16 @@ public class CDOExtentCreator implements OCLExtentCreator
return view;
}
+ public CDOChangeSetData getChangeSetData()
+ {
+ return changeSetData;
+ }
+
+ public void setChangeSetData(CDOChangeSetData changeSetData)
+ {
+ this.changeSetData = changeSetData;
+ }
+
public CDORevisionCacheAdder getRevisionCacheAdder()
{
return revisionCacheAdder;
@@ -73,6 +90,22 @@ public class CDOExtentCreator implements OCLExtentCreator
final AtomicBoolean canceled)
{
final Set<EObject> extent = new HashSet<EObject>();
+ if (changeSetData != null)
+ {
+ List<CDOIDAndVersion> newObjects = changeSetData.getNewObjects();
+ if (newObjects != null)
+ {
+ for (CDOIDAndVersion key : newObjects)
+ {
+ EObject object = getEObject(key.getID());
+ if (object != null)
+ {
+ extent.add(object);
+ }
+ }
+ }
+ }
+
accessor.handleRevisions(eClass, branch, timeStamp, new CDORevisionHandler()
{
public boolean handleRevision(CDORevision revision)
@@ -82,8 +115,16 @@ public class CDOExtentCreator implements OCLExtentCreator
revisionCacheAdder.addRevision(revision);
}
- InternalCDOObject object = (InternalCDOObject)view.getObject(revision.getID());
- extent.add(object.cdoInternalInstance());
+ CDOID id = revision.getID();
+ if (!isDetached(id))
+ {
+ EObject object = getEObject(id);
+ if (object != null)
+ {
+ extent.add(object);
+ }
+ }
+
return !canceled.get();
}
});
@@ -91,6 +132,28 @@ public class CDOExtentCreator implements OCLExtentCreator
return extent;
}
+ protected boolean isDetached(CDOID id)
+ {
+ if (changeSetData == null)
+ {
+ return false;
+ }
+
+ CDOChangeKind changeKind = changeSetData.getChangeKind(id);
+ return changeKind == CDOChangeKind.DETACHED;
+ }
+
+ protected EObject getEObject(CDOID id) throws ObjectNotFoundException
+ {
+ InternalCDOObject object = (InternalCDOObject)view.getObject(id);
+ if (object == null)
+ {
+ throw new ObjectNotFoundException(id);
+ }
+
+ return object.cdoInternalInstance();
+ }
+
/**
* @author Eike Stepper
*/
@@ -151,6 +214,40 @@ public class CDOExtentCreator implements OCLExtentCreator
@Override
public void run()
{
+ handleDirtyState();
+ handlePersistentState();
+
+ synchronized (mutex)
+ {
+ done[0] = true;
+ mutex.notify();
+ }
+
+ if (empty == null)
+ {
+ empty = true;
+ emptyKnown.countDown();
+ }
+ }
+
+ private void handleDirtyState()
+ {
+ CDOChangeSetData changeSetData = getChangeSetData();
+ if (changeSetData != null)
+ {
+ List<CDOIDAndVersion> newObjects = changeSetData.getNewObjects();
+ if (newObjects != null)
+ {
+ for (CDOIDAndVersion key : newObjects)
+ {
+ enqueue(key.getID());
+ }
+ }
+ }
+ }
+
+ private void handlePersistentState()
+ {
accessor.handleRevisions(eClass, branch, timeStamp, new CDORevisionHandler()
{
public boolean handleRevision(CDORevision revision)
@@ -164,27 +261,24 @@ public class CDOExtentCreator implements OCLExtentCreator
revisionCacheAdder.addRevision(revision);
}
- synchronized (mutex)
+ CDOID id = revision.getID();
+ if (!isDetached(id))
{
- ids.addLast(revision.getID());
- mutex.notify();
+ enqueue(id);
}
return !canceled.get();
}
});
+ }
+ private void enqueue(CDOID id)
+ {
synchronized (mutex)
{
- done[0] = true;
+ ids.addLast(id);
mutex.notify();
}
-
- if (empty == null)
- {
- empty = true;
- emptyKnown.countDown();
- }
}
};
@@ -241,8 +335,7 @@ public class CDOExtentCreator implements OCLExtentCreator
try
{
- InternalCDOObject object = (InternalCDOObject)getView().getObject(next);
- return object.cdoInternalInstance();
+ return getEObject(next);
}
finally
{
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java
index b0812468a6..7a2d60abc0 100644
--- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java
+++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java
@@ -25,7 +25,7 @@ import org.eclipse.emf.cdo.server.IQueryContext;
import org.eclipse.emf.cdo.server.IQueryHandler;
import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
-import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetRevisionProvider;
+import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetDataRevisionProvider;
import org.eclipse.emf.cdo.spi.server.QueryHandlerFactory;
import org.eclipse.emf.cdo.view.CDOView;
@@ -90,10 +90,10 @@ public class OCLQueryHandler implements IQueryHandler
CDOBranchPoint branchPoint = CDOBranchUtil.copyBranchPoint(context);
CDORevisionProvider revisionProvider = context.getView();
- CDOChangeSetData changeSet = info.getChangeSet();
- if (changeSet != null)
+ CDOChangeSetData changeSetData = info.getChangeSetData();
+ if (changeSetData != null)
{
- revisionProvider = new CDOChangeSetRevisionProvider(revisionProvider, changeSet);
+ revisionProvider = new CDOChangeSetDataRevisionProvider(revisionProvider, changeSetData);
}
CDOView view = CDOServerUtil.openView(session, branchPoint, info.isLegacyModeEnabled(), revisionProvider);
@@ -102,7 +102,7 @@ public class OCLQueryHandler implements IQueryHandler
EcoreEnvironmentFactory envFactory = new EcoreEnvironmentFactory(packageRegistry);
OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl = OCL.newInstance(envFactory);
- extentMap = createExtentMap(view, context);
+ extentMap = createExtentMap(view, changeSetData, context);
ocl.setExtentMap(extentMap);
OCLHelper<EClassifier, ?, ?, Constraint> helper = ocl.createOCLHelper();
@@ -207,13 +207,19 @@ public class OCLQueryHandler implements IQueryHandler
return query.evaluate(object);
}
- protected CDOExtentMap createExtentMap(CDOView view, IQueryContext context)
+ protected CDOExtentMap createExtentMap(CDOView view, CDOChangeSetData changeSetData, IQueryContext context)
{
- CDOExtentCreator creator = new CDOExtentCreator.Lazy(view);
+ CDOExtentCreator creator = createsLazyExtents() ? new CDOExtentCreator.Lazy(view) : new CDOExtentCreator(view);
+ creator.setChangeSetData(changeSetData);
creator.setRevisionCacheAdder((CDORevisionCacheAdder)context.getView().getRepository().getRevisionManager());
return new CDOExtentMap(creator);
}
+ protected boolean createsLazyExtents()
+ {
+ return false;
+ }
+
protected EClassifier getArbitraryContextClassifier(CDOPackageRegistry packageRegistry)
{
for (CDOPackageUnit packageUnit : packageRegistry.getPackageUnits())
@@ -230,7 +236,7 @@ public class OCLQueryHandler implements IQueryHandler
}
}
- throw new IllegalStateException("Context parameter missing");
+ throw new IllegalStateException("Context missing");
}
protected void initEnvironment(

Back to the top