You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/06/08 14:59:43 UTC
cayenne git commit: CAY-2090 Untangle HttpRemoteService from
ServiceContext thread local setup
Repository: cayenne
Updated Branches:
refs/heads/master f5ae597e9 -> 85852f92e
CAY-2090 Untangle HttpRemoteService from ServiceContext thread local setup
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/85852f92
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/85852f92
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/85852f92
Branch: refs/heads/master
Commit: 85852f92ee05f5e1ae70dae7315beda32f2b4077
Parents: f5ae597
Author: Savva Kolbachev <s....@gmail.com>
Authored: Wed Jun 8 17:58:42 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Wed Jun 8 17:58:42 2016 +0300
----------------------------------------------------------------------
.../apache/cayenne/rop/ROPRequestContext.java | 107 +++++++++++++++++++
.../java/org/apache/cayenne/rop/ROPServlet.java | 6 +-
.../cayenne/rop/ServerHttpRemoteService.java | 3 +-
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
4 files changed, 112 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/85852f92/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPRequestContext.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPRequestContext.java b/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPRequestContext.java
new file mode 100644
index 0000000..126b5d2
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPRequestContext.java
@@ -0,0 +1,107 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.rop;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class ROPRequestContext {
+
+ private static final ThreadLocal<ROPRequestContext> localContext = new ThreadLocal<>();
+
+ private String serviceId;
+ private String objectId;
+ private ServletRequest request;
+ private ServletResponse response;
+ private int count;
+
+ private ROPRequestContext() {
+ }
+
+ public static void start(String serviceId, String objectId, ServletRequest request, ServletResponse response) {
+ ROPRequestContext context = localContext.get();
+
+ if (context == null) {
+ context = new ROPRequestContext();
+ localContext.set(context);
+ }
+
+ context.serviceId = serviceId;
+ context.objectId = objectId;
+ context.request = request;
+ context.response = response;
+ context.count++;
+ }
+
+ public static ROPRequestContext getROPRequestContext() {
+ return localContext.get();
+ }
+
+ public static String getContextServiceId() {
+ ROPRequestContext context = localContext.get();
+
+ if (context != null) {
+ return context.serviceId;
+ } else {
+ return null;
+ }
+ }
+
+ public static String getContextObjectId() {
+ ROPRequestContext context = localContext.get();
+
+ if (context != null) {
+ return context.objectId;
+ } else {
+ return null;
+ }
+ }
+
+ public static ServletRequest getContextRequest() {
+ ROPRequestContext context = localContext.get();
+
+ if (context != null) {
+ return context.request;
+ } else {
+ return null;
+ }
+ }
+
+ public static ServletResponse getContextResponse() {
+ ROPRequestContext context = localContext.get();
+
+ if (context != null) {
+ return context.response;
+ } else {
+ return null;
+ }
+ }
+
+ public static void end() {
+ ROPRequestContext context = localContext.get();
+
+ if (context != null && --context.count == 0) {
+ context.request = null;
+ context.response = null;
+
+ localContext.set(null);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/85852f92/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java b/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java
index 8c12baf..db1bb0a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java
@@ -18,7 +18,6 @@
****************************************************************/
package org.apache.cayenne.rop;
-import com.caucho.services.server.ServiceContext;
import org.apache.cayenne.configuration.CayenneRuntime;
import org.apache.cayenne.configuration.rop.server.ROPServerModule;
import org.apache.cayenne.configuration.server.ServerRuntime;
@@ -98,8 +97,7 @@ public class ROPServlet extends HttpServlet {
objectId = req.getParameter("ejbid");
}
- // TODO: need to untangle HttpRemoteService from dependence on Hessian's ServiceContext thread local setup
- ServiceContext.begin(req, resp, serviceId, objectId);
+ ROPRequestContext.start(serviceId, objectId, req, resp);
String operation = req.getParameter(ROPConstants.OPERATION_PARAMETER);
@@ -128,6 +126,8 @@ public class ROPServlet extends HttpServlet {
throw e;
} catch (Throwable e) {
throw new ServletException(e);
+ } finally {
+ ROPRequestContext.end();
}
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/85852f92/cayenne-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java b/cayenne-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java
index 22aba9f..9099b04 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java
@@ -18,7 +18,6 @@
****************************************************************/
package org.apache.cayenne.rop;
-import com.caucho.services.server.ServiceContext;
import org.apache.cayenne.configuration.Constants;
import org.apache.cayenne.configuration.ObjectContextFactory;
import org.apache.cayenne.di.Inject;
@@ -37,7 +36,7 @@ public class ServerHttpRemoteService extends HttpRemoteService {
@Override
protected HttpSession getSession(boolean create) {
- HttpServletRequest request = (HttpServletRequest) ServiceContext.getContextRequest();
+ HttpServletRequest request = (HttpServletRequest) ROPRequestContext.getContextRequest();
if (request == null) {
throw new IllegalStateException(
"Attempt to access HttpSession outside the request scope.");
http://git-wip-us.apache.org/repos/asf/cayenne/blob/85852f92/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 0c9ae04..6cf687e 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -22,6 +22,7 @@ CAY-2065 Pluggable serialization and connectivity layers for ROP
CAY-2073 Ordering.orderedList methods
CAY-2074 Support for catalogs in stored procedures
CAY-2083 Implement Protostuff as serialization service for Cayenne ROP
+CAY-2090 Untangle HttpRemoteService from ServiceContext thread local setup
Bug Fixes: