| <?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. |
| --> |
| <document> |
| <properties> |
| <title>Apache DirectMemory Server Side</title> |
| <author>Olivier Lamy</author> |
| </properties> |
| <body> |
| <macro name="toc"> |
| |
| </macro> |
| <section name="DirectMemory Server"> |
| <p>Apache DirectMemory has a server implementation (a servlet) to provide you a way to store your project remotely and to share those cached objects with various applications.</p> |
| <p>Server side and client side (Java only) are provided.</p> |
| <p>The exchange are based on http(s) exchange with the following implementations/format: |
| <ul> |
| <li>JSON format</li> |
| <li>"binary" format: parameters are send via http headers</li> |
| <li>text/plain format: you can send a text value(json object, xml etc..), the server will serialize the content and store it for you.</li> |
| </ul> |
| </p> |
| </section> |
| <section name="Exchange formats"> |
| <p>We simply use HTTP method names to resolve the action to proceed and depends on the Accept or Content-Type headers the format will be different : |
| <ul> |
| <li>GET to retrieve content ${webPath}/${key}</li> |
| <li>DELETE to delete content ${webPath}/${key}</li> |
| <li>PUT/POST to add some content in cache ${webPath}/${key}</li> |
| </ul> |
| </p> |
| <subsection name="HTTP Methods"> |
| <subsection name="PUT/POST"> |
| <p> |
| PUT/POST are used for adding/updating content in cache.<br/> |
| Note: if the content was not put in cache, you will receive a 204 (Not Content) |
| </p> |
| </subsection> |
| <subsection name="GET"> |
| <p> |
| GET is used to retrieve content from the cache.<br/> |
| <b>If not content is found for the key, you will receive the http code 204 (No content)</b> |
| </p> |
| </subsection> |
| <subsection name="DELETE"> |
| <p> |
| DELETE is used to removed content from cache<br/> |
| Note: if the entry was not available in the server you will receive a 204 (Not Content) |
| </p> |
| </subsection> |
| </subsection> |
| <subsection name="Http Headers"> |
| <p>see various exchange type for dedicated http headers</p> |
| <p> |
| Common http headers: |
| <ul> |
| <li>X-DirectMemory-SerializeSize: returns bytes number stored on server side.</li> |
| </ul> |
| </p> |
| </subsection> |
| </section> |
| <section name="JSON Exchange"> |
| <subsection name="JSON PUT Content"> |
| <p> |
| JSON Request to put content in cache Content-Type: application/json |
| <source> |
| {"expiresIn":123, |
| "cacheContent":"rO0ABXNydmEvbGFuZy9TdHJpbmc7eHB0AAhCb3JkZWF1eA=="} |
| </source> |
| To put this content in DirectMemory Cache Server, just use a PUT request on path ${webPath}/DirectMemoryServlet/${key}.<br/> |
| </p> |
| </subsection> |
| <subsection name="JSON GET Content"> |
| <p>Use a GET request on ${webPath}/DirectMemoryServlet/${key} and you will receive the JSON response: |
| <source> |
| {"key":"foo","cacheContent":"Zm9vIGJhcg=="} |
| </source> |
| </p> |
| </subsection> |
| <subsection name="JSON DELETE Content"> |
| <p>Use a DELETE request on ${webPath}/DirectMemoryServlet/${key}.</p> |
| </subsection> |
| </section> |
| <section name="Binary Exchange"> |
| <subsection name="Binary PUT Content"> |
| <p> |
| PUT Request to put content in cache Content-Type: application/x-java-serialized-object.<br/> |
| To put this content in DirectMemory Cache Server, just use a PUT request on path ${webPath}/DirectMemoryServlet/${key}.<br/> |
| ExpiresIn value can be set with http header: X-DirectMemory-ExpiresIn<br/> |
| The http request body will contains the serialized object value.<br/> |
| </p> |
| </subsection> |
| <subsection name="Binary GET Content"> |
| <p> |
| Use a GET request on ${webPath}/DirectMemoryServlet/${key} and you will receive the binary form of the object. |
| </p> |
| </subsection> |
| <subsection name="Binary DELETE Content"> |
| <p>Use a DELETE request on ${webPath}/DirectMemoryServlet/${key}.</p> |
| </subsection> |
| </section> |
| <section name="text/plain Exchange"> |
| <subsection name="text/plain PUT Content"> |
| <p> |
| PUT Request to put content in cache <code>Content-Type: text/plain.</code><br/> |
| To put this content in DirectMemory Cache Server, just use a PUT request on path ${webPath}/DirectMemoryServlet/${key}.<br/> |
| ExpiresIn value can be set with http header: X-DirectMemory-ExpiresIn<br/> |
| The http request body will contains a String value which will be serialized on server side and stored in directMemory.<br/> |
| You can specify the Serializer to use with the http header: "X-DirectMemory-Serializer" (must contains the full class name).<br/> |
| </p> |
| </subsection> |
| <subsection name="text/plain GET Content"> |
| <p> |
| Use a GET request on ${webPath}/DirectMemoryServlet/${key} and you will receive the stored String. |
| </p> |
| </subsection> |
| <subsection name="text/plain DELETE Content"> |
| <p>Use a DELETE request on ${webPath}/DirectMemoryServlet/${key}.</p> |
| </subsection> |
| </section> |
| |
| <section name="Java Client API"> |
| <subsection name="Client Configuration"> |
| <p>Before using the client api, you must configure it using the following pattern: |
| <macro name="snippet"> |
| <param name="id" value="client-configuration"/> |
| <param name="url" value="http://svn.apache.org/repos/asf/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java"/> |
| </macro> |
| Here you have a configured client. Have a look at DirectMemoryServerClientConfiguration javadoc for advanced options. |
| </p> |
| </subsection> |
| <subsection name="PUT Content"> |
| <p> |
| With the Java client is something like: |
| <macro name="snippet"> |
| <param name="id" value="client-put"/> |
| <param name="url" value="http://svn.apache.org/repos/asf/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java"/> |
| </macro> |
| </p> |
| </subsection> |
| <subsection name="GET Content"> |
| <p>With the Java api: |
| <macro name="snippet"> |
| <param name="id" value="client-get"/> |
| <param name="url" value="http://svn.apache.org/repos/asf/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java"/> |
| </macro> |
| You must check the method (response.isFound()) if true retrieve the object with: Wine wine = response.getResponse(); |
| </p> |
| </subsection> |
| <subsection name="DELETE Content"> |
| <p>With the Java api: |
| <macro name="snippet"> |
| <param name="id" value="client-delete"/> |
| <param name="url" value="http://svn.apache.org/repos/asf/directmemory/trunk/server/directmemory-server/src/test/java/org/apache/directmemory/server/services/AbstractServletWithClientTest.java"/> |
| </macro> |
| </p> |
| </subsection> |
| </section> |
| </body> |
| </document> |