Author: olamy
Date: Wed Feb 22 22:06:39 2012
New Revision: 1292536

URL: http://svn.apache.org/viewvc?rev=1292536&view=rev
Log:
[DIRECTMEMORY-61] implements exchange with content-type 
application/x-java-serialized-object

Modified:
    incubator/directmemory/trunk/server/directmemory-server-client/pom.xml
    
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/AbstractDirectMemoryHttpClient.java
    
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/DefaultDirectMemoryServerClient.java
    
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/HttpClientDirectMemoryHttpClient.java
    
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ExchangeType.java
    incubator/directmemory/trunk/server/directmemory-server/pom.xml
    
incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java
    
incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java
    incubator/directmemory/trunk/server/pom.xml

Modified: incubator/directmemory/trunk/server/directmemory-server-client/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-client/pom.xml?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server-client/pom.xml 
(original)
+++ incubator/directmemory/trunk/server/directmemory-server-client/pom.xml Wed 
Feb 22 22:06:39 2012
@@ -43,6 +43,10 @@
       <artifactId>directmemory-server-commons</artifactId>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>${httpclient.version}</version>

Modified: 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/AbstractDirectMemoryHttpClient.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/AbstractDirectMemoryHttpClient.java?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/AbstractDirectMemoryHttpClient.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/AbstractDirectMemoryHttpClient.java
 Wed Feb 22 22:06:39 2012
@@ -18,12 +18,18 @@ package org.apache.directmemory.server.c
  * under the License.
  */
 
+import org.apache.commons.io.IOUtils;
 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.apache.directmemory.server.commons.ExchangeType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 /**
@@ -33,6 +39,8 @@ public abstract class AbstractDirectMemo
     implements DirectMemoryHttpClient
 {
 
+    protected Logger log = LoggerFactory.getLogger( getClass() );
+
     private DirectMemoryCacheWriter writer = 
DirectMemoryCacheWriter.instance();
 
     private DirectMemoryCacheParser parser = 
DirectMemoryCacheParser.instance();
@@ -49,17 +57,80 @@ public abstract class AbstractDirectMemo
     {
         // TODO handle various exchange model json raw etc..
 
-        if ( request.getSerializer() == null )
+        if ( request.getExchangeType() == ExchangeType.JSON )
+        {
+            return writer.generateJsonRequest( request ).getBytes();
+        }
+        else if ( request.getExchangeType() == 
ExchangeType.JAVA_SERIALIZED_OBJECT )
+        {
+            try
+            {
+                return request.getSerializer().serialize( request.getObject() 
);
+            }
+            catch ( IOException e )
+            {
+                throw new DirectMemoryCacheException( e.getMessage(), e );
+            }
+        }
+        else if ( request.getExchangeType() == ExchangeType.TEXT_PLAIN )
         {
-            request.setSerializer( this.configuration.getSerializer() );
+            log.error( "{} not implemented yet", 
ExchangeType.TEXT_PLAIN.getContentType() );
+            throw new NotImplementedException();//  );
+        }
+        else
+        {
+            log.error( "exchange type unknown {}", request.getExchangeType() );
+            throw new DirectMemoryCacheException( "exchange type unknown " + 
request.getExchangeType() );
         }
-        return writer.generateJsonRequest( request ).getBytes();
     }
 
-    protected DirectMemoryCacheResponse buildResponse( InputStream inputStream 
)
+    protected DirectMemoryCacheResponse buildResponse( InputStream 
inputStream, DirectMemoryCacheRequest request )
         throws DirectMemoryCacheException
     {
-        return parser.buildResponse( inputStream );
+
+        if ( request.getExchangeType() == ExchangeType.JSON )
+        {
+            return parser.buildResponse( inputStream );
+        }
+        else if ( request.getExchangeType() == 
ExchangeType.JAVA_SERIALIZED_OBJECT )
+        {
+            try
+            {
+                DirectMemoryCacheResponse response = new 
DirectMemoryCacheResponse();
+                response.setResponse( request.getSerializer().deserialize( 
IOUtils.toByteArray( inputStream ),
+                                                                         
request.getObjectClass() ) );
+                return response;
+
+            }
+            catch ( IOException e )
+            {
+                throw new DirectMemoryCacheException( e.getMessage(), e );
+            }
+            catch ( ClassNotFoundException e )
+            {
+                throw new DirectMemoryCacheException( e.getMessage(), e );
+            }
+            catch ( IllegalAccessException e )
+            {
+                throw new DirectMemoryCacheException( e.getMessage(), e );
+            }
+            catch ( InstantiationException e )
+            {
+                throw new DirectMemoryCacheException( e.getMessage(), e );
+            }
+        }
+        else if ( request.getExchangeType() == ExchangeType.TEXT_PLAIN )
+        {
+            log.error( "{} not implemented yet", 
ExchangeType.TEXT_PLAIN.getContentType() );
+            throw new NotImplementedException();//  );
+        }
+        else
+        {
+            log.error( "exchange type unknown {}", request.getExchangeType() );
+            throw new DirectMemoryCacheException( "exchange type unknown " + 
request.getExchangeType() );
+        }
+
+
     }
 
     protected String buildRequestWithKey( DirectMemoryCacheRequest request )

Modified: 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/DefaultDirectMemoryServerClient.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/DefaultDirectMemoryServerClient.java?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/DefaultDirectMemoryServerClient.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/DefaultDirectMemoryServerClient.java
 Wed Feb 22 22:06:39 2012
@@ -56,6 +56,7 @@ public class DefaultDirectMemoryServerCl
         throws DirectMemoryCacheException, IOException, 
ClassNotFoundException, InstantiationException,
         IllegalAccessException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         DirectMemoryCacheResponse response = this.directMemoryHttpClient.get( 
directMemoryCacheRequest );
         if ( response.isFound() && response.getCacheContent() != null && 
response.getCacheContent().length > 0 )
         {
@@ -74,6 +75,7 @@ public class DefaultDirectMemoryServerCl
     public Future<DirectMemoryCacheResponse> asyncRetrieve( 
DirectMemoryCacheRequest directMemoryCacheRequest )
         throws DirectMemoryCacheException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         return this.directMemoryHttpClient.asyncGet( directMemoryCacheRequest 
);
     }
 
@@ -81,6 +83,7 @@ public class DefaultDirectMemoryServerCl
     public void put( DirectMemoryCacheRequest directMemoryCacheRequest )
         throws DirectMemoryCacheException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         this.directMemoryHttpClient.put( directMemoryCacheRequest );
     }
 
@@ -88,6 +91,7 @@ public class DefaultDirectMemoryServerCl
     public Future<Void> asyncPut( DirectMemoryCacheRequest 
directMemoryCacheRequest )
         throws DirectMemoryCacheException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         return this.directMemoryHttpClient.asyncPut( directMemoryCacheRequest 
);
     }
 
@@ -95,6 +99,7 @@ public class DefaultDirectMemoryServerCl
     public DirectMemoryCacheResponse delete( DirectMemoryCacheRequest 
directMemoryCacheRequest )
         throws DirectMemoryCacheException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         return this.directMemoryHttpClient.delete( 
directMemoryCacheRequest.setDeleteRequest( true ) );
     }
 
@@ -102,6 +107,19 @@ public class DefaultDirectMemoryServerCl
     public Future<DirectMemoryCacheResponse> asyncDelete( 
DirectMemoryCacheRequest directMemoryCacheRequest )
         throws DirectMemoryCacheException
     {
+        verifyPerRequestParameters( directMemoryCacheRequest );
         return this.directMemoryHttpClient.asyncDelete( 
directMemoryCacheRequest.setDeleteRequest( true ) );
     }
+
+    private void verifyPerRequestParameters(DirectMemoryCacheRequest request)
+    {
+        if ( request.getSerializer() == null )
+        {
+            request.setSerializer( this.clientConfiguration.getSerializer() );
+        }
+        if ( request.getExchangeType() == null )
+        {
+            request.setExchangeType( 
this.clientConfiguration.getExchangeType() );
+        }
+    }
 }

Modified: 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/HttpClientDirectMemoryHttpClient.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/HttpClientDirectMemoryHttpClient.java?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/HttpClientDirectMemoryHttpClient.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-client/src/main/java/org/apache/directmemory/server/client/HttpClientDirectMemoryHttpClient.java
 Wed Feb 22 22:06:39 2012
@@ -21,6 +21,7 @@ package org.apache.directmemory.server.c
 import org.apache.directmemory.server.commons.DirectMemoryCacheException;
 import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
 import org.apache.directmemory.server.commons.DirectMemoryCacheResponse;
+import org.apache.directmemory.server.commons.ExchangeType;
 import org.apache.http.HttpResponse;
 import org.apache.http.StatusLine;
 import org.apache.http.client.HttpClient;
@@ -75,12 +76,16 @@ public class HttpClientDirectMemoryHttpC
         throws DirectMemoryCacheException
     {
         String uri = buildRequestWithKey( request );
-        if ( log.isDebugEnabled() )
+        log.debug( "put request to: {}", uri );
+
+        HttpPut httpPut = new HttpPut( uri );
+        httpPut.addHeader( "Content-Type", getRequestContentType( request ) );
+
+        if ( request.getExchangeType() == ExchangeType.JAVA_SERIALIZED_OBJECT 
&& request.getExpiresIn() > 0 )
         {
-            log.debug( "put request to: {}", uri.toString() );
+            httpPut.addHeader( "X-DirectMemory-ExpiresIn", Integer.toString( 
request.getExpiresIn() ) );
         }
-        HttpPut httpPut = new HttpPut( uri.toString() );
-        httpPut.addHeader( "Content-Type", getRequestContentType( request ) );
+
         httpPut.setEntity( new ByteArrayEntity( getPutContent( request ) ) );
 
         try
@@ -121,10 +126,8 @@ public class HttpClientDirectMemoryHttpC
         throws DirectMemoryCacheException
     {
         String uri = buildRequestWithKey( request );
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "get request to: {}", uri.toString() );
-        }
+
+        log.debug( "get request to: {}", uri );
 
         HttpGet httpGet = new HttpGet( uri );
 
@@ -146,7 +149,7 @@ public class HttpClientDirectMemoryHttpC
                 return new DirectMemoryCacheResponse().setFound( true 
).setDeleted( true );
             }
 
-            return buildResponse( httpResponse.getEntity().getContent() 
).setFound( true );
+            return buildResponse( httpResponse.getEntity().getContent(), 
request ).setFound( true );
         }
         catch ( IOException e )
         {
@@ -174,10 +177,8 @@ public class HttpClientDirectMemoryHttpC
         throws DirectMemoryCacheException
     {
         String uri = buildRequestWithKey( request );
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "get request to: {}", uri.toString() );
-        }
+
+        log.debug( "get request to: {}", uri );
 
         HttpDelete httpDelete = new HttpDelete( uri );
 

Modified: 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ExchangeType.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ExchangeType.java?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ExchangeType.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ExchangeType.java
 Wed Feb 22 22:06:39 2012
@@ -23,17 +23,37 @@ package org.apache.directmemory.server.c
  */
 public enum ExchangeType
 {
-    JSON( "application/json" );
+    JSON( "application/json", 1 ), JAVA_SERIALIZED_OBJECT( 
"application/x-java-serialized-object", 2 ), TEXT_PLAIN(
+    "text/plain", 3 );
 
     private String contentType;
 
-    private ExchangeType( String contentType )
+    private int type;
+
+    private ExchangeType( String contentType, int type )
     {
         this.contentType = contentType;
+        this.type = type;
     }
 
     public String getContentType()
     {
         return contentType;
     }
+
+    public int getType()
+    {
+        return type;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder();
+        sb.append( "ExchangeType" );
+        sb.append( "{contentType='" ).append( contentType ).append( '\'' );
+        sb.append( ", type=" ).append( type );
+        sb.append( '}' );
+        return sb.toString();
+    }
 }

Modified: incubator/directmemory/trunk/server/directmemory-server/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/pom.xml?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/pom.xml (original)
+++ incubator/directmemory/trunk/server/directmemory-server/pom.xml Wed Feb 22 
22:06:39 2012
@@ -48,6 +48,10 @@
       <artifactId>commons-lang</artifactId>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.0.1</version>

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=1292536&r1=1292535&r2=1292536&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
 Wed Feb 22 22:06:39 2012
@@ -48,8 +48,6 @@ 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 Map<String, CacheContentTypeHandler> contentTypeHandlers;
@@ -72,8 +70,10 @@ public class CacheServlet
 
         //
 
-        contentTypeHandlers = new HashMap<String, CacheContentTypeHandler>( 1 
);
+        contentTypeHandlers = new HashMap<String, CacheContentTypeHandler>( 2 
);
         contentTypeHandlers.put( MediaType.APPLICATION_JSON, new 
JsonCacheContentTypeHandler() );
+        contentTypeHandlers.put( 
CacheServletConstants.JAVA_SERIALIZED_OBJECT_CONTENT_TYPE_HEADER,
+                                 new JavaSerializedCacheContentTypeHandler() );
     }
 
     @Override
@@ -106,8 +106,10 @@ public class CacheServlet
 
         if ( contentTypeHandler == null )
         {
+            String contentType = req.getContentType();
+            log.error( "No content type handler for content type {}", 
contentType );
             resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                            "Content-Type '" + req.getContentType() + "' not 
supported" );
+                            "Content-Type '" + contentType + "' not supported" 
);
             return;
         }
         try
@@ -135,7 +137,7 @@ public class CacheServlet
             //         application/json
             return contentTypeHandlers.get( MediaType.APPLICATION_JSON );
         }
-        return null;
+        return contentTypeHandlers.get( contentType );
     }
 
     @Override
@@ -171,16 +173,6 @@ public class CacheServlet
             return;
         }
 
-        byte[] bytes = cacheService.retrieveByteArray( key );
-
-        log.debug( "content size {} for key {}", ( bytes == null ? "null" : 
bytes.length ), key );
-
-        if ( bytes == null || bytes.length == 0 )
-        {
-            resp.sendError( HttpServletResponse.SC_NO_CONTENT, "No content for 
key: " + key );
-            return;
-        }
-
         String acceptContentType = req.getHeader( "Accept" );
 
         if ( StringUtils.isEmpty( acceptContentType ) )
@@ -194,11 +186,23 @@ public class CacheServlet
 
         if ( contentTypeHandler == null )
         {
+            String contentType = req.getContentType();
+            log.error( "No content type handler for content type {}", 
acceptContentType );
             resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                             "Content-Type: " + acceptContentType + " not 
supported" );
             return;
         }
 
+        byte[] bytes = cacheService.retrieveByteArray( key );
+
+        log.debug( "content size {} for key {}", ( bytes == null ? "null" : 
bytes.length ), key );
+
+        if ( bytes == null || bytes.length == 0 )
+        {
+            resp.sendError( HttpServletResponse.SC_NO_CONTENT, "No content for 
key: " + key );
+            return;
+        }
+
         try
         {
             byte[] respBytes =
@@ -223,7 +227,7 @@ public class CacheServlet
             //         application/json
             return contentTypeHandlers.get( MediaType.APPLICATION_JSON );
         }
-        return null;
+        return contentTypeHandlers.get( acceptContentType );
     }
 
     /**

Modified: 
incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java
 (original)
+++ 
incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java
 Wed Feb 22 22:06:39 2012
@@ -166,4 +166,34 @@ public abstract class AbstractServletWit
         DirectMemoryCacheResponse deleteResponse = client.delete( new 
DirectMemoryCacheRequest<Wine>( "fofoofofof" ) );
         assertFalse( deleteResponse.isDeleted() );
     }
+
+    @Test
+    public void putSmallExpiresAndGetNotFound()
+        throws Exception
+    {
+
+        DirectMemoryCacheResponse deleteResponse = client.delete( new 
DirectMemoryCacheRequest<Wine>( "bordeaux" ) );
+        Wine bordeaux = new Wine( "Bordeaux", "very great wine" );
+        client.put( new DirectMemoryCacheRequest<Wine>( "bordeaux", bordeaux 
).setExpiresIn( 1000 ) );
+
+        DirectMemoryCacheRequest rq = new DirectMemoryCacheRequest( 
"bordeaux", Wine.class );
+
+        DirectMemoryCacheResponse<Wine> response = client.retrieve( rq );
+
+        assertTrue( response.isFound() );
+        Wine wine = response.getResponse();
+
+        assertEquals( "Bordeaux", wine.getName() );
+        assertEquals( "very great wine", wine.getDescription() );
+
+        Thread.sleep( 10001 );
+
+        rq = new DirectMemoryCacheRequest( "bordeaux", Wine.class );
+
+        response = client.retrieve( rq );
+
+        assertFalse( response.isFound() );
+
+        assertNull( response.getResponse() );
+    }
 }

Modified: incubator/directmemory/trunk/server/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/pom.xml?rev=1292536&r1=1292535&r2=1292536&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/pom.xml (original)
+++ incubator/directmemory/trunk/server/pom.xml Wed Feb 22 22:06:39 2012
@@ -48,6 +48,11 @@
         <version>2.6</version>
       </dependency>
       <dependency>
+        <groupId>commons-io</groupId>
+        <artifactId>commons-io</artifactId>
+        <version>2.0.1</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.directmemory.server</groupId>
         <artifactId>directmemory-server-commons</artifactId>
         <version>${project.version}</version>


Reply via email to