Author: olamy
Date: Mon Feb 20 16:54:09 2012
New Revision: 1291369

URL: http://svn.apache.org/viewvc?rev=1291369&view=rev
Log:
[DIRECTMEMORY-61] refactor to be able to handle more Content-Type easily.

Added:
    
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
   (with props)
    
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
   (with props)
Modified:
    incubator/directmemory/trunk/pom.xml
    
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheParser.java
    
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java
    
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java

Modified: incubator/directmemory/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/pom.xml?rev=1291369&r1=1291368&r2=1291369&view=diff
==============================================================================
--- incubator/directmemory/trunk/pom.xml (original)
+++ incubator/directmemory/trunk/pom.xml Mon Feb 20 16:54:09 2012
@@ -236,8 +236,8 @@ under the License.
     <aspectj.bundle.version>1.6.8_2</aspectj.bundle.version>
     <aspectj.version>1.6.11</aspectj.version>
     <doclava.version>1.0.3</doclava.version>
-    <guava.bundle.version>11_1</guava.bundle.version>
-    <guava.version>11.0.1</guava.version>
+    <guava.bundle.version>09_1</guava.bundle.version>
+    <guava.version>r09</guava.version>
     <h2.version>1.3.158</h2.version>
     <karaf.version>2.2.4</karaf.version>
     <junit.version>4.10</junit.version>

Modified: 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheParser.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheParser.java?rev=1291369&r1=1291368&r2=1291369&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheParser.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheParser.java
 Mon Feb 20 16:54:09 2012
@@ -23,7 +23,6 @@ import org.codehaus.jackson.JsonParseExc
 import org.codehaus.jackson.JsonParser;
 import org.codehaus.jackson.JsonToken;
 
-import javax.xml.stream.XMLInputFactory;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -32,7 +31,6 @@ import java.io.InputStream;
  */
 public class DirectMemoryCacheParser
 {
-    private XMLInputFactory xmlInputFactory;
 
     private JsonFactory jsonFactory;
 
@@ -41,9 +39,6 @@ public class DirectMemoryCacheParser
 
     private DirectMemoryCacheParser()
     {
-        this.xmlInputFactory = XMLInputFactory.newInstance();
-        this.xmlInputFactory.setProperty( XMLInputFactory.IS_NAMESPACE_AWARE, 
Boolean.FALSE );
-
         this.jsonFactory = new JsonFactory();
     }
 
@@ -105,13 +100,6 @@ public class DirectMemoryCacheParser
             JsonParser jp = this.jsonFactory.createJsonParser( inputStream );
             DirectMemoryCacheResponse rs = new DirectMemoryCacheResponse();
 
-            /* <DirectMemoryRS version="1.0" found="" updated="true" key="">
-            *   <cacheContent>
-            *     <![CDATA[
-            *     ]]>
-            *   </cacheContent>
-            * </DirectMemoryRS>*/
-
             while ( jp.nextToken() != JsonToken.END_OBJECT )
             {
                 String fieldName = jp.getCurrentName();

Modified: 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java?rev=1291369&r1=1291368&r2=1291369&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java
 Mon Feb 20 16:54:09 2012
@@ -24,9 +24,6 @@ import org.codehaus.jackson.JsonGenerato
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
 import java.io.IOException;
 import java.io.StringWriter;
 
@@ -35,8 +32,6 @@ import java.io.StringWriter;
  */
 public class DirectMemoryCacheWriter
 {
-    private XMLOutputFactory xmlOutputFactory;
-
     private JsonFactory jsonFactory;
 
     private static final DirectMemoryCacheWriter INSTANCE = new 
DirectMemoryCacheWriter();
@@ -50,9 +45,6 @@ public class DirectMemoryCacheWriter
 
     private DirectMemoryCacheWriter()
     {
-        this.xmlOutputFactory = XMLOutputFactory.newInstance();
-        this.xmlOutputFactory.setProperty( 
XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.FALSE );
-
         this.jsonFactory = new JsonFactory();
     }
 

Added: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java?rev=1291369&view=auto
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
 (added)
+++ 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
 Mon Feb 20 16:54:09 2012
@@ -0,0 +1,38 @@
+package org.apache.directmemory.server.services;
+/*
+ * 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
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+import org.apache.directmemory.server.commons.DirectMemoryCacheException;
+import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @author Olivier Lamy
+ */
+public interface CacheContentTypeHandler
+{
+    byte[] handleGet( DirectMemoryCacheRequest request, byte[] 
cacheResponseContent, HttpServletResponse response )
+        throws DirectMemoryCacheException, IOException;
+
+    DirectMemoryCacheRequest handlePut( HttpServletRequest request, 
HttpServletResponse response )
+        throws DirectMemoryCacheException, IOException;
+}

Propchange: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheContentTypeHandler.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java?rev=1291369&r1=1291368&r2=1291369&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java
 Mon Feb 20 16:54:09 2012
@@ -22,10 +22,7 @@ import org.apache.commons.lang.StringUti
 import org.apache.directmemory.cache.CacheService;
 import org.apache.directmemory.cache.CacheServiceImpl;
 import org.apache.directmemory.server.commons.DirectMemoryCacheException;
-import org.apache.directmemory.server.commons.DirectMemoryCacheParser;
 import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
-import org.apache.directmemory.server.commons.DirectMemoryCacheResponse;
-import org.apache.directmemory.server.commons.DirectMemoryCacheWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +33,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.MediaType;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * TODO add some listener plugin mechanism to store figures/statistics on 
cache access
@@ -48,11 +47,12 @@ public class CacheServlet
 
     private Logger log = LoggerFactory.getLogger( getClass() );
 
+    public static final String JAVA_SERIALIZED_OBJECT_CONTENT_TYPE_HEADER = 
"application/x-java-serialized-object";
+
     private CacheService cacheService = new CacheServiceImpl();
 
-    private DirectMemoryCacheParser parser = 
DirectMemoryCacheParser.instance();
+    private Map<String, CacheContentTypeHandler> contentTypeHandlers;
 
-    private DirectMemoryCacheWriter writer = 
DirectMemoryCacheWriter.instance();
 
     @Override
     public void init( ServletConfig config )
@@ -68,6 +68,11 @@ public class CacheServlet
         int concurrencyLevel =
             Integer.getInteger( "directMemory.concurrencyLevel", 
CacheService.DEFAULT_CONCURRENCY_LEVEL );
         cacheService.init( numberOfBuffers, size, initialCapacity, 
concurrencyLevel );
+
+        //
+
+        contentTypeHandlers = new HashMap<String, CacheContentTypeHandler>( 1 
);
+        contentTypeHandlers.put( MediaType.APPLICATION_JSON, new 
JsonCacheContentTypeHandler() );
     }
 
     @Override
@@ -94,34 +99,52 @@ public class CacheServlet
         String servletPath = req.getServletPath();
         String key = retrieveKeyFromPath( path );
 
-        String contentType = req.getContentType();
+        DirectMemoryCacheRequest cacheRequest = null;
 
-        if ( StringUtils.startsWith( contentType, MediaType.APPLICATION_JSON ) 
)
+        CacheContentTypeHandler contentTypeHandler = 
findPutCacheContentTypeHandler( req, resp );
+
+        if ( contentTypeHandler == null )
         {
-            //         application/json
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+                            "Content-Type '" + req.getContentType() + "' not 
supported" );
+        }
 
-            try
-            {
-                DirectMemoryCacheRequest cacheRequest = parser.buildRequest( 
req.getInputStream() );
-
-                //exists ?
-                if ( cacheService.retrieveByteArray( key ) == null )
-                {
-                    cacheService.putByteArray( key, 
cacheRequest.getCacheContent(), cacheRequest.getExpiresIn() );
-                }
-                else
-                {
-                    cacheService.updateByteArray( key, 
cacheRequest.getCacheContent() );
-                }
-            }
-            catch ( DirectMemoryCacheException e )
-            {
-                resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
e.getMessage() );
-            }
+        //     application/json
+        contentTypeHandlers.get( MediaType.APPLICATION_JSON );
+        try
+        {
+            cacheRequest = contentTypeHandler.handlePut( req, resp );
+        }
+        catch ( DirectMemoryCacheException e )
+        {
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
e.getMessage() );
             return;
         }
-        resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                        "Content-Type '" + contentType + "' not supported" );
+
+        //exists ?
+        if ( cacheService.retrieveByteArray( key ) == null )
+        {
+            cacheService.putByteArray( key, cacheRequest.getCacheContent(), 
cacheRequest.getExpiresIn() );
+        }
+        else
+        {
+            cacheService.updateByteArray( key, cacheRequest.getCacheContent() 
);
+        }
+
+
+    }
+
+    protected CacheContentTypeHandler findPutCacheContentTypeHandler( 
HttpServletRequest req,
+                                                                      
HttpServletResponse response )
+    {
+
+        String contentType = req.getContentType();
+        if ( StringUtils.startsWith( contentType, MediaType.APPLICATION_JSON ) 
)
+        {
+            //         application/json
+            return contentTypeHandlers.get( MediaType.APPLICATION_JSON );
+        }
+        return null;
     }
 
     @Override
@@ -162,26 +185,47 @@ public class CacheServlet
 
         String acceptContentType = req.getHeader( "Accept" );
 
-        if ( StringUtils.contains( acceptContentType, 
MediaType.APPLICATION_JSON ) )
+        if ( StringUtils.isEmpty( acceptContentType ) )
         {
-            DirectMemoryCacheResponse response = new 
DirectMemoryCacheResponse().setKey( key ).setCacheContent( bytes );
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+                            "you must specify Accept with Content-Type you 
want in the response" );
+            return;
+        }
 
-            try
-            {
-                // TODO directly write in output stream
-                String json = writer.generateJsonResponse( response );
-                resp.getWriter().write( json );
-                resp.setContentType( MediaType.APPLICATION_JSON );
-            }
-            catch ( DirectMemoryCacheException e )
-            {
-                resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
e.getMessage() );
-            }
+        CacheContentTypeHandler contentTypeHandler = 
findGetCacheContentTypeHandler( req, resp );
+
+        if ( contentTypeHandler == null )
+        {
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+                            "Content-Type: " + acceptContentType + " not 
supported" );
             return;
         }
 
-        resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                        "you must specify Accept with Content-Type you want in 
the response" );
+        try
+        {
+            byte[] respBytes =
+                contentTypeHandler.handleGet( new 
DirectMemoryCacheRequest().setKey( key ), bytes, resp );
+            resp.getOutputStream().write( respBytes );
+        }
+        catch ( DirectMemoryCacheException e )
+        {
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
e.getMessage() );
+        }
+
+
+    }
+
+    protected CacheContentTypeHandler findGetCacheContentTypeHandler( 
HttpServletRequest req,
+                                                                      
HttpServletResponse response )
+    {
+
+        String acceptContentType = req.getHeader( "Accept" );
+        if ( StringUtils.contains( acceptContentType, 
MediaType.APPLICATION_JSON ) )
+        {
+            //         application/json
+            return contentTypeHandlers.get( MediaType.APPLICATION_JSON );
+        }
+        return null;
     }
 
     /**
@@ -190,6 +234,7 @@ public class CacheServlet
      * @param path
      * @return
      */
+
     protected String retrieveKeyFromPath( String path )
     {
         if ( StringUtils.endsWith( path, "/" ) )

Added: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java?rev=1291369&view=auto
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
 (added)
+++ 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
 Mon Feb 20 16:54:09 2012
@@ -0,0 +1,64 @@
+package org.apache.directmemory.server.services;
+/*
+ * 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
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+import org.apache.directmemory.server.commons.DirectMemoryCacheException;
+import org.apache.directmemory.server.commons.DirectMemoryCacheParser;
+import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
+import org.apache.directmemory.server.commons.DirectMemoryCacheResponse;
+import org.apache.directmemory.server.commons.DirectMemoryCacheWriter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+
+/**
+ * @author Olivier Lamy
+ */
+public class JsonCacheContentTypeHandler
+    implements CacheContentTypeHandler
+{
+
+    private DirectMemoryCacheParser parser = 
DirectMemoryCacheParser.instance();
+
+    private DirectMemoryCacheWriter writer = 
DirectMemoryCacheWriter.instance();
+
+    @Override
+    public byte[] handleGet( DirectMemoryCacheRequest request, byte[] 
cacheResponseContent, HttpServletResponse resp )
+        throws DirectMemoryCacheException, IOException
+    {
+        DirectMemoryCacheResponse response =
+            new DirectMemoryCacheResponse().setKey( request.getKey() 
).setCacheContent( cacheResponseContent );
+        String json = writer.generateJsonResponse( response );
+        resp.setContentType( MediaType.APPLICATION_JSON );
+        return json.getBytes();
+    }
+
+    @Override
+    public DirectMemoryCacheRequest handlePut( HttpServletRequest req, 
HttpServletResponse resp )
+        throws DirectMemoryCacheException, IOException
+    {
+        //     application/json
+
+        DirectMemoryCacheRequest cacheRequest = parser.buildRequest( 
req.getInputStream() );
+        return cacheRequest;
+
+    }
+}

Propchange: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/JsonCacheContentTypeHandler.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision


Reply via email to