You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by lr...@apache.org on 2010/05/12 08:21:38 UTC

svn commit: r943389 - in /tuscany/sca-java-2.x/trunk/modules: binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/ common-http/src/main/java/org/apache/tuscany/sca/common/http/

Author: lresende
Date: Wed May 12 06:21:38 2010
New Revision: 943389

URL: http://svn.apache.org/viewvc?rev=943389&view=rev
Log:
Adding generated eTag to RPC style invocations

Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java
    tuscany/sca-java-2.x/trunk/modules/common-http/src/main/java/org/apache/tuscany/sca/common/http/HTTPUtil.java

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java?rev=943389&r1=943388&r2=943389&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java Wed May 12 06:21:38 2010
@@ -23,14 +23,15 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.net.URLDecoder;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.QueryParam;
 
 import org.apache.tuscany.sca.common.http.HTTPContext;
 import org.apache.tuscany.sca.common.http.HTTPUtil;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
-import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
@@ -76,11 +77,16 @@ public class RPCOperationSelectorInterce
         try {
             HTTPContext bindingContext = (HTTPContext)msg.getBindingContext();
 
+            if(! "get".equalsIgnoreCase(bindingContext.getHttpRequest().getMethod())) {
+                throw new RuntimeException("RPC Invocation only allowed over HTTP GET operations");
+            }
+
             String path = URLDecoder.decode(HTTPUtil.getRequestPath(bindingContext.getHttpRequest()), "UTF-8");
 
             if (path.startsWith("/")) {
                 path = path.substring(1);
             }
+            
 
             String operationName = bindingContext.getHttpRequest().getParameter("method");
             Operation operation = findOperation( operationName );
@@ -92,12 +98,6 @@ public class RPCOperationSelectorInterce
             final JavaOperation javaOperation = (JavaOperation)operation;
             final Method method = javaOperation.getJavaMethod();
 
-            List<DataType> operationInputType = operation.getInputType().getLogical();
-            int size = operationInputType.size();
-            for (int i = 0; i < size; i++) {
-                System.out.println(operationInputType.get(i));
-            }
-            
             List<Object> messageParameters = new ArrayList<Object>();
             for(int i=0; i<method.getParameterTypes().length; i++) {
                 for(Annotation annotation : method.getParameterAnnotations()[i]) {
@@ -110,7 +110,6 @@ public class RPCOperationSelectorInterce
                         } else {
                             messageParameters.add(values);
                         }
-                        
                     }
                 }
             }
@@ -121,7 +120,32 @@ public class RPCOperationSelectorInterce
             msg.setBody(body);
             msg.setOperation(operation);
 
-            return getNext().invoke(msg);
+            Message responseMessage = getNext().invoke(msg);
+            
+            //set Cache-Control to no-cache to avoid intermediary
+            //proxy/reverse-proxy caches and always hit the server
+            //that would identify if the value was current or not
+            bindingContext.getHttpResponse().setHeader("Cache-Control", "no-cache");
+            bindingContext.getHttpResponse().setHeader("Expires", new Date(0).toGMTString());
+            
+            
+            String eTag = HTTPUtil.calculateHashETag(responseMessage.getBody().toString().getBytes("UTF-8"));
+            
+            // Test request for predicates.
+            String predicate = bindingContext.getHttpRequest().getHeader( "If-Match" );
+            if (( predicate != null ) && ( !predicate.equals(eTag) )) {
+                // No match, should short circuit
+                bindingContext.getHttpResponse().sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
+            }
+            predicate = bindingContext.getHttpRequest().getHeader( "If-None-Match" );
+            if (( predicate != null ) && ( predicate.equals(eTag) )) {
+                // Match, should short circuit
+                bindingContext.getHttpResponse().sendError(HttpServletResponse.SC_NOT_MODIFIED);
+            }
+            
+            bindingContext.getHttpResponse().addHeader("ETag", eTag);
+            
+            return responseMessage;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }

Modified: tuscany/sca-java-2.x/trunk/modules/common-http/src/main/java/org/apache/tuscany/sca/common/http/HTTPUtil.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/common-http/src/main/java/org/apache/tuscany/sca/common/http/HTTPUtil.java?rev=943389&r1=943388&r2=943389&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/common-http/src/main/java/org/apache/tuscany/sca/common/http/HTTPUtil.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/common-http/src/main/java/org/apache/tuscany/sca/common/http/HTTPUtil.java Wed May 12 06:21:38 2010
@@ -19,6 +19,9 @@
 
 package org.apache.tuscany.sca.common.http;
 
+import java.math.BigInteger;
+import java.security.MessageDigest;
+
 import javax.servlet.http.HttpServletRequest;
 
 /**
@@ -71,4 +74,20 @@ public class HTTPUtil {
         
         return contextRoot;
     }
+    
+    public static String calculateHashETag(byte[] content) {
+            String eTag = "invalid";
+            try {
+                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+                byte[] digest = messageDigest.digest(content);
+                BigInteger number = new BigInteger(1, digest);
+                StringBuffer sb = new StringBuffer('0');
+                sb.append(number.toString(16));
+                eTag = sb.toString();
+            } catch(Exception e) {
+                //ignore, we will return random etag
+                eTag =  Integer.toString((new java.util.Random()).nextInt(Integer.MAX_VALUE));
+            }
+            return eTag;
+    }
 }