You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/09/26 23:46:38 UTC
svn commit: r1526715 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak:
api/Blob.java kernel/JsopDiff.java plugins/memory/AbstractBlob.java
plugins/memory/ArrayBasedBlob.java
Author: jukka
Date: Thu Sep 26 21:46:38 2013
New Revision: 1526715
URL: http://svn.apache.org/r1526715
Log:
OAK-1050: Remove Blob.sha256()
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ArrayBasedBlob.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java?rev=1526715&r1=1526714&r2=1526715&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java Thu Sep 26 21:46:38 2013
@@ -42,10 +42,4 @@ public interface Blob {
*/
long length();
- /**
- * The SHA-256 digest of the underlying stream
- * @return
- */
- byte[] sha256();
-
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java?rev=1526715&r1=1526714&r2=1526715&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java Thu Sep 26 21:46:38 2013
@@ -22,7 +22,6 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.api.Type.STRINGS;
import java.io.IOException;
-import java.util.Arrays;
import javax.jcr.PropertyType;
@@ -77,10 +76,8 @@ public class JsopDiff implements NodeSta
* debugging purposes.
* <p>
* This method does not store binaries but returns them inlined
- * in the format
- * <pre>
- * "Blob{" + Arrays.toString(blob.sha256()) + "}"
- * </pre>.
+ * in the format <code>Blob{...}</code>, where the <code>...</code>
+ * is implementation-dependent - typically the SHA256 hash of the binary.
*
* @param before before node state
* @param after after node state
@@ -98,7 +95,7 @@ public class JsopDiff implements NodeSta
@Override
protected String writeBlob(Blob blob) {
- return "Blob{" + Arrays.toString(blob.sha256()) + '}';
+ return "Blob{" + blob + '}';
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java?rev=1526715&r1=1526714&r2=1526715&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java Thu Sep 26 21:46:38 2013
@@ -22,14 +22,12 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
-import com.google.common.base.Optional;
import com.google.common.hash.HashCode;
-import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
+import com.google.common.io.ByteStreams;
+import com.google.common.io.InputSupplier;
import org.apache.jackrabbit.oak.api.Blob;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Abstract base class for {@link Blob} implementations.
@@ -37,9 +35,32 @@ import org.slf4j.LoggerFactory;
* {@code hashCode} and {@code equals}.
*/
public abstract class AbstractBlob implements Blob {
- private static final Logger log = LoggerFactory.getLogger(AbstractBlob.class);
- private Optional<HashCode> hashCode = Optional.absent();
+ private static HashCode calculateSha256(final Blob blob) {
+ try {
+ return ByteStreams.hash(
+ new InputSupplier<InputStream>() {
+ @Override
+ public InputStream getInput() throws IOException {
+ return blob.getNewStream();
+ }
+ },
+ Hashing.sha256());
+ } catch (IOException e) {
+ throw new RuntimeException(
+ "Failed to calculate the hash code of a stream", e);
+ }
+ }
+
+ private HashCode hashCode = null;
+
+ private synchronized HashCode calculateSha256() {
+ // Blobs are immutable so we can safely cache the hash
+ if (hashCode == null) {
+ hashCode = calculateSha256(this);
+ }
+ return hashCode;
+ }
/**
* This hash code implementation returns the hash code of the underlying stream
@@ -50,39 +71,13 @@ public abstract class AbstractBlob imple
return calculateSha256().asInt();
}
- @Override
- public byte[] sha256() {
+ protected byte[] sha256() {
return calculateSha256().asBytes();
}
- private HashCode calculateSha256() {
- // Blobs are immutable so we can safely cache the hash
- if (!hashCode.isPresent()) {
- InputStream is = getNewStream();
- try {
- try {
- Hasher hasher = Hashing.sha256().newHasher();
- byte[] buf = new byte[0x1000];
- int r;
- while((r = is.read(buf)) != -1) {
- hasher.putBytes(buf, 0, r);
- }
- hashCode = Optional.of(hasher.hash());
- }
- catch (IOException e) {
- log.warn("Error while hashing stream", e);
- }
- }
- finally {
- close(is);
- }
- }
- return hashCode.get();
- }
-
/**
- * To {@code Blob} instances are considered equal iff they have the same SHA-256 hash code
- * are equal.
+ * To {@code Blob} instances are considered equal iff they have the
+ * same SHA-256 hash code are equal.
* @param other
* @return
*/
@@ -90,22 +85,21 @@ public abstract class AbstractBlob imple
public boolean equals(Object other) {
if (other == this) {
return true;
- }
- if (!(other instanceof Blob)) {
+ } else if (other instanceof AbstractBlob) {
+ AbstractBlob that = (AbstractBlob) other;
+ return Arrays.equals(sha256(), that.sha256());
+ } else if (other instanceof Blob) {
+ Blob that = (Blob) other;
+ return Arrays.equals(sha256(), calculateSha256(that).asBytes());
+ } else {
return false;
}
-
- Blob that = (Blob) other;
- return Arrays.equals(sha256(), that.sha256());
}
- private static void close(InputStream s) {
- try {
- s.close();
- }
- catch (IOException e) {
- log.warn("Error while closing stream", e);
- }
+ @Override
+ public String toString() {
+ return calculateSha256().toString();
}
+
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ArrayBasedBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ArrayBasedBlob.java?rev=1526715&r1=1526714&r2=1526715&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ArrayBasedBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ArrayBasedBlob.java Thu Sep 26 21:46:38 2013
@@ -23,8 +23,6 @@ import java.io.InputStream;
import javax.annotation.Nonnull;
-import com.google.common.base.Charsets;
-
/**
* This {@code Blob} implementations is based on an array of bytes.
*/
@@ -35,11 +33,6 @@ public class ArrayBasedBlob extends Abst
this.value = value;
}
- @Override
- public String toString() {
- return new String(value, Charsets.UTF_8);
- }
-
@Nonnull
@Override
public InputStream getNewStream() {