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