adam bien's blog

Project connectorZ--Lean JCA 1.6 File Store 📎

connectorZ project is an example connector implementation under Apache 2.0 license.

After a work manager implementation, the second file store sample is available. It is a key-value store like, transactional, JCA connector which accesses files locally:

 1 package com.abien.filestore;
 2 
 3 import java.net.URI;
 4 import javax.annotation.Resource;
 5 import javax.ejb.Stateless;
 6 import javax.ws.rs.*;
 7 import javax.ws.rs.core.MediaType;
 8 import javax.ws.rs.core.Response;
 9 import org.connectorz.files.Bucket;
10 import org.connectorz.files.BucketStore;
11 
12 /**
13  *
14  * @author adam bien, adam-bien.com
15  */
16 @Path("files")
17 @Stateless
18 @Consumes(MediaType.TEXT_PLAIN)
19 @Produces(MediaType.TEXT_PLAIN)
20 public class FilesResource {
21 
22     @Resource(name = "jca/files")
23     BucketStore bucketStore;
24 
25     @PUT
26     @Path("{id}")
27     public Response put(@PathParam("id") String id, String content) {
28         try (Bucket bucket = bucketStore.getBucket();) {
29             bucket.write(id, content.getBytes());
30         }
31         URI createdURI = URI.create(id);
32         return Response.created(createdURI).build();
33     }
34 
35     @GET
36     @Path("{id}")
37     public String fetch(@PathParam("id") String id) {
38         try (Bucket bucket = bucketStore.getBucket();) {
39             final byte[] content = bucket.fetch(id);
40             if(content == null)
41                 return null;
42             return new String(content);
43         }
44     }
45 
46     @DELETE
47     @Path("{id}")
48     public void delete(@PathParam("id") String id) {
49         try (Bucket bucket = bucketStore.getBucket();) {
50             bucket.delete(id);
51         }
52     }
53 }
54 

File access is prohibited by the EJB spec (and many cloud providers as well) for a good reason: multi-threaded, remote access to the file system may cause inconsistencies and deadlocks. With JCA a consistent file access realization is relatively easy--the container informs the JCA implementation about the current transaction status, what makes the synchronization with the file system easier.

[The connectorZ project was initiated by factoring out examples from the book "Real World Java EE Patterns--Rethinking Best Practices" book (Second Iteration), page 303 in, chapter "Generic (File) JCA"]

The source code was formatted with NetBeans "HTML printing"

See you at Java EE Workhops at MUC Airport (October 22nd-24th)!