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 re...@apache.org on 2013/12/10 14:14:55 UTC
svn commit: r1549834 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins:
mongomk/ sqlpersistence/
Author: reschke
Date: Tue Dec 10 13:14:55 2013
New Revision: 1549834
URL: http://svn.apache.org/r1549834
Log:
OAK-1251 - move generic MemoryDocumentStore methods into new UpdateUtils class
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Collision.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Collision.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Collision.java?rev=1549834&r1=1549833&r2=1549834&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Collision.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Collision.java Tue Dec 10 13:14:55 2013
@@ -79,7 +79,7 @@ class Collision {
// their commit wins, we have to mark ourRev
NodeDocument newDoc = Collection.NODES.newDocument(store);
document.deepCopy(newDoc);
- MemoryDocumentStore.applyChanges(newDoc, ourOp, context.getRevisionComparator());
+ UpdateUtils.applyChanges(newDoc, ourOp, context.getRevisionComparator());
if (!markCommitRoot(newDoc, ourRev, store)) {
throw new MicroKernelException("Unable to annotate our revision "
+ "with collision marker. Our revision: " + ourRev
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java?rev=1549834&r1=1549833&r2=1549834&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java Tue Dec 10 13:14:55 2013
@@ -20,9 +20,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.locks.Lock;
@@ -33,10 +30,6 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.jackrabbit.mk.api.MicroKernelException;
-import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Operation;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Key;
/**
* Emulates a MongoDB store (possibly consisting of multiple shards and
@@ -185,11 +178,11 @@ public class MemoryDocumentStore impleme
} else {
oldDoc.deepCopy(doc);
}
- if (checkConditions && !checkConditions(doc, update)) {
+ if (checkConditions && ! UpdateUtils.checkConditions(doc, update)) {
return null;
}
// update the document
- applyChanges(doc, update, comparator);
+ UpdateUtils.applyChanges(doc, update, comparator);
doc.seal();
map.put(update.id, doc);
return oldDoc;
@@ -198,98 +191,6 @@ public class MemoryDocumentStore impleme
}
}
- public static boolean checkConditions(Document doc,
- UpdateOp update) {
- for (Map.Entry<Key, Operation> change : update.getChanges().entrySet()) {
- Operation op = change.getValue();
- if (op.type == Operation.Type.CONTAINS_MAP_ENTRY) {
- Key k = change.getKey();
- Revision r = k.getRevision();
- if (r == null) {
- throw new IllegalStateException(
- "CONTAINS_MAP_ENTRY must not contain null revision");
- }
- Object value = doc.get(k.getName());
- if (value == null) {
- if (Boolean.TRUE.equals(op.value)) {
- return false;
- }
- } else {
- if (value instanceof Map) {
- Map<?, ?> map = (Map<?, ?>) value;
- if (Boolean.TRUE.equals(op.value)) {
- if (!map.containsKey(r)) {
- return false;
- }
- } else {
- if (map.containsKey(r)) {
- return false;
- }
- }
- } else {
- return false;
- }
- }
- }
- }
- return true;
- }
-
-
- /**
- * Apply the changes to the in-memory document.
- *
- * @param doc the target document.
- * @param update the changes to apply.
- * @param comparator the revision comparator.
- */
- public static void applyChanges(@Nonnull Document doc,
- @Nonnull UpdateOp update,
- @Nonnull Comparator<Revision> comparator) {
- for (Entry<Key, Operation> e : checkNotNull(update).getChanges().entrySet()) {
- Key k = e.getKey();
- Operation op = e.getValue();
- switch (op.type) {
- case SET: {
- doc.put(k.toString(), op.value);
- break;
- }
- case INCREMENT: {
- Object old = doc.get(k.toString());
- Long x = (Long) op.value;
- if (old == null) {
- old = 0L;
- }
- doc.put(k.toString(), ((Long) old) + x);
- break;
- }
- case SET_MAP_ENTRY: {
- Object old = doc.get(k.getName());
- @SuppressWarnings("unchecked")
- Map<Revision, Object> m = (Map<Revision, Object>) old;
- if (m == null) {
- m = new TreeMap<Revision, Object>(comparator);
- doc.put(k.getName(), m);
- }
- m.put(k.getRevision(), op.value);
- break;
- }
- case REMOVE_MAP_ENTRY: {
- Object old = doc.get(k.getName());
- @SuppressWarnings("unchecked")
- Map<Revision, Object> m = (Map<Revision, Object>) old;
- if (m != null) {
- m.remove(k.getRevision());
- }
- break;
- }
- case CONTAINS_MAP_ENTRY:
- // no effect
- break;
- }
- }
- }
-
@Override
public <T extends Document> boolean create(Collection<T> collection,
List<UpdateOp> updateOps) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java?rev=1549834&r1=1549833&r2=1549834&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java Tue Dec 10 13:14:55 2013
@@ -406,7 +406,7 @@ public class MongoDocumentStore implemen
UpdateOp update = updateOps.get(i);
update.increment(Document.MOD_COUNT, 1);
T target = collection.newDocument(this);
- MemoryDocumentStore.applyChanges(target, update, comparator);
+ UpdateUtils.applyChanges(target, update, comparator);
docs.add(target);
for (Entry<Key, Operation> entry : update.getChanges().entrySet()) {
Key k = entry.getKey();
@@ -613,7 +613,7 @@ public class MongoDocumentStore implemen
oldDoc.seal();
}
String key = updateOp.getId();
- MemoryDocumentStore.applyChanges(newDoc, updateOp, comparator);
+ UpdateUtils.applyChanges(newDoc, updateOp, comparator);
newDoc.seal();
NodeDocument cached = addToCache(newDoc);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java?rev=1549834&r1=1549833&r2=1549834&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java Tue Dec 10 13:14:55 2013
@@ -713,8 +713,7 @@ public class NodeDocument extends Docume
}
// check size of old document
NodeDocument oldDoc = new NodeDocument(store);
- MemoryDocumentStore.applyChanges(oldDoc, old,
- context.getRevisionComparator());
+ UpdateUtils.applyChanges(oldDoc, old, context.getRevisionComparator());
// only split if half of the data can be moved to old document
if (oldDoc.getMemory() > getMemory() * SPLIT_RATIO) {
splitOps.add(old);
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java?rev=1549834&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java Tue Dec 10 13:14:55 2013
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.mongomk;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Key;
+import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Operation;
+
+/**
+ * Provides convenience methods for applying {@link UpdateOp}s to
+ * {@link Document}s.
+ */
+public class UpdateUtils {
+
+ /**
+ * Apply the changes to the in-memory document.
+ *
+ * @param doc
+ * the target document.
+ * @param update
+ * the changes to apply.
+ * @param comparator
+ * the revision comparator.
+ */
+ public static void applyChanges(@Nonnull Document doc, @Nonnull UpdateOp update, @Nonnull Comparator<Revision> comparator) {
+ for (Entry<Key, Operation> e : checkNotNull(update).getChanges().entrySet()) {
+ Key k = e.getKey();
+ Operation op = e.getValue();
+ switch (op.type) {
+ case SET: {
+ doc.put(k.toString(), op.value);
+ break;
+ }
+ case INCREMENT: {
+ Object old = doc.get(k.toString());
+ Long x = (Long) op.value;
+ if (old == null) {
+ old = 0L;
+ }
+ doc.put(k.toString(), ((Long) old) + x);
+ break;
+ }
+ case SET_MAP_ENTRY: {
+ Object old = doc.get(k.getName());
+ @SuppressWarnings("unchecked")
+ Map<Revision, Object> m = (Map<Revision, Object>) old;
+ if (m == null) {
+ m = new TreeMap<Revision, Object>(comparator);
+ doc.put(k.getName(), m);
+ }
+ m.put(k.getRevision(), op.value);
+ break;
+ }
+ case REMOVE_MAP_ENTRY: {
+ Object old = doc.get(k.getName());
+ @SuppressWarnings("unchecked")
+ Map<Revision, Object> m = (Map<Revision, Object>) old;
+ if (m != null) {
+ m.remove(k.getRevision());
+ }
+ break;
+ }
+ case CONTAINS_MAP_ENTRY:
+ // no effect
+ break;
+ }
+ }
+ }
+
+ public static boolean checkConditions(@Nonnull Document doc, @Nonnull UpdateOp update) {
+ for (Map.Entry<Key, Operation> change : update.getChanges().entrySet()) {
+ Operation op = change.getValue();
+ if (op.type == Operation.Type.CONTAINS_MAP_ENTRY) {
+ Key k = change.getKey();
+ Revision r = k.getRevision();
+ if (r == null) {
+ throw new IllegalStateException("CONTAINS_MAP_ENTRY must not contain null revision");
+ }
+ Object value = doc.get(k.getName());
+ if (value == null) {
+ if (Boolean.TRUE.equals(op.value)) {
+ return false;
+ }
+ } else {
+ if (value instanceof Map) {
+ Map<?, ?> map = (Map<?, ?>) value;
+ if (Boolean.TRUE.equals(op.value)) {
+ if (!map.containsKey(r)) {
+ return false;
+ }
+ } else {
+ if (map.containsKey(r)) {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UpdateUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java?rev=1549834&r1=1549833&r2=1549834&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java Tue Dec 10 13:14:55 2013
@@ -39,10 +39,10 @@ import org.apache.jackrabbit.mk.api.Micr
import org.apache.jackrabbit.oak.plugins.mongomk.Collection;
import org.apache.jackrabbit.oak.plugins.mongomk.Document;
import org.apache.jackrabbit.oak.plugins.mongomk.DocumentStore;
-import org.apache.jackrabbit.oak.plugins.mongomk.MemoryDocumentStore;
import org.apache.jackrabbit.oak.plugins.mongomk.Revision;
import org.apache.jackrabbit.oak.plugins.mongomk.StableRevisionComparator;
import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.mongomk.UpdateUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
@@ -180,7 +180,7 @@ public class SQLDocumentStore implements
for (UpdateOp update : updates) {
T doc = collection.newDocument(this);
update.increment("_modCount", 1);
- MemoryDocumentStore.applyChanges(doc, update, comparator);
+ UpdateUtils.applyChanges(doc, update, comparator);
writeDocument(collection, doc, null, true);
}
// FIXME to be atomic
@@ -202,11 +202,11 @@ public class SQLDocumentStore implements
} else {
oldDoc.deepCopy(doc);
}
- if (checkConditions && !MemoryDocumentStore.checkConditions(doc, update)) {
+ if (checkConditions && !UpdateUtils.checkConditions(doc, update)) {
return null;
}
update.increment("_modCount", 1);
- MemoryDocumentStore.applyChanges(doc, update, comparator);
+ UpdateUtils.applyChanges(doc, update, comparator);
writeDocument(collection, doc, oldDoc != null ? (Long) oldDoc.get("_modCount") : null, oldDoc == null);
doc.seal();
@@ -225,7 +225,7 @@ public class SQLDocumentStore implements
T doc = fromString(collection, in);
Long oldmodcount = (Long) doc.get("_modCount");
update.increment("_modCount", 1);
- MemoryDocumentStore.applyChanges(doc, update, comparator);
+ UpdateUtils.applyChanges(doc, update, comparator);
String data = asString(doc);
Long modified = (Long) doc.get("_modified");
Long modcount = (Long) doc.get("_modCount");