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");