diff --git a/adapter/kvstore/java/build.gradle b/adapter/kvstore/java/build.gradle index 32331071a..1c0d21482 100644 --- a/adapter/kvstore/java/build.gradle +++ b/adapter/kvstore/java/build.gradle @@ -27,7 +27,7 @@ dependencies { // 'test.useTestNG()' to your build script. testCompile 'junit:junit:4.12' - compile files('../../../wrapper/java/build/libs/hermes.jar') + compile files('../../../wrapper/java/build/libs/hermes-1.0.0.jar') } sourceSets { diff --git a/adapter/kvstore/java/settings.gradle b/adapter/kvstore/java/settings.gradle index 6ad030669..371bf447f 100644 --- a/adapter/kvstore/java/settings.gradle +++ b/adapter/kvstore/java/settings.gradle @@ -15,4 +15,4 @@ include 'api' include 'services:webservice' */ -rootProject.name = 'kvstore' +rootProject.name = 'hermes_kvstore-1.0.0' diff --git a/adapter/kvstore/java/src/kvstore/java/KVStore.java b/adapter/kvstore/java/src/kvstore/java/KVStore.java index 7efc9973a..8bd924830 100644 --- a/adapter/kvstore/java/src/kvstore/java/KVStore.java +++ b/adapter/kvstore/java/src/kvstore/java/KVStore.java @@ -1,5 +1,5 @@ -package kvstore.java; -import kvstore.java.KVTable; +package hermes_kvstore.java; +import hermes_kvstore.java.KVTable; import hermes.java.Hermes; public class KVStore { diff --git a/adapter/kvstore/java/src/kvstore/java/KVTable.java b/adapter/kvstore/java/src/kvstore/java/KVTable.java index 400a2564b..596226ada 100644 --- a/adapter/kvstore/java/src/kvstore/java/KVTable.java +++ b/adapter/kvstore/java/src/kvstore/java/KVTable.java @@ -1,4 +1,4 @@ -package kvstore.java; +package hermes_kvstore.java; import java.nio.ByteBuffer; import java.util.Map; @@ -27,39 +27,69 @@ public class KVTable { } /** Serialize a Map into a blob */ - private Blob mapToBlob(Map map) { + private Blob blobSerialize(T obj) throws IOException { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(map); + oos.writeObject(obj); oos.close(); byte[] bytes = baos.toByteArray(); return new Blob(ByteBuffer.wrap(bytes)); } catch (IOException e) { e.printStackTrace(); - return Blob.fromString(""); + throw e; } } /** Deserialize a Map from a blob */ - private Map blobToMap(Blob blob) { + private T blobDeserialize(Blob blob) throws IOException, ClassNotFoundException { try { byte[] bytes = blob.array(); ByteArrayInputStream istream = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(istream); - Map map = (Map) ois.readObject(); + T obj = (T) ois.readObject(); ois.close(); blob.close(); - return map; + return obj; } catch (IOException e) { e.printStackTrace(); - return new HashMap(); + throw e; } catch (ClassNotFoundException e) { e.printStackTrace(); - return new HashMap(); + throw e; } } + public String getFieldKey(String key, String field_name) { + return String.format("%s-%s", key, field_name); + } + + public String getKvMetadataKey() { + return "hermes-kvmetadata"; + } + + /** + * Insert a new record into the table + * */ + public void insert(String key, Map val) throws IOException { + /*UniqueId md_id = bkt_.getBlobId(getKvMetadataKey()); + if (md_id.isNull()) { + Set keys = new HashSet(val.keySet()); + Blob md_blob = blobSerialize(keys); + bkt_.put(getKvMetadataKey(), md_blob); + md_blob.close(); + } + for (Map.Entry entry : val.entrySet()) { + String field_key = getFieldKey(key, entry.getKey()); + Blob blob = blobSerialize(entry.getValue()); + bkt_.put(field_key, blob); + blob.close(); + }*/ + Blob blob = blobSerialize(val); + bkt_.put(key, blob); + blob.close(); + } + /** * Create or insert a record into the table * @@ -67,20 +97,17 @@ private Map blobToMap(Blob blob) { * @param val the values to update in the record * @return None * */ - public void update(String key, Map val) { + public void update(String key, Map val) throws IOException, ClassNotFoundException { + /*insert(key, val);*/ UniqueId blob_id = bkt_.getBlobId(key); if (blob_id.isNull()) { - Blob blob = mapToBlob(val); - bkt_.put(key, blob); - blob.close(); + insert(key, val); } else { bkt_.lockBlob(blob_id, MdLockType.kExternalWrite); Blob orig_blob = bkt_.get(blob_id); - Map old_val = blobToMap(orig_blob); - for (Map.Entry entry : val.entrySet()) { - old_val.put(entry.getKey(), entry.getValue()); - } - Blob new_blob = mapToBlob(old_val); + Map old_val = blobDeserialize(orig_blob); + old_val.putAll(val); + Blob new_blob = blobSerialize(old_val); bkt_.put(key, new_blob); bkt_.unlockBlob(blob_id, MdLockType.kExternalWrite); new_blob.close(); @@ -94,16 +121,29 @@ public void update(String key, Map val) { * @param field_set the field in the record to update * @return The blob containing only the field's data * */ - public Map read(String key, Set field_set) { + public Map read(String key, Set field_set) throws IOException, ClassNotFoundException { + /*HashMap map = new HashMap(); + if (field_set.isEmpty()) { + UniqueId md_id = bkt_.getBlobId(getKvMetadataKey()); + Blob md_blob = bkt_.get(md_id); + field_set = (HashSet)blobDeserialize(md_blob); + } + for (String field_name : field_set) { + UniqueId blob_id = bkt_.getBlobId(getFieldKey(key, field_name)); + Blob blob = bkt_.get(blob_id); + map.put(field_name, blobDeserialize(blob)); + } + return map;*/ + UniqueId blob_id = bkt_.getBlobId(key); bkt_.lockBlob(blob_id, MdLockType.kExternalRead); Blob orig_blob = bkt_.get(blob_id); - Map old_val = blobToMap(orig_blob); + Map old_val = blobDeserialize(orig_blob); bkt_.unlockBlob(blob_id, MdLockType.kExternalRead); return old_val; } - public Map read(String key) { + public Map read(String key) throws IOException, ClassNotFoundException { return read(key, new HashSet()); } diff --git a/adapter/kvstore/java/src/test/java/KvstoreJniTest.java b/adapter/kvstore/java/src/test/java/KvstoreJniTest.java index 69c3561ac..12168bf67 100644 --- a/adapter/kvstore/java/src/test/java/KvstoreJniTest.java +++ b/adapter/kvstore/java/src/test/java/KvstoreJniTest.java @@ -2,29 +2,33 @@ import static org.junit.Assert.*; import java.nio.*; import java.util.*; -import kvstore.java.KVStore; -import kvstore.java.KVTable; +import hermes_kvstore.java.KVStore; +import hermes_kvstore.java.KVTable; import java.lang.management.ManagementFactory; public class KvstoreJniTest { @Test - public void testKvPutGet() { + public void testKvPutGet() throws Exception { String pid = ManagementFactory.getRuntimeMXBean().getName(); System.out.println(pid); KVStore.connect(); KVTable table = KVStore.getTable("hello");/**/ HashMap record = new HashMap(); - record.put("f0", "abcde"); - record.put("f1", "12345"); - record.put("f2", "ABCDE"); - table.update("0", record); - table.update("0", record); - Map read_record = table.read("0"); - - for (Map.Entry entry : read_record.entrySet()) { - assertTrue(entry.getValue().equals(record.get(entry.getKey()))); + try { + record.put("f0", "abcde"); + record.put("f1", "12345"); + record.put("f2", "ABCDE"); + table.update("0", record); + table.update("0", record); + Map read_record = table.read("0"); + for (Map.Entry entry : read_record.entrySet()) { + assertTrue(entry.getValue().equals(record.get(entry.getKey()))); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; } } } diff --git a/test/data/hermes_server.yaml b/test/data/hermes_server.yaml index 092a1a0dd..348ce1e30 100644 --- a/test/data/hermes_server.yaml +++ b/test/data/hermes_server.yaml @@ -12,7 +12,7 @@ devices: # The maximum buffering capacity in MiB of each device. Here we say that all 4 # devices get 50 MiB of buffering capacity. - capacity: 50MB + capacity: 1000MB # The size of the smallest available buffer in KiB. In general this should be # the page size of your system for byte addressable storage, and the block size diff --git a/wrapper/java/settings.gradle b/wrapper/java/settings.gradle index 4427f7cd5..4444894ae 100644 --- a/wrapper/java/settings.gradle +++ b/wrapper/java/settings.gradle @@ -15,4 +15,4 @@ include 'api' include 'services:webservice' */ -rootProject.name = 'hermes' +rootProject.name = 'hermes-1.0.0'