changeset 863:39987bc895d4

Make Storage.putPojo() implementations async. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-December/004825.html
author Roman Kennke <rkennke@redhat.com>
date Mon, 17 Dec 2012 16:37:43 +0100
parents 05b6f3969868
children 8e16f9b4ef38
files storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java
diffstat 4 files changed, 61 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java	Mon Dec 17 16:36:50 2012 +0100
+++ b/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java	Mon Dec 17 16:37:43 2012 +0100
@@ -42,6 +42,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.DB;
@@ -81,7 +83,13 @@
 
     private UUID agentId;
 
+    private Executor threadpool;
+
     public MongoStorage(StartupConfiguration conf) {
+        this(conf, Executors.newCachedThreadPool());
+    }
+
+    MongoStorage(StartupConfiguration conf, Executor threadpool) {
         conn = new MongoConnection(conf);
         conn.addListener(new ConnectionListener() {
             @Override
@@ -96,6 +104,8 @@
                 }
             }
         });
+
+        this.threadpool = threadpool;
     }
 
     @Override
@@ -131,7 +141,17 @@
     }
 
     @Override
-    public void putPojo(Category cat, boolean replace, AgentIdPojo pojo) {
+    public void putPojo(final Category cat, final boolean replace, final AgentIdPojo pojo) {
+        threadpool.execute(new Runnable() {
+            
+            @Override
+            public void run() {
+                putImpl(cat, replace, pojo);
+            }
+        });
+    }
+
+    private void putImpl(Category cat, boolean replace, AgentIdPojo pojo) {
         DBCollection coll = getCachedCollection(cat);
         MongoPojoConverter converter = new MongoPojoConverter();
         DBObject toInsert = converter.convertPojoToMongo(pojo);
--- a/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java	Mon Dec 17 16:36:50 2012 +0100
+++ b/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java	Mon Dec 17 16:37:43 2012 +0100
@@ -53,6 +53,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.UUID;
+import java.util.concurrent.Executor;
 
 import org.junit.After;
 import org.junit.Before;
@@ -156,7 +157,13 @@
     private DBCursor cursor;
 
     private MongoStorage makeStorage() {
-        MongoStorage storage = new MongoStorage(conf);
+        Executor exec = new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+        MongoStorage storage = new MongoStorage(conf, exec);
         storage.mapCategoryToDBCollection(testCategory, testCollection);
         storage.mapCategoryToDBCollection(emptyTestCategory, emptyTestCollection);
         return storage;
--- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Mon Dec 17 16:36:50 2012 +0100
+++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Mon Dec 17 16:37:43 2012 +0100
@@ -52,6 +52,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -282,7 +284,14 @@
     private String password;
     private SecureRandom random;
 
+    private Executor threadpool;
+
     public WebStorage(StartupConfiguration config) throws StorageException {
+        this(config, Executors.newCachedThreadPool());
+    }
+
+    // Used for testing.
+    WebStorage(StartupConfiguration config, Executor threadpool) {
         categoryIds = new HashMap<>();
         gson = new GsonBuilder().registerTypeHierarchyAdapter(Pojo.class,
                 new ThermostatGSONConverter()).create();
@@ -295,6 +304,8 @@
         if (config.getDBConnectionString().startsWith(HTTPS_PREFIX)) {
             registerSSLScheme(connManager);
         }
+
+        this.threadpool = threadpool;
     }
 
     private void registerSSLScheme(ClientConnectionManager conManager)
@@ -483,8 +494,19 @@
     }
 
     @Override
-    public void putPojo(Category category, boolean replace, AgentIdPojo pojo)
+    public void putPojo(final Category category, final boolean replace, final AgentIdPojo pojo)
             throws StorageException {
+
+        threadpool.execute(new Runnable() {
+            
+            @Override
+            public void run() {
+                putImpl(category, replace, pojo);
+            }
+        });
+    }
+
+    private void putImpl(Category category, boolean replace, AgentIdPojo pojo) {
         // TODO: This logic should probably be moved elsewhere. I.e. out of the
         // Storage API.
         if (pojo.getAgentId() == null) {
--- a/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java	Mon Dec 17 16:36:50 2012 +0100
+++ b/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java	Mon Dec 17 16:37:43 2012 +0100
@@ -52,13 +52,13 @@
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
-import java.net.URLEncoder;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.Executor;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -81,9 +81,8 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonParser;
 import com.google.gson.JsonSyntaxException;
-import com.redhat.thermostat.storage.core.AuthToken;
+import com.redhat.thermostat.storage.config.StartupConfiguration;
 import com.redhat.thermostat.storage.core.AuthToken;
-import com.redhat.thermostat.storage.config.StartupConfiguration;
 import com.redhat.thermostat.storage.core.Categories;
 import com.redhat.thermostat.storage.core.Category;
 import com.redhat.thermostat.storage.core.Cursor;
@@ -150,7 +149,13 @@
                 return "http://fluff.example.org";
             }
         };
-        storage = new WebStorage(config);
+        Executor exec = new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+        storage = new WebStorage(config, exec);
         storage.setEndpoint("http://localhost:" + port + "/");
         storage.setAgentId(new UUID(123, 456));
         headers = new HashMap<>();