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>