diff options
author | Eike Stepper | 2010-10-09 17:32:01 +0000 |
---|---|---|
committer | Eike Stepper | 2010-10-09 17:32:01 +0000 |
commit | daed4e7bf5eb819d247df5a8b13424f393850139 (patch) | |
tree | 06659e9ffd18648d33cbffbf37631307838973bf /plugins/org.eclipse.emf.cdo.server.ocl | |
parent | 72865d3be24ec8c65230fb0eb99e399cda91019b (diff) | |
download | cdo-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')
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( |