You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directmemory.apache.org by ol...@apache.org on 2012/02/20 17:52:26 UTC

svn commit: r1291364 - in /incubator/directmemory/trunk/server: ./ directmemory-server-client/ directmemory-server-commons/ directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/ directmemory-server/ directmemory-server/src/m...

Author: olamy
Date: Mon Feb 20 16:52:25 2012
New Revision: 1291364

URL: http://svn.apache.org/viewvc?rev=1291364&view=rev
Log:
[DIRECTMEMORY-61] remove REST interface not needed
add first implementation based on json exchagnge.

Added:
    incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java   (with props)
    incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/
    incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/
    incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml   (with props)
    incubator/directmemory/trunk/server/directmemory-server/src/test/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/CacheServletTest.java   (with props)
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/ExtractKeyFromPathTest.java
      - copied, changed from r1291362, incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java
    incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/Wine.java   (contents, props changed)
      - copied, changed from r1291362, incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java
    incubator/directmemory/trunk/server/directmemory-server/src/test/resources/
    incubator/directmemory/trunk/server/directmemory-server/src/test/resources/logback-test.xml
      - copied, changed from r1291362, incubator/directmemory/trunk/server/directmemory-server-client/pom.xml
Removed:
    incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java
Modified:
    incubator/directmemory/trunk/server/directmemory-server-client/pom.xml
    incubator/directmemory/trunk/server/directmemory-server-commons/pom.xml
    incubator/directmemory/trunk/server/directmemory-server-commons/src/main/java/org/apache/directmemory/server/commons/DirectMemoryCacheWriter.java
    incubator/directmemory/trunk/server/directmemory-server/pom.xml
    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=1291364&r1=1291363&r2=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server-client/pom.xml (original)
+++ incubator/directmemory/trunk/server/directmemory-server-client/pom.xml Mon Feb 20 16:52:25 2012
@@ -29,7 +29,6 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>directmemory-server-client</artifactId>
-  <packaging>war</packaging>
   <name>Apache DirectMemory :: Server :: Client</name>
   <description>${project.name}</description>
 

Modified: incubator/directmemory/trunk/server/directmemory-server-commons/pom.xml
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server-commons/pom.xml?rev=1291364&r1=1291363&r2=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server-commons/pom.xml (original)
+++ incubator/directmemory/trunk/server/directmemory-server-commons/pom.xml Mon Feb 20 16:52:25 2012
@@ -29,7 +29,6 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>directmemory-server-commons</artifactId>
-  <packaging>war</packaging>
   <name>Apache DirectMemory :: Server :: Commons</name>
   <description>${project.name}</description>
 

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=1291364&r1=1291363&r2=1291364&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:52:25 2012
@@ -56,54 +56,6 @@ public class DirectMemoryCacheWriter
         this.jsonFactory = new JsonFactory();
     }
 
-    public String generateXmlRequest( DirectMemoryCacheRequest request )
-        throws DirectMemoryCacheException
-    {
-        try
-        {
-            StringWriter stringWriter = new StringWriter();
-            XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter( stringWriter );
-            xmlStreamWriter.writeStartDocument( "1.0" );
-
-            xmlStreamWriter.writeStartElement( DirectMemoryCacheConstants.ROOT_RQ_NAME );
-
-            xmlStreamWriter.writeAttribute( DirectMemoryCacheConstants.KEY_FIELD_NAME, request.getKey() );
-            xmlStreamWriter.writeAttribute( DirectMemoryCacheConstants.PUT_FIELD_NAME,
-                                            Boolean.toString( request.isUpdate() ) );
-            xmlStreamWriter.writeAttribute( DirectMemoryCacheConstants.EXPIRES_IN_FIELD_NAME,
-                                            Integer.toString( request.getExpiresIn() ) );
-
-            if ( request.isUpdate() )
-            {
-                // FIXME take care of NPE
-                // cache content generation
-                Serializer serializer = request.getSerializer();
-                // if no Object users are able to pass a string content
-                byte[] bytes = request.getObject() != null
-                    ? request.getSerializer().serialize( request.getObject() )
-                    : request.getCacheContent();
-                xmlStreamWriter.writeStartElement( DirectMemoryCacheConstants.CACHE_CONTENT_FIELD_NAME );
-                xmlStreamWriter.writeCData( new String( bytes ) );// charset ?
-                xmlStreamWriter.writeEndElement();
-            }
-
-            xmlStreamWriter.writeEndElement();
-
-            xmlStreamWriter.writeEndDocument();
-
-            return stringWriter.toString();
-        }
-        catch ( IOException e )
-        {
-            throw new DirectMemoryCacheException( e.getMessage(), e );
-        }
-        catch ( XMLStreamException e )
-        {
-            throw new DirectMemoryCacheException( e.getMessage(), e );
-        }
-
-    }
-
     public String generateJsonRequest( DirectMemoryCacheRequest request )
         throws DirectMemoryCacheException
     {

Modified: incubator/directmemory/trunk/server/directmemory-server/pom.xml
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/pom.xml?rev=1291364&r1=1291363&r2=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/pom.xml (original)
+++ incubator/directmemory/trunk/server/directmemory-server/pom.xml Mon Feb 20 16:52:25 2012
@@ -41,6 +41,15 @@
       <version>1.1.1</version>
     </dependency>
     <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>2.5</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.directmemory.server</groupId>
       <artifactId>directmemory-server-commons</artifactId>
     </dependency>
@@ -48,6 +57,49 @@
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-test</artifactId>
+      <version>3.1.1.RELEASE</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-core</artifactId>
+      <version>3.1.1.RELEASE</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <systemPropertyVariables>
+            <directMemory.numberOfBuffers>10</directMemory.numberOfBuffers>
+            <!-- must be enough confortable for test beans -->
+            <directMemory.size>10000</directMemory.size>
+          </systemPropertyVariables>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
 </project>
\ No newline at end of file

Added: 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=1291364&view=auto
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java (added)
+++ incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/CacheServlet.java Mon Feb 20 16:52:25 2012
@@ -0,0 +1,179 @@
+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.commons.lang.StringUtils;
+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;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * TODO add some listener plugin mechanism to store figures/statistics on cache access
+ *
+ * @author Olivier Lamy
+ */
+public class CacheServlet
+    extends HttpServlet
+{
+
+    private Logger log = LoggerFactory.getLogger( getClass() );
+
+    private CacheService cacheService = new CacheServiceImpl();
+
+    private DirectMemoryCacheParser parser = DirectMemoryCacheParser.instance();
+
+    private DirectMemoryCacheWriter writer = DirectMemoryCacheWriter.instance();
+
+    @Override
+    public void init( ServletConfig config )
+        throws ServletException
+    {
+        super.init( config );
+        // TODO some configuration for cacheService.init( .... ); different from sysproperties
+        //int numberOfBuffers, int size, int initialCapacity, int concurrencyLevel
+        int numberOfBuffers = Integer.getInteger( "directMemory.numberOfBuffers", 1000 );
+        int size = Integer.getInteger( "directMemory.size", 10 );
+        int initialCapacity =
+            Integer.getInteger( "directMemory.initialCapacity", CacheService.DEFAULT_INITIAL_CAPACITY );
+        int concurrencyLevel =
+            Integer.getInteger( "directMemory.concurrencyLevel", CacheService.DEFAULT_CONCURRENCY_LEVEL );
+        cacheService.init( numberOfBuffers, size, initialCapacity, concurrencyLevel );
+    }
+
+    @Override
+    public void destroy()
+    {
+        super.destroy();
+    }
+
+    @Override
+    protected void doPost( HttpServletRequest req, HttpServletResponse resp )
+        throws ServletException, IOException
+    {
+        this.doPut( req, resp );
+    }
+
+    @Override
+    protected void doPut( HttpServletRequest req, HttpServletResponse resp )
+        throws ServletException, IOException
+    {
+        //TODO check request content to send HttpServletResponse.SC_BAD_REQUEST
+        // if missing parameter in json request
+
+        String path = req.getPathInfo();
+        String servletPath = req.getServletPath();
+        String key = retrieveKeyFromPath( path );
+
+        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() );
+        }
+    }
+
+    @Override
+    protected void doDelete( HttpServletRequest req, HttpServletResponse resp )
+        throws ServletException, IOException
+    {
+        String path = req.getPathInfo();
+        String servletPath = req.getServletPath();
+        String key = retrieveKeyFromPath( path );
+
+        // TODO if key == null -> BAD_REQUEST http response
+
+        cacheService.free( key );
+    }
+
+    @Override
+    protected void doGet( HttpServletRequest req, HttpServletResponse resp )
+        throws ServletException, IOException
+    {
+        // url format = /cache/key so get the key from path
+        String path = req.getPathInfo();
+        String servletPath = req.getServletPath();
+        String key = retrieveKeyFromPath( path );
+
+        if ( StringUtils.isEmpty( key ) )
+        {
+            resp.sendError( HttpServletResponse.SC_BAD_REQUEST, "key missing in path" );
+            return;
+        }
+
+        byte[] bytes = cacheService.retrieveByteArray( key );
+
+        if ( bytes == null )
+        {
+            resp.sendError( HttpServletResponse.SC_NO_CONTENT, "No content for key: " + key );
+            return;
+        }
+        DirectMemoryCacheResponse response = new DirectMemoryCacheResponse().setKey( key ).setCacheContent( bytes );
+
+        try
+        {
+            // TODO directly write in output stream
+            String json = writer.generateJsonResponse( response );
+            resp.getWriter().write( json );
+        }
+        catch ( DirectMemoryCacheException e )
+        {
+            resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage() );
+        }
+    }
+
+    /**
+     * protected for unit test reason
+     *
+     * @param path
+     * @return
+     */
+    protected String retrieveKeyFromPath( String path )
+    {
+        if ( StringUtils.endsWith( path, "/" ) )
+        {
+            return StringUtils.substringAfterLast( StringUtils.substringBeforeLast( path, "/" ), "/" );
+        }
+        return StringUtils.substringAfterLast( path, "/" );
+    }
+}

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

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

Added: incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml?rev=1291364&view=auto
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml (added)
+++ incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml Mon Feb 20 16:52:25 2012
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~
+  ~ Licensed 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.
+  -->
+
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+  <display-name>Apache DirectMemory</display-name>
+  
+  <servlet>
+    <servlet-name>CacheServlet</servlet-name>
+    <servlet-class>org.apache.directmemory.server.services.CacheServlet</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>CacheServlet</servlet-name>
+    <url-pattern>/cache/*</url-pattern>
+  </servlet-mapping>
+
+  
+</web-app>  
\ No newline at end of file

Propchange: incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/directmemory/trunk/server/directmemory-server/src/main/webapp/WEB-INF/web.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/CacheServletTest.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/CacheServletTest.java?rev=1291364&view=auto
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/CacheServletTest.java (added)
+++ incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/CacheServletTest.java Mon Feb 20 16:52:25 2012
@@ -0,0 +1,273 @@
+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.serialization.Serializer;
+import org.apache.directmemory.serialization.SerializerFactory;
+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.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockServletConfig;
+import org.springframework.mock.web.MockServletContext;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Olivier Lamy
+ */
+public class CacheServletTest
+{
+    private Logger log = LoggerFactory.getLogger( getClass() );
+
+    CacheServlet cacheServlet = new CacheServlet();
+
+    DirectMemoryCacheWriter writer = DirectMemoryCacheWriter.instance();
+
+    DirectMemoryCacheParser parser = DirectMemoryCacheParser.instance();
+
+    @Before
+    public void init()
+        throws Exception
+    {
+
+        MockServletContext mockServletContext = new MockServletContext();
+        mockServletContext.setContextPath( "direct-memory" );
+
+        MockServletConfig mockServletConfig = new MockServletConfig( mockServletContext );
+
+        cacheServlet.init( mockServletConfig );
+    }
+
+    @Test
+    public void badRequest()
+        throws Exception
+    {
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        cacheServlet.doGet( request, response );
+
+        assertEquals( HttpServletResponse.SC_BAD_REQUEST, response.getStatus() );
+
+
+    }
+
+    @Test
+    public void keyNotFound()
+        throws Exception
+    {
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+
+        request.setServletPath( "cache" );
+
+        request.setPathInfo( "/foo" );
+
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        cacheServlet.doGet( request, response );
+
+        assertEquals( HttpServletResponse.SC_NO_CONTENT, response.getStatus() );
+
+    }
+
+    @Test
+    public void storeObject()
+        throws Exception
+    {
+
+        Serializer serializer = SerializerFactory.createNewSerializer();
+
+        Wine bordeaux = new Wine( "Bordeaux", "very great wine" );
+
+        DirectMemoryCacheRequest directMemoryCacheRequest =
+            new DirectMemoryCacheRequest().setKey( "bordeaux" ).setCacheContent( serializer.serialize( bordeaux ) );
+
+        String rq = writer.generateJsonRequest( directMemoryCacheRequest );
+
+        MockHttpServletRequest putRequest = new MockHttpServletRequest();
+
+        putRequest.setServletPath( "cache" );
+
+        putRequest.setPathInfo( "/bordeaux" );
+
+        putRequest.setContent( rq.getBytes() );
+
+        MockHttpServletResponse putResponse = new MockHttpServletResponse();
+
+        cacheServlet.doPut( putRequest, putResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, putResponse.getStatus() );
+
+        // now retrieve the content
+
+        MockHttpServletRequest getRequest = new MockHttpServletRequest();
+
+        getRequest.setPathInfo( "/bordeaux" );
+
+        MockHttpServletResponse getResponse = new MockHttpServletResponse();
+
+        cacheServlet.doGet( getRequest, getResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, getResponse.getStatus() );
+
+        DirectMemoryCacheResponse response =
+            parser.buildResponse( new ByteArrayInputStream( getResponse.getContentAsByteArray() ) );
+
+        Wine wineFromCache = serializer.deserialize( response.getCacheContent(), Wine.class );
+
+        assertEquals( bordeaux.getName(), wineFromCache.getName() );
+        assertEquals( bordeaux.getDescription(), wineFromCache.getDescription() );
+
+    }
+
+    @Test
+    public void storeExpiredObject()
+        throws Exception
+    {
+
+        Serializer serializer = SerializerFactory.createNewSerializer();
+
+        Wine bordeaux = new Wine( "Bordeaux", "very great wine" );
+
+        DirectMemoryCacheRequest directMemoryCacheRequest =
+            new DirectMemoryCacheRequest().setKey( "bordeaux" ).setCacheContent(
+                serializer.serialize( bordeaux ) ).setExpiresIn( 3 );
+
+        String rq = writer.generateJsonRequest( directMemoryCacheRequest );
+
+        MockHttpServletRequest putRequest = new MockHttpServletRequest();
+
+        putRequest.setServletPath( "cache" );
+
+        putRequest.setPathInfo( "/bordeaux" );
+
+        putRequest.setContent( rq.getBytes() );
+
+        MockHttpServletResponse putResponse = new MockHttpServletResponse();
+
+        cacheServlet.doPut( putRequest, putResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, putResponse.getStatus() );
+
+        Thread.sleep( 10 );
+
+        // now retrieve the content
+
+        MockHttpServletRequest getRequest = new MockHttpServletRequest();
+
+        getRequest.setPathInfo( "/bordeaux" );
+
+        MockHttpServletResponse getResponse = new MockHttpServletResponse();
+
+        cacheServlet.doGet( getRequest, getResponse );
+
+        assertEquals( HttpServletResponse.SC_NO_CONTENT, getResponse.getStatus() );
+
+
+    }
+
+
+    @Test
+    public void storeObjectThenRemove()
+        throws Exception
+    {
+
+        Serializer serializer = SerializerFactory.createNewSerializer();
+
+        Wine bordeaux = new Wine( "Bordeaux", "very great wine" );
+
+        DirectMemoryCacheRequest directMemoryCacheRequest =
+            new DirectMemoryCacheRequest().setKey( "bordeaux" ).setCacheContent( serializer.serialize( bordeaux ) );
+
+        String rq = writer.generateJsonRequest( directMemoryCacheRequest );
+
+        MockHttpServletRequest putRequest = new MockHttpServletRequest();
+
+        putRequest.setServletPath( "cache" );
+
+        putRequest.setPathInfo( "/bordeaux" );
+
+        putRequest.setContent( rq.getBytes() );
+
+        MockHttpServletResponse putResponse = new MockHttpServletResponse();
+
+        cacheServlet.doPut( putRequest, putResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, putResponse.getStatus() );
+
+        // now retrieve the content
+
+        MockHttpServletRequest getRequest = new MockHttpServletRequest();
+
+        getRequest.setPathInfo( "/bordeaux" );
+
+        MockHttpServletResponse getResponse = new MockHttpServletResponse();
+
+        cacheServlet.doGet( getRequest, getResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, getResponse.getStatus() );
+
+        DirectMemoryCacheResponse response =
+            parser.buildResponse( new ByteArrayInputStream( getResponse.getContentAsByteArray() ) );
+
+        Wine wineFromCache = serializer.deserialize( response.getCacheContent(), Wine.class );
+
+        assertEquals( bordeaux.getName(), wineFromCache.getName() );
+        assertEquals( bordeaux.getDescription(), wineFromCache.getDescription() );
+
+        // now delete the content
+
+        MockHttpServletRequest deleteRq = new MockHttpServletRequest();
+
+        deleteRq.setPathInfo( "/bordeaux" );
+
+        MockHttpServletResponse deleteResponse = new MockHttpServletResponse();
+
+        cacheServlet.doDelete( deleteRq, deleteResponse );
+
+        assertEquals( HttpServletResponse.SC_OK, deleteResponse.getStatus() );
+
+        // now try again a read MUST be not content
+
+        getRequest = new MockHttpServletRequest();
+
+        getRequest.setPathInfo( "/bordeaux" );
+
+        getResponse = new MockHttpServletResponse();
+
+        cacheServlet.doGet( getRequest, getResponse );
+
+        assertEquals( HttpServletResponse.SC_NO_CONTENT, getResponse.getStatus() );
+
+    }
+
+}

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

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

Copied: incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/ExtractKeyFromPathTest.java (from r1291362, incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java)
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/ExtractKeyFromPathTest.java?p2=incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/ExtractKeyFromPathTest.java&p1=incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java&r1=1291362&r2=1291364&rev=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java (original)
+++ incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/ExtractKeyFromPathTest.java Mon Feb 20 16:52:25 2012
@@ -1,5 +1,4 @@
 package org.apache.directmemory.server.services;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -19,37 +18,32 @@ package org.apache.directmemory.server.s
  * under the License.
  */
 
-import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
-import org.apache.directmemory.server.commons.DirectMemoryCacheResponse;
+import org.junit.Test;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import static junit.framework.Assert.assertEquals;
 
 /**
  * @author Olivier Lamy
  */
-@Path( "directMemoryService" )
-public interface DirectMemoryCacheService
+public class ExtractKeyFromPathTest
 {
-    @GET
-    @Path( "retrieve/{key}" )
-    @Produces( MediaType.APPLICATION_JSON )
-    DirectMemoryCacheResponse retrieve( @PathParam( "key" ) String key );
-
-    @PUT
-    @Path( "store" )
-    @Produces( MediaType.APPLICATION_JSON )
-    @Consumes( MediaType.APPLICATION_JSON )
-    Boolean store( DirectMemoryCacheRequest request );
-
-    @DELETE
-    @Path( "delete/{key}" )
-    Boolean delete( @PathParam( "key" ) String key );
 
+    private CacheServlet cacheServlet = new CacheServlet();
+
+    @Test
+    public void pathEndedWithSlash()
+        throws Exception
+    {
+        String key = cacheServlet.retrieveKeyFromPath( "cache/foo/" );
+        assertEquals( "foo", key );
+    }
+
+    @Test
+    public void pathNotEndedWithSlash()
+        throws Exception
+    {
+        String key = cacheServlet.retrieveKeyFromPath( "/cache/foo" );
+        assertEquals( "foo", key );
+
+    }
 }

Copied: incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/Wine.java (from r1291362, incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java)
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/Wine.java?p2=incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/Wine.java&p1=incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java&r1=1291362&r2=1291364&rev=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/DirectMemoryCacheService.java (original)
+++ incubator/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/Wine.java Mon Feb 20 16:52:25 2012
@@ -1,5 +1,4 @@
 package org.apache.directmemory.server.services;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -19,37 +18,41 @@ package org.apache.directmemory.server.s
  * under the License.
  */
 
-import org.apache.directmemory.server.commons.DirectMemoryCacheRequest;
-import org.apache.directmemory.server.commons.DirectMemoryCacheResponse;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import java.io.Serializable;
 
 /**
  * @author Olivier Lamy
  */
-@Path( "directMemoryService" )
-public interface DirectMemoryCacheService
+public class Wine
+    implements Serializable
 {
-    @GET
-    @Path( "retrieve/{key}" )
-    @Produces( MediaType.APPLICATION_JSON )
-    DirectMemoryCacheResponse retrieve( @PathParam( "key" ) String key );
-
-    @PUT
-    @Path( "store" )
-    @Produces( MediaType.APPLICATION_JSON )
-    @Consumes( MediaType.APPLICATION_JSON )
-    Boolean store( DirectMemoryCacheRequest request );
-
-    @DELETE
-    @Path( "delete/{key}" )
-    Boolean delete( @PathParam( "key" ) String key );
+    private String name;
+
+    private String description;
 
+    public Wine( String name, String description )
+    {
+        this.name = name;
+        this.description = description;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public void setDescription( String description )
+    {
+        this.description = description;
+    }
 }

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

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

Copied: incubator/directmemory/trunk/server/directmemory-server/src/test/resources/logback-test.xml (from r1291362, incubator/directmemory/trunk/server/directmemory-server-client/pom.xml)
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/test/resources/logback-test.xml?p2=incubator/directmemory/trunk/server/directmemory-server/src/test/resources/logback-test.xml&p1=incubator/directmemory/trunk/server/directmemory-server-client/pom.xml&r1=1291362&r2=1291364&rev=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server-client/pom.xml (original)
+++ incubator/directmemory/trunk/server/directmemory-server/src/test/resources/logback-test.xml Mon Feb 20 16:52:25 2012
@@ -1,37 +1,33 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.directmemory.server</groupId>
-    <artifactId>server</artifactId>
-    <version>0.5.5-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>directmemory-server-client</artifactId>
-  <packaging>war</packaging>
-  <name>Apache DirectMemory :: Server :: Client</name>
-  <description>${project.name}</description>
-
-
-</project>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<configuration>
+
+  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %method - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <logger name="org.apache.directmemory.server" level="INFO"/>
+  <root level="INFO">
+    <appender-ref ref="CONSOLE"/>
+  </root>
+
+</configuration>
\ No newline at end of file

Modified: incubator/directmemory/trunk/server/pom.xml
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/pom.xml?rev=1291364&r1=1291363&r2=1291364&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/pom.xml (original)
+++ incubator/directmemory/trunk/server/pom.xml Mon Feb 20 16:52:25 2012
@@ -43,6 +43,11 @@
   <dependencyManagement>
     <dependencies>
       <dependency>
+        <groupId>commons-lang</groupId>
+        <artifactId>commons-lang</artifactId>
+        <version>2.6</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.directmemory.server</groupId>
         <artifactId>directmemory-server-commons</artifactId>
         <version>${project.version}</version>