Author: jukka
Date: Fri Oct 18 19:38:08 2013
New Revision: 1533607

URL: http://svn.apache.org/r1533607
Log:
OAK-987: Implement the MicroKernel API

MicroKernel.write() requires two identical streams to have identical identifiers
Initial support for serializing multi-valued properties.

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java?rev=1533607&r1=1533606&r2=1533607&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java
 Fri Oct 18 19:38:08 2013
@@ -27,6 +27,8 @@ import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.zip.CheckedInputStream;
+import java.util.zip.Checksum;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.mk.api.MicroKernelException;
@@ -45,6 +47,8 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
 import com.google.common.io.ByteStreams;
 
 /**
@@ -351,8 +355,19 @@ public class NodeStoreKernel implements 
             json.key(property.getName());
             Type<?> type = property.getType();
             if (type.isArray()) {
+                type = type.getBaseType();
                 json.array();
-                // FIXME
+                for (int i = 0; i < property.size(); i++) {
+                    if (type == Type.BOOLEAN) {
+                        json.value(property.getValue(Type.BOOLEAN, 
i).booleanValue());
+                    } else if (type == Type.LONG) {
+                        json.value(property.getValue(Type.LONG, 
i).longValue());
+                    } else if (type == Type.DOUBLE) {
+                        json.encodedValue(property.getValue(Type.DOUBLE, 
i).toString());
+                    } else {
+                        json.value(property.getValue(Type.STRING, i));
+                    }
+                }
                 json.endArray();
             } else if (type == Type.BOOLEAN) {
                 json.value(property.getValue(Type.BOOLEAN).booleanValue());
@@ -505,9 +520,29 @@ public class NodeStoreKernel implements 
     @Override
     public String write(InputStream in) throws MicroKernelException {
         try {
-            String uuid = UUID.randomUUID().toString();
-            blobs.put(uuid, store.createBlob(in));
-            return uuid;
+            final Hasher hasher = Hashing.sha256().newHasher();
+            Blob blob = store.createBlob(new CheckedInputStream(in, new 
Checksum() {
+                @Override
+                public void update(byte[] b, int off, int len) {
+                    hasher.putBytes(b, off, len);
+                }
+                @Override
+                public void update(int b) {
+                    hasher.putByte((byte) b);
+                }
+                @Override
+                public void reset() {
+                    throw new UnsupportedOperationException();
+                }
+                @Override
+                public long getValue() {
+                    throw new UnsupportedOperationException();
+                }
+            }));
+
+            String id = hasher.hash().toString();
+            blobs.put(id, blob);
+            return id;
         } catch (IOException e) {
             throw new MicroKernelException("Failed to create a blob", e);
         }


Reply via email to