You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2012/02/10 22:14:58 UTC
svn commit: r1242926 - in
/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk:
model/ store/
Author: stefan
Date: Fri Feb 10 21:14:57 2012
New Revision: 1242926
URL: http://svn.apache.org/viewvc?rev=1242926&view=rev
Log:
binary serialization of child node ids
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesMap.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BinaryBinding.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java Fri Feb 10 21:14:57 2012
@@ -210,12 +210,21 @@ public abstract class AbstractNode imple
}
public void serialize(Binding binding) throws Exception {
- binding.write(":props", properties.size(),
- new AbstractRangeIterator<Binding.KeyValuePair>(properties.keySet().iterator(), 0, -1) {
+ final Iterator<Map.Entry<String, String>> iter = properties.entrySet().iterator();
+ binding.writeMap(":props", properties.size(),
+ new Binding.StringEntryIterator() {
@Override
- protected Binding.KeyValuePair doNext() {
- String key = (String) it.next();
- return new Binding.KeyValuePair(key, properties.get(key));
+ public boolean hasNext() {
+ return iter.hasNext();
+ }
+ @Override
+ public Binding.StringEntry next() {
+ Map.Entry<String, String> entry = iter.next();
+ return new Binding.StringEntry(entry.getKey(), entry.getValue());
+ }
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
}
});
binding.write(":inlined", childEntries.inlined() ? 1 : 0);
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesMap.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesMap.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesMap.java Fri Feb 10 21:14:57 2012
@@ -17,11 +17,10 @@
package org.apache.jackrabbit.mk.model;
import org.apache.jackrabbit.mk.store.Binding;
-import org.apache.jackrabbit.mk.store.RevisionProvider;
import org.apache.jackrabbit.mk.util.AbstractFilteringIterator;
-import org.apache.jackrabbit.mk.util.AbstractRangeIterator;
import org.apache.jackrabbit.mk.util.EmptyIterator;
import org.apache.jackrabbit.mk.util.RangeIterator;
+import org.apache.jackrabbit.mk.util.StringUtils;
import java.util.HashMap;
import java.util.Iterator;
@@ -271,12 +270,21 @@ public class ChildNodeEntriesMap impleme
@Override
public void serialize(Binding binding) throws Exception {
binding.write(":ordered", insertionOrdered ? 1 : 0);
- binding.write(":children", getCount(),
- new AbstractRangeIterator<Binding.KeyValuePair>(getEntries(0, -1), 0, -1) {
+ final Iterator<ChildNodeEntry> iter = getEntries(0, -1);
+ binding.writeMap(":children", getCount(),
+ new Binding.BytesEntryIterator() {
@Override
- protected Binding.KeyValuePair doNext() {
- ChildNodeEntry cne = (ChildNodeEntry) it.next();
- return new Binding.KeyValuePair(cne.getName(), cne.getId());
+ public boolean hasNext() {
+ return iter.hasNext();
+ }
+ @Override
+ public Binding.BytesEntry next() {
+ ChildNodeEntry cne = iter.next();
+ return new Binding.BytesEntry(cne.getName(), StringUtils.convertHexToBytes(cne.getId()));
+ }
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
}
});
}
@@ -284,10 +292,10 @@ public class ChildNodeEntriesMap impleme
public static ChildNodeEntriesMap deserialize(Binding binding) throws Exception {
boolean insertionOrdered = binding.readIntValue(":ordered") == 0 ? false : true;
ChildNodeEntriesMap newInstance = new ChildNodeEntriesMap(insertionOrdered);
- Iterator<Binding.KeyValuePair> iter = binding.read(":children");
+ Binding.BytesEntryIterator iter = binding.readBytesMap(":children");
while (iter.hasNext()) {
- Binding.KeyValuePair kvp = iter.next();
- newInstance.add(new ChildNodeEntry(kvp.getKey(), kvp.getValue()));
+ Binding.BytesEntry entry = iter.next();
+ newInstance.add(new ChildNodeEntry(entry.getKey(), StringUtils.convertBytesToHex(entry.getValue())));
}
return newInstance;
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java Fri Feb 10 21:14:57 2012
@@ -552,16 +552,16 @@ public class ChildNodeEntriesTree implem
public void serialize(Binding binding) throws Exception {
binding.write(":count", count);
- binding.write(":index", index.length, new Iterator<Binding.KeyValuePair>() {
+ binding.writeMap(":index", index.length, new Binding.StringEntryIterator() {
int pos = -1;
-
+
@Override
public boolean hasNext() {
return pos < index.length - 1;
}
@Override
- public Binding.KeyValuePair next() {
+ public Binding.StringEntry next() {
pos++;
if (pos >= index.length) {
throw new NoSuchElementException();
@@ -570,15 +570,15 @@ public class ChildNodeEntriesTree implem
IndexEntry entry = index[pos];
if (entry == null) {
// null entry: ""
- return new Binding.KeyValuePair(Integer.toString(pos), "");
+ return new Binding.StringEntry(Integer.toString(pos), "");
} else if (entry instanceof NodeInfo) {
NodeInfo ni = (NodeInfo) entry;
// "n<id>:<name>"
- return new Binding.KeyValuePair(Integer.toString(pos), "n" + ni.getId() + ":" + ni.getName());
+ return new Binding.StringEntry(Integer.toString(pos), "n" + ni.getId() + ":" + ni.getName());
} else {
BucketInfo bi = (BucketInfo) entry;
// "b<id>:<count>"
- return new Binding.KeyValuePair(Integer.toString(pos), "b" + bi.getId() + ":" + bi.getSize());
+ return new Binding.StringEntry(Integer.toString(pos), "b" + bi.getId() + ":" + bi.getSize());
}
}
@@ -592,26 +592,26 @@ public class ChildNodeEntriesTree implem
static ChildNodeEntriesTree deserialize(RevisionProvider provider, Binding binding) throws Exception {
ChildNodeEntriesTree newInstance = new ChildNodeEntriesTree(provider);
newInstance.count = binding.readIntValue(":count");
- Iterator<Binding.KeyValuePair> iter = binding.read(":index");
+ Binding.StringEntryIterator iter = binding.readStringMap(":index");
int pos = -1;
while (iter.hasNext()) {
- Binding.KeyValuePair kvp = iter.next();
+ Binding.StringEntry entry = iter.next();
++pos;
// deserialize index array entry
- assert(pos == Integer.parseInt(kvp.getKey()));
- if (kvp.getValue().length() == 0) {
+ assert(pos == Integer.parseInt(entry.getKey()));
+ if (entry.getValue().length() == 0) {
// ""
newInstance.index[pos] = null;
- } else if (kvp.getValue().charAt(0) == 'n') {
+ } else if (entry.getValue().charAt(0) == 'n') {
// "n<id>:<name>"
- String value = kvp.getValue().substring(1);
+ String value = entry.getValue().substring(1);
int i = value.indexOf(':');
String id = value.substring(0, i);
String name = value.substring(i + 1);
newInstance.index[pos] = new NodeInfo(name, id);
} else {
// "b<id>:<count>"
- String value = kvp.getValue().substring(1);
+ String value = entry.getValue().substring(1);
int i = value.indexOf(':');
String id = value.substring(0, i);
int count = Integer.parseInt(value.substring(i + 1));
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java Fri Feb 10 21:14:57 2012
@@ -34,10 +34,10 @@ public class StoredNode extends Abstract
public static StoredNode deserialize(String id, RevisionProvider provider, Binding binding) throws Exception {
StoredNode newInstance = new StoredNode(id, provider);
- Iterator<Binding.KeyValuePair> iter = binding.read(":props");
+ Binding.StringEntryIterator iter = binding.readStringMap(":props");
while (iter.hasNext()) {
- Binding.KeyValuePair kvp = iter.next();
- newInstance.properties.put(kvp.getKey(), kvp.getValue());
+ Binding.StringEntry entry = iter.next();
+ newInstance.properties.put(entry.getKey(), entry.getValue());
}
boolean inlined = binding.readIntValue(":inlined") != 0;
if (inlined) {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BinaryBinding.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BinaryBinding.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BinaryBinding.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BinaryBinding.java Fri Feb 10 21:14:57 2012
@@ -76,15 +76,28 @@ public class BinaryBinding implements Bi
}
@Override
- public void write(String key, int count, Iterator<KeyValuePair> iterator) throws Exception {
+ public void writeMap(String key, int count, StringEntryIterator iterator) throws Exception {
if (out == null) {
throw new IllegalStateException("no OutputStream provided");
}
IOUtils.writeVarInt(out, count);
while (iterator.hasNext()) {
- KeyValuePair kvp = iterator.next();
- IOUtils.writeString(out, kvp.getKey());
- IOUtils.writeString(out, kvp.getValue());
+ StringEntry entry = iterator.next();
+ IOUtils.writeString(out, entry.getKey());
+ IOUtils.writeString(out, entry.getValue());
+ }
+ }
+
+ @Override
+ public void writeMap(String key, int count, BytesEntryIterator iterator) throws Exception {
+ if (out == null) {
+ throw new IllegalStateException("no OutputStream provided");
+ }
+ IOUtils.writeVarInt(out, count);
+ while (iterator.hasNext()) {
+ BytesEntry entry = iterator.next();
+ IOUtils.writeString(out, entry.getKey());
+ IOUtils.writeBytes(out, entry.getValue());
}
}
@@ -121,24 +134,24 @@ public class BinaryBinding implements Bi
}
@Override
- public Iterator<KeyValuePair> read(String key) throws Exception {
+ public StringEntryIterator readStringMap(String key) throws Exception {
if (in == null) {
throw new IllegalStateException("no InputStream provided");
}
final int size = IOUtils.readVarInt(in);
- return new Iterator<KeyValuePair>() {
+ return new StringEntryIterator() {
int count = size;
public boolean hasNext() {
return count > 0;
}
- public KeyValuePair next() {
+ public StringEntry next() {
if (count-- > 0) {
try {
String key = IOUtils.readString(in);
String value = IOUtils.readString(in);
- return new KeyValuePair(key, value);
+ return new StringEntry(key, value);
} catch (IOException e) {
throw new RuntimeException("deserialization failed", e);
}
@@ -151,4 +164,36 @@ public class BinaryBinding implements Bi
}
};
}
+
+ @Override
+ public BytesEntryIterator readBytesMap(String key) throws Exception {
+ if (in == null) {
+ throw new IllegalStateException("no InputStream provided");
+ }
+ final int size = IOUtils.readVarInt(in);
+ return new BytesEntryIterator() {
+ int count = size;
+
+ public boolean hasNext() {
+ return count > 0;
+ }
+
+ public BytesEntry next() {
+ if (count-- > 0) {
+ try {
+ String key = IOUtils.readString(in);
+ byte[] value = IOUtils.readBytes(in);
+ return new BytesEntry(key, value);
+ } catch (IOException e) {
+ throw new RuntimeException("deserialization failed", e);
+ }
+ }
+ throw new NoSuchElementException();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java Fri Feb 10 21:14:57 2012
@@ -27,19 +27,21 @@ public interface Binding {
void write(String key, byte[] value) throws Exception;
void write(String key, long value) throws Exception;
void write(String key, int value) throws Exception;
- void write(String key, int count, Iterator<KeyValuePair> iterator) throws Exception;
-
+ void writeMap(String key, int count, StringEntryIterator iterator) throws Exception;
+ void writeMap(String key, int count, BytesEntryIterator iterator) throws Exception;
+
String readStringValue(String key) throws Exception;
byte[] readBytesValue(String key) throws Exception;
long readLongValue(String key) throws Exception;
int readIntValue(String key) throws Exception;
- Iterator<KeyValuePair> read(String key) throws Exception;
-
- static class KeyValuePair {
+ StringEntryIterator readStringMap(String key) throws Exception;
+ BytesEntryIterator readBytesMap(String key) throws Exception;
+
+ static abstract class Entry<V> {
String key;
- String value;
-
- public KeyValuePair(String key, String value) {
+ V value;
+
+ public Entry(String key, V value) {
this.key = key;
this.value = value;
}
@@ -48,8 +50,36 @@ public interface Binding {
return key;
}
+ public V getValue() {
+ return value;
+ }
+ }
+
+ static class StringEntry extends Entry<String> {
+
+ public StringEntry(String key, String value) {
+ super(key, value);
+ }
+
public String getValue() {
return value;
}
}
+
+ static class BytesEntry extends Entry<byte[]> {
+
+ public BytesEntry(String key, byte[] value) {
+ super(key, value);
+ }
+
+ public byte[] getValue() {
+ return value;
+ }
+ }
+
+ static interface StringEntryIterator extends Iterator<StringEntry> {
+ }
+
+ static interface BytesEntryIterator extends Iterator<BytesEntry> {
+ }
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java?rev=1242926&r1=1242925&r2=1242926&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java Fri Feb 10 21:14:57 2012
@@ -380,11 +380,21 @@ public class MongoPersistenceManager ext
}
@Override
- public void write(String key, int count, Iterator<KeyValuePair> iterator) throws Exception {
+ public void writeMap(String key, int count, StringEntryIterator iterator) throws Exception {
BasicDBObject childObj = new BasicDBObject();
while (iterator.hasNext()) {
- KeyValuePair kvp = iterator.next();
- childObj.append(encodeName(kvp.getKey()), kvp.getValue());
+ StringEntry entry = iterator.next();
+ childObj.append(encodeName(entry.getKey()), entry.getValue());
+ }
+ obj.append(encodeName(key), childObj);
+ }
+
+ @Override
+ public void writeMap(String key, int count, BytesEntryIterator iterator) throws Exception {
+ BasicDBObject childObj = new BasicDBObject();
+ while (iterator.hasNext()) {
+ BytesEntry entry = iterator.next();
+ childObj.append(encodeName(entry.getKey()), StringUtils.convertBytesToHex(entry.getValue()));
}
obj.append(encodeName(key), childObj);
}
@@ -410,19 +420,19 @@ public class MongoPersistenceManager ext
}
@Override
- public Iterator<KeyValuePair> read(String key) throws Exception {
+ public StringEntryIterator readStringMap(String key) throws Exception {
final BasicDBObject childObj = (BasicDBObject) obj.get(encodeName(key));
final Iterator<String> it = childObj.keySet().iterator();
- return new Iterator<KeyValuePair>() {
+ return new StringEntryIterator() {
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
- public KeyValuePair next() {
+ public StringEntry next() {
String key = it.next();
- return new KeyValuePair(decodeName(key), childObj.getString(key));
+ return new StringEntry(decodeName(key), childObj.getString(key));
}
@Override
@@ -431,6 +441,30 @@ public class MongoPersistenceManager ext
}
};
}
- }
+ @Override
+ public BytesEntryIterator readBytesMap(String key) throws Exception {
+ final BasicDBObject childObj = (BasicDBObject) obj.get(encodeName(key));
+ final Iterator<String> it = childObj.keySet().iterator();
+ return new BytesEntryIterator() {
+ @Override
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+
+ @Override
+ public BytesEntry next() {
+ String key = it.next();
+ return new BytesEntry(
+ decodeName(key),
+ StringUtils.convertHexToBytes(childObj.getString(key)));
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ }
}