You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2013/05/13 18:47:30 UTC
svn commit: r1481964 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
data/ data/db/ value/
Author: jukka
Date: Mon May 13 16:47:30 2013
New Revision: 1481964
URL: http://svn.apache.org/r1481964
Log:
JCR-3534: Efficient copying of binaries across repositories with the same data store
Move the getReference() method from DataIdentifier to DataRecord to make identifier handling easier
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataRecord.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataIdentifier.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataRecord.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataRecord.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataRecord.java Mon May 13 16:47:30 2013
@@ -26,6 +26,11 @@ package org.apache.jackrabbit.core.data;
public abstract class AbstractDataRecord implements DataRecord {
/**
+ * The data store that contains this record.
+ */
+ private final AbstractDataStore store;
+
+ /**
* The binary identifier;
*/
private final DataIdentifier identifier;
@@ -35,7 +40,9 @@ public abstract class AbstractDataRecord
*
* @param identifier data identifier
*/
- public AbstractDataRecord(DataIdentifier identifier) {
+ public AbstractDataRecord(
+ AbstractDataStore store, DataIdentifier identifier) {
+ this.store = store;
this.identifier = identifier;
}
@@ -48,6 +55,10 @@ public abstract class AbstractDataRecord
return identifier;
}
+ public String getReference() {
+ return store.getReferenceFromIdentifier(identifier);
+ }
+
/**
* Returns the string representation of the data identifier.
*
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java Mon May 13 16:47:30 2013
@@ -52,14 +52,12 @@ public abstract class AbstractDataStore
@Override
public DataIdentifier getIdentifierFromReference(String reference) {
- if (secret != null) {
- int colon = reference.indexOf(':');
- if (colon != -1) {
- String identifier = reference.substring(0, colon);
- String signature = reference.substring(colon + 1);
- if (signature.equals(sign(identifier))) {
- return new DataIdentifier(identifier, reference);
- }
+ int colon = reference.indexOf(':');
+ if (colon != -1) {
+ DataIdentifier identifier =
+ new DataIdentifier(reference.substring(0, colon));
+ if (reference.equals(getReferenceFromIdentifier(identifier))) {
+ return identifier;
}
}
return null;
@@ -67,27 +65,21 @@ public abstract class AbstractDataStore
//---------------------------------------------------------< protected >--
- protected DataIdentifier createIdentifier(final String identifier) {
+ protected String getReferenceFromIdentifier(DataIdentifier identifier) {
if (secret != null) {
- return new DataIdentifier(identifier) {
- public String getReference() {
- return identifier + ':' + sign(identifier);
- }
- };
- } else {
- return new DataIdentifier(identifier);
- }
- }
+ try {
+ String id = identifier.toString();
- private String sign(String identifier) {
- try {
- Mac mac = Mac.getInstance(ALGORITHM);
- mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), ALGORITHM));
- return encodeHexString(mac.doFinal(identifier.getBytes("UTF-8")));
- } catch (Exception e) {
- // TODO: log a warning about this exception
- return null;
+ Mac mac = Mac.getInstance(ALGORITHM);
+ mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), ALGORITHM));
+ byte[] hash = mac.doFinal(id.getBytes("UTF-8"));
+
+ return id + ':' + encodeHexString(hash);
+ } catch (Exception e) {
+ // TODO: log a warning about this exception
+ }
}
+ return null;
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataIdentifier.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataIdentifier.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataIdentifier.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataIdentifier.java Mon May 13 16:47:30 2013
@@ -36,48 +36,12 @@ public class DataIdentifier implements S
private final String identifier;
/**
- * Binary reference, or {@code null}.
- */
- private final String reference;
-
- /**
- * Creates a data identifier from the given string.
- *
- * @param identifier data identifier
- * @param reference binary reference, or {@code null}
- */
- public DataIdentifier(String identifier, String reference) {
- this.identifier = identifier;
- this.reference = reference;
- }
-
- /**
* Creates a data identifier from the given string.
*
* @param identifier data identifier
*/
public DataIdentifier(String identifier) {
- this(identifier, null);
- }
-
- /**
- * Creates a data identifier from the hexadecimal string
- * representation of the given bytes.
- *
- * @param identifier data identifier
- */
- public DataIdentifier(byte[] identifier) {
- this(AbstractDataStore.encodeHexString(identifier), null);
- }
-
- /**
- * Returns a secure reference to the identified binary, or {@code null}
- * if no such reference is available.
- *
- * @return binary reference, or {@code null}
- */
- public String getReference() {
- return reference;
+ this.identifier = identifier;
}
//-------------------------------------------------------------< Object >
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataRecord.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataRecord.java Mon May 13 16:47:30 2013
@@ -31,6 +31,14 @@ public interface DataRecord {
DataIdentifier getIdentifier();
/**
+ * Returns a secure reference to this binary, or {@code null} if no such
+ * reference is available.
+ *
+ * @return binary reference, or {@code null}
+ */
+ String getReference();
+
+ /**
* Returns the length of the binary stream in this record.
*
* @return length of the binary stream
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java Mon May 13 16:47:30 2013
@@ -36,8 +36,9 @@ public class FileDataRecord extends Abst
* @param identifier data identifier
* @param file file that contains the binary stream
*/
- public FileDataRecord(DataIdentifier identifier, File file) {
- super(identifier);
+ public FileDataRecord(
+ AbstractDataStore store, DataIdentifier identifier, File file) {
+ super(store, identifier);
assert file.isFile();
this.file = file;
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java Mon May 13 16:47:30 2013
@@ -158,7 +158,7 @@ public class FileDataStore extends Abstr
}
}
usesIdentifier(identifier);
- return new FileDataRecord(identifier, file);
+ return new FileDataRecord(this, identifier, file);
}
}
@@ -209,7 +209,7 @@ public class FileDataStore extends Abstr
output.close();
}
DataIdentifier identifier =
- createIdentifier(encodeHexString(digest.digest()));
+ new DataIdentifier(encodeHexString(digest.digest()));
File file;
synchronized (this) {
@@ -247,7 +247,7 @@ public class FileDataStore extends Abstr
// this will also make sure that
// tempId is not garbage collected until here
inUse.remove(tempId);
- return new FileDataRecord(identifier, file);
+ return new FileDataRecord(this, identifier, file);
} catch (NoSuchAlgorithmException e) {
throw new DataStoreException(DIGEST + " not available", e);
} catch (IOException e) {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java Mon May 13 16:47:30 2013
@@ -40,7 +40,7 @@ public class DbDataRecord extends Abstra
* @param lastModified
*/
public DbDataRecord(DbDataStore store, DataIdentifier identifier, long length, long lastModified) {
- super(identifier);
+ super(store, identifier);
this.store = store;
this.length = length;
this.lastModified = lastModified;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java Mon May 13 16:47:30 2013
@@ -357,7 +357,7 @@ public class DbDataStore extends Abstrac
conHelper.exec(updateDataSQL, wrapper, tempId);
long length = in.getByteCount();
DataIdentifier identifier =
- createIdentifier(encodeHexString(digest.digest()));
+ new DataIdentifier(encodeHexString(digest.digest()));
usesIdentifier(identifier);
String id = identifier.toString();
long newModified;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java?rev=1481964&r1=1481963&r2=1481964&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java Mon May 13 16:47:30 2013
@@ -106,7 +106,12 @@ class BLOBInDataStore extends BLOBFileVa
@Override
public String getReference() {
- return identifier.getReference();
+ try {
+ return getDataRecord().getReference();
+ } catch (DataStoreException e) {
+ log.warn("Unable to access the reference to " + identifier, e);
+ return null;
+ }
}
public String toString() {