Author: lresende
Date: Tue Mar 30 05:18:25 2010
New Revision: 928990

URL: http://svn.apache.org/viewvc?rev=928990&view=rev
Log:
TUSCANY-3516 - Adding eTag support when using json-rpc binding with GET method

Modified:
    
tuscany/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java

Modified: 
tuscany/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java?rev=928990&r1=928989&r2=928990&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java
 Tue Mar 30 05:18:25 2010
@@ -24,8 +24,9 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
 import java.net.URLDecoder;
-import java.util.Calendar;
+import java.security.MessageDigest;
 import java.util.Date;
 import java.util.List;
 
@@ -153,7 +154,6 @@ public class JSONRPCServiceServlet exten
             while ((ret = in.read(buf, 0, 4096)) != -1) {
                 data.write(buf, 0, ret);
             }
-            
         }
         
         JSONObject jsonReq = null;
@@ -196,6 +196,27 @@ public class JSONRPCServiceServlet exten
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Expires", new Date(0).toGMTString());
         
+        //handle etag if using GET
+        if( request.getMethod().equals("GET")) {
+            String eTag = calculateETag(bout);
+            
+            // Test request for predicates.
+            String predicate = request.getHeader( "If-Match" );
+            if (( predicate != null ) && ( !predicate.equals(eTag) )) {
+                // No match, should short circuit
+                response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
+                return;
+            }
+            predicate = request.getHeader( "If-None-Match" );
+            if (( predicate != null ) && ( predicate.equals(eTag) )) {
+                // Match, should short circuit
+                response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
+                return;
+            }
+            
+            response.addHeader("ETag", eTag);
+        }
+        
         OutputStream out = response.getOutputStream();
         out.write(bout);
         out.flush();
@@ -342,5 +363,21 @@ public class JSONRPCServiceServlet exten
         }
 
         return result;
-    }    
+    } 
+    
+    private String calculateETag(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;
+    }
 }


Reply via email to