Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java28
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java7
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java10
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java13
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java7
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java13
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java93
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java3
11 files changed, 153 insertions, 32 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF
index 626669fce5..b67743a9ea 100644
--- a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.emf.cdo.server.ocl;singleton:=true
Bundle-Name: %pluginName
-Bundle-Version: 4.3.0.qualifier
+Bundle-Version: 4.3.1.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -10,5 +10,5 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
org.eclipse.ocl.ecore;bundle-version="[3.0.0,4.0.0)",
org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)"
-Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.3.0"
+Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.3.1"
Automatic-Module-Name: org.eclipse.emf.cdo.server.ocl
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml b/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml
index 1d62ef916a..a3ba1a4632 100644
--- a/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml
+++ b/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml
@@ -25,7 +25,7 @@
<groupId>org.eclipse.emf.cdo</groupId>
<artifactId>org.eclipse.emf.cdo.server.ocl</artifactId>
- <version>4.3.0-SNAPSHOT</version>
+ <version>4.3.1-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
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 abd3bf69fa..d7e445cb32 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
@@ -19,12 +19,16 @@ import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionCacheAdder;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
+import org.eclipse.emf.cdo.server.CDOServerUtil;
+import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.StoreThreadLocal;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.util.ObjectNotFoundException;
import org.eclipse.emf.cdo.view.CDOView;
+import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
+
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
@@ -37,6 +41,7 @@ import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -211,17 +216,16 @@ public class CDOExtentCreator implements OCLExtentCreator
}
@Override
- protected Set<EObject> createExtent(final EClass eClass, final IStoreAccessor accessor, final CDOBranch branch, final long timeStamp,
- final AtomicBoolean canceled)
+ protected Set<EObject> createExtent(EClass eClass, IStoreAccessor accessor, CDOBranch branch, long timeStamp, AtomicBoolean canceled)
{
return new Set<EObject>()
{
+ private final CountDownLatch emptyKnown = new CountDownLatch(1);
+
private Iterator<EObject> emptyIterator;
private Boolean empty;
- private CountDownLatch emptyKnown = new CountDownLatch(1);
-
@Override
public synchronized boolean isEmpty()
{
@@ -253,11 +257,11 @@ public class CDOExtentCreator implements OCLExtentCreator
return it;
}
- final Object mutex = new Object();
- final LinkedList<CDOID> ids = new LinkedList<>();
- final boolean[] done = { false };
+ Object mutex = new Object();
+ LinkedList<CDOID> ids = new LinkedList<>();
+ boolean[] done = { false };
- Thread thread = new Thread("OCLExtentIterator")
+ class OCLExtentIterator implements Runnable
{
@Override
public void run()
@@ -331,10 +335,12 @@ public class CDOExtentCreator implements OCLExtentCreator
mutex.notify();
}
}
- };
+ }
+
+ ISession serverSession = CDOServerUtil.getServerSession(getView());
- thread.setDaemon(true);
- thread.start();
+ ExecutorService threadPool = ConcurrencyUtil.getExecutorService(getView());
+ threadPool.submit(StoreThreadLocal.wrap(serverSession, new OCLExtentIterator()));
return new Iterator<EObject>()
{
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 4cdf8cca0c..5943b22d4f 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
@@ -23,6 +23,7 @@ import org.eclipse.emf.cdo.common.util.CDOQueryInfo;
import org.eclipse.emf.cdo.server.CDOServerUtil;
import org.eclipse.emf.cdo.server.IQueryContext;
import org.eclipse.emf.cdo.server.IQueryHandler;
+import org.eclipse.emf.cdo.server.IView;
import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetDataRevisionProvider;
import org.eclipse.emf.cdo.spi.server.QueryHandlerFactory;
import org.eclipse.emf.cdo.view.CDOView;
@@ -115,14 +116,16 @@ public class OCLQueryHandler implements IQueryHandler
{
readParameters(info.getParameters());
- CDORevisionProvider revisionProvider = context.getView();
+ IView serverView = context.getView();
+
+ CDORevisionProvider revisionProvider = serverView;
CDOChangeSetData changeSetData = info.getChangeSetData();
if (changeSetData != null)
{
revisionProvider = new CDOChangeSetDataRevisionProvider(revisionProvider, changeSetData);
}
- CDOView view = CDOServerUtil.openView(context.getView().getSession(), context, revisionProvider);
+ CDOView view = CDOServerUtil.openView(serverView.getSession(), context, revisionProvider);
extentMap = createExtentMap(view, changeSetData, context);
OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl = createOCL(view, extentMap);
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java
index edc5021e64..3bbe547a71 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java
@@ -193,12 +193,15 @@ public class CommitManager extends Lifecycle implements InternalCommitManager
{
try
{
+ StoreThreadLocal.setAccessor(context.getAccessor());
StoreThreadLocal.setCommitContext(context);
+
context.write(monitor);
}
finally
{
- StoreThreadLocal.setCommitContext(null);
+ StoreThreadLocal.remove();
+
if (in instanceof Closeable)
{
IOUtil.closeSilent((Closeable)in);
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java
index a6ae723003..209e9979cf 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java
@@ -178,7 +178,11 @@ public class QueryManager extends Lifecycle implements InternalQueryManager
{
register(queryContext);
- Future<?> future = getExecutors().submit(queryContext);
+ InternalSession session = queryContext.getView().getSession();
+
+ ExecutorService executors = getExecutors();
+ Future<?> future = executors.submit(StoreThreadLocal.wrap(session, queryContext));
+
queryContext.setFuture(future);
return future;
}
@@ -309,9 +313,6 @@ public class QueryManager extends Lifecycle implements InternalQueryManager
{
CDOQueryQueue<Object> queue = queryResult.getQueue();
- InternalSession session = queryResult.getView().getSession();
- StoreThreadLocal.setSession(session);
-
try
{
started = true;
@@ -338,7 +339,6 @@ public class QueryManager extends Lifecycle implements InternalQueryManager
{
queue.close();
unregister(this);
- StoreThreadLocal.release();
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
index 801dc41191..ee4bbea76c 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
@@ -32,6 +32,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
import org.eclipse.emf.cdo.common.revision.CDORevisionProvider;
import org.eclipse.emf.cdo.common.security.CDOPermission;
import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl;
+import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.session.CDOCollectionLoadingPolicy;
import org.eclipse.emf.cdo.session.CDORepositoryInfo;
@@ -106,7 +107,7 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd
private static final CDORevisionPrefetchingPolicy REVISION_PREFETCHING = CDOUtil.createRevisionPrefetchingPolicy(NO_REVISION_PREFETCHING);
- private InternalCDOSession session;
+ private ServerCDOSession session;
private CDORevisionProvider revisionProvider;
@@ -137,6 +138,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd
return session;
}
+ public ISession getServerSession()
+ {
+ return session.getInternalSession();
+ }
+
@Override
public ExecutorService getExecutorService()
{
@@ -628,6 +634,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd
return this;
}
+ public InternalSession getInternalSession()
+ {
+ return internalSession;
+ }
+
@Override
public String getUserID()
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
index ec6ffbe5ef..64fbde9240 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
@@ -44,6 +44,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.ExecutorService;
/**
* @author Eike Stepper
@@ -96,6 +97,12 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio
}
@Override
+ public ExecutorService getExecutorService()
+ {
+ return session.getExecutorService();
+ }
+
+ @Override
public InternalSession getSession()
{
return session;
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java
index 55791c35f3..0097fb93e6 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java
@@ -183,6 +183,19 @@ public final class CDOServerUtil
}
/**
+ * @since 4.11
+ */
+ public static ISession getServerSession(CDOView view)
+ {
+ if (view instanceof ServerCDOView)
+ {
+ return ((ServerCDOView)view).getServerSession();
+ }
+
+ return null;
+ }
+
+ /**
* @since 3.0
*/
public static ISessionManager createSessionManager()
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java
index 878af30e62..0d5e12a667 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java
@@ -13,7 +13,11 @@ package org.eclipse.emf.cdo.server;
import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext;
import org.eclipse.emf.cdo.spi.server.InternalSession;
+import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
+import org.eclipse.net4j.util.om.OMPlatform;
+
+import java.util.concurrent.Callable;
/**
* Provides server-side consumers with the {@link IStoreAccessor store accessor} that is valid in the context of a
@@ -25,28 +29,68 @@ import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
*/
public final class StoreThreadLocal
{
- private static final ThreadLocal<InternalSession> SESSION = new InheritableThreadLocal<>();
+ private static final boolean DEBUG_SESSION = OMPlatform.INSTANCE.isProperty("org.eclipse.emf.cdo.server.StoreThreadLocal.DEBUG_SESSION");
+
+ private static final ThreadLocal<InternalSession> SESSION = new ThreadLocal<>();
- private static final ThreadLocal<IStoreAccessor> ACCESSOR = new InheritableThreadLocal<>();
+ private static final ThreadLocal<IStoreAccessor> ACCESSOR = new ThreadLocal<>();
- private static final ThreadLocal<IStoreAccessor.CommitContext> COMMIT_CONTEXT = new InheritableThreadLocal<>();
+ private static final ThreadLocal<IStoreAccessor.CommitContext> COMMIT_CONTEXT = new ThreadLocal<>();
private StoreThreadLocal()
{
}
/**
+ * @since 4.11
+ */
+ public static Runnable wrap(ISession session, Runnable runnable)
+ {
+ return () -> {
+ StoreThreadLocal.setSession((InternalSession)session);
+
+ try
+ {
+ runnable.run();
+ }
+ finally
+ {
+ StoreThreadLocal.release();
+ }
+ };
+ }
+
+ /**
+ * @since 4.11
+ */
+ public static <T> Callable<T> wrap(ISession session, Callable<T> callable)
+ {
+ return () -> {
+ StoreThreadLocal.setSession((InternalSession)session);
+
+ try
+ {
+ return callable.call();
+ }
+ finally
+ {
+ StoreThreadLocal.release();
+ }
+ };
+ }
+
+ /**
* @since 3.0
*/
public static void setSession(InternalSession session)
{
if (session == null)
{
- SESSION.remove();
+ REMOVE_SESSION();
}
else
{
- SESSION.set(session);
+ SET_SESSION(session);
}
ACCESSOR.remove();
@@ -85,12 +129,12 @@ public final class StoreThreadLocal
if (accessor == null)
{
ACCESSOR.remove();
- SESSION.remove();
+ REMOVE_SESSION();
}
else
{
ACCESSOR.set(accessor);
- SESSION.set(accessor.getSession());
+ SET_SESSION(accessor.getSession());
}
}
@@ -169,10 +213,43 @@ public final class StoreThreadLocal
public static void remove()
{
ACCESSOR.remove();
- SESSION.remove();
+ REMOVE_SESSION();
COMMIT_CONTEXT.remove();
}
+ private static void SET_SESSION(InternalSession session)
+ {
+ if (session != null)
+ {
+ if (DEBUG_SESSION)
+ {
+ InternalSession oldSession = SESSION.get();
+ if (oldSession != null)
+ {
+ throw new IllegalStateException("Session already registered: " + oldSession);
+ }
+
+ IOUtil.OUT().println("Set " + session + " --> " + Thread.currentThread().getName());
+ }
+
+ SESSION.set(session);
+ }
+ }
+
+ private static void REMOVE_SESSION()
+ {
+ if (DEBUG_SESSION)
+ {
+ InternalSession session = SESSION.get();
+ if (session != null)
+ {
+ IOUtil.OUT().println(" Remove " + session + " --> " + Thread.currentThread().getName());
+ }
+ }
+
+ SESSION.remove();
+ }
+
/**
* An {@link IllegalStateException} that can be thrown from {@link StoreThreadLocal#getSession()}.
*
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
index 6d44f04509..80459c638e 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
@@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.server.IView;
+import org.eclipse.net4j.util.concurrent.IExecutorServiceProvider;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
@@ -30,7 +31,7 @@ import java.util.List;
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
-public interface InternalView extends IView, ILifecycle
+public interface InternalView extends IView, ILifecycle, IExecutorServiceProvider
{
@Override
public InternalSession getSession();

Back to the top