Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/BlobStoreMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/BlobStoreMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/BlobStoreMongo.java (working copy) @@ -1,56 +0,0 @@ -/* - * 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.mongomk; - -import java.io.InputStream; - -import org.apache.jackrabbit.mongomk.api.BlobStore; -import org.apache.jackrabbit.mongomk.api.command.Command; -import org.apache.jackrabbit.mongomk.api.command.CommandExecutor; -import org.apache.jackrabbit.mongomk.command.GetBlobLengthCommandMongo; -import org.apache.jackrabbit.mongomk.command.ReadBlobCommandMongo; -import org.apache.jackrabbit.mongomk.command.WriteBlobCommandMongo; -import org.apache.jackrabbit.mongomk.impl.command.CommandExecutorImpl; - -public class BlobStoreMongo implements BlobStore { - - private final MongoConnection mongoConnection; - private final CommandExecutor commandExecutor; - - public BlobStoreMongo(MongoConnection mongoConnection) { - this.mongoConnection = mongoConnection; - this.commandExecutor = new CommandExecutorImpl(); - } - - @Override - public long getBlobLength(String blobId) throws Exception { - Command command = new GetBlobLengthCommandMongo(mongoConnection, blobId); - return commandExecutor.execute(command); - } - - @Override - public int readBlob(String blobId, long blobOffset, byte[] buffer, int bufferOffset, int length) throws Exception { - Command command = new ReadBlobCommandMongo(mongoConnection, blobId, blobOffset, buffer, bufferOffset, length); - return commandExecutor.execute(command); - } - - @Override - public String writeBlob(InputStream is) throws Exception { - Command command = new WriteBlobCommandMongo(mongoConnection, is); - return commandExecutor.execute(command); - } -} Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoConnection.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoConnection.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoConnection.java (working copy) @@ -1,107 +0,0 @@ -/* - * 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.mongomk; - -import org.apache.jackrabbit.mongomk.model.CommitMongo; -import org.apache.jackrabbit.mongomk.model.HeadMongo; -import org.apache.jackrabbit.mongomk.model.NodeMongo; - -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.Mongo; -import com.mongodb.gridfs.GridFS; - -/** - * The {@code MongoConnection} contains connection properties for the {@code MongoDB}. - * - * @author l = new ArrayList(); - t.read('['); - do { - l.add(t.readString()); - } while (t.matches(',')); - t.read(']'); - return l.toArray(new String[l.size()]); - } - - NameFilter getChildNodeFilter() { - return nodeFilter; - } - - NameFilter getPropertyFilter() { - return propFilter; - } - - boolean includeNode(String name) { - return nodeFilter == null || nodeFilter.matches(name); - } - - public boolean includeProperty(String name) { - return propFilter == null || propFilter.matches(name); - } -} \ No newline at end of file Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/NodeStoreMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/NodeStoreMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/NodeStoreMongo.java (working copy) @@ -1,206 +0,0 @@ -/* - * 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.mongomk; - -import java.util.List; - -import org.apache.jackrabbit.mk.json.JsopBuilder; -import org.apache.jackrabbit.mongomk.api.NodeStore; -import org.apache.jackrabbit.mongomk.api.command.Command; -import org.apache.jackrabbit.mongomk.api.command.CommandExecutor; -import org.apache.jackrabbit.mongomk.api.model.Commit; -import org.apache.jackrabbit.mongomk.api.model.Node; -import org.apache.jackrabbit.mongomk.command.CommitCommandMongo; -import org.apache.jackrabbit.mongomk.command.GetHeadRevisionCommandMongo; -import org.apache.jackrabbit.mongomk.command.GetNodesCommandMongo; -import org.apache.jackrabbit.mongomk.command.NodeExistsCommandMongo; -import org.apache.jackrabbit.mongomk.impl.command.CommandExecutorImpl; -import org.apache.jackrabbit.mongomk.model.CommitMongo; -import org.apache.jackrabbit.mongomk.model.HeadMongo; -import org.apache.jackrabbit.mongomk.query.FetchValidCommitsQuery; -import org.apache.jackrabbit.mongomk.util.MongoUtil; - -import com.mongodb.DBCollection; - -/** - * Implementation of {@link NodeStore} for the {@code MongoDB}. - * - * @author commits = new FetchValidCommitsQuery(mongoConnection, - fromRevisionId, toRevisionId).execute(); - - CommitMongo toCommit = getCommit(commits, toRevisionId); - - CommitMongo fromCommit; - if (toRevisionId.equals(fromRevisionId)) { - fromCommit = toCommit; - } else { - fromCommit = getCommit(commits, fromRevisionId); - if (fromCommit == null || (fromCommit.getTimestamp() > toCommit.getTimestamp())) { - // negative range, return empty journal - return "[]"; - } - } - - JsopBuilder commitBuff = new JsopBuilder().array(); - // iterate over commits in chronological order, - // starting with oldest commit - for (int i = commits.size() - 1; i >= 0; i--) { - CommitMongo commit = commits.get(i); - //if (commit.getParentId() == null) { - // continue; - //} - String diff = commit.getDiff(); - // FIXME Check that filter really works. - if (!filtered || commit.getAffectedPaths().contains(path)) { - commitBuff.object() - .key("id").value(String.valueOf(commit.getRevisionId())) - .key("ts").value(commit.getTimestamp()) - .key("msg").value(commit.getMessage()) - .key("changes").value(diff).endObject(); - } - } - return commitBuff.endArray().toString(); - } - - private CommitMongo getCommit(List commits, String toRevisionId) { - for (CommitMongo commit : commits) { - if (String.valueOf(commit.getRevisionId()).equals(toRevisionId)) { - return commit; - } - } - return null; - } - - @Override - public String getRevisionHistory(long since, int maxEntries, String path) { - path = (path == null || "".equals(path)) ? "/" : path; - boolean filtered = !"/".equals(path); - maxEntries = maxEntries < 0 ? Integer.MAX_VALUE : maxEntries; - - List history = new FetchValidCommitsQuery(mongoConnection, maxEntries).execute(); - JsopBuilder buff = new JsopBuilder().array(); - for (int i = history.size() - 1; i >= 0; i--) { - CommitMongo commit = history.get(i); - if (commit.getTimestamp() >= since) { - // FIXME [Mete] Check that filter really works. - if (!filtered || commit.getAffectedPaths().contains(path)) { - buff.object() - .key("id").value(String.valueOf(commit.getRevisionId())) - .key("ts").value(commit.getTimestamp()) - .key("msg").value(commit.getMessage()) - .endObject(); - } - } - } - - return buff.endArray().toString(); - } - - @Override - public String waitForCommit(String oldHeadRevisionId, long timeout) throws InterruptedException { - long startTimestamp = System.currentTimeMillis(); - long initialHeadRevisionId = getHeadRevisionId(); - - if (timeout <= 0) { - return String.valueOf(initialHeadRevisionId); - } - - long oldHeadRevision = MongoUtil.toMongoRepresentation(oldHeadRevisionId); - if (oldHeadRevision < initialHeadRevisionId) { - return String.valueOf(initialHeadRevisionId); - } - - long waitForCommitPollMillis = Math.min(WAIT_FOR_COMMIT_POLL_MILLIS, timeout); - while (true) { - long headRevisionId = getHeadRevisionId(); - long now = System.currentTimeMillis(); - if (headRevisionId != initialHeadRevisionId || now - startTimestamp >= timeout) { - return String.valueOf(headRevisionId); - } - Thread.sleep(waitForCommitPollMillis); - } - } - - private long getHeadRevisionId() { - DBCollection headCollection = mongoConnection.getHeadCollection(); - HeadMongo headMongo = (HeadMongo)headCollection.findOne(); - long headRevisionId = headMongo.getHeadRevisionId(); - return headRevisionId; - } -} Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/BlobStoreMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/BlobStoreMongo.java (revision 0) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/BlobStoreMongo.java (working copy) @@ -0,0 +1,56 @@ +/* + * 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.mongomk.impl; + +import java.io.InputStream; + +import org.apache.jackrabbit.mongomk.api.BlobStore; +import org.apache.jackrabbit.mongomk.api.command.Command; +import org.apache.jackrabbit.mongomk.api.command.CommandExecutor; +import org.apache.jackrabbit.mongomk.command.GetBlobLengthCommandMongo; +import org.apache.jackrabbit.mongomk.command.ReadBlobCommandMongo; +import org.apache.jackrabbit.mongomk.command.WriteBlobCommandMongo; +import org.apache.jackrabbit.mongomk.impl.command.CommandExecutorImpl; + +public class BlobStoreMongo implements BlobStore { + + private final MongoConnection mongoConnection; + private final CommandExecutor commandExecutor; + + public BlobStoreMongo(MongoConnection mongoConnection) { + this.mongoConnection = mongoConnection; + this.commandExecutor = new CommandExecutorImpl(); + } + + @Override + public long getBlobLength(String blobId) throws Exception { + Command command = new GetBlobLengthCommandMongo(mongoConnection, blobId); + return commandExecutor.execute(command); + } + + @Override + public int readBlob(String blobId, long blobOffset, byte[] buffer, int bufferOffset, int length) throws Exception { + Command command = new ReadBlobCommandMongo(mongoConnection, blobId, blobOffset, buffer, bufferOffset, length); + return commandExecutor.execute(command); + } + + @Override + public String writeBlob(InputStream is) throws Exception { + Command command = new WriteBlobCommandMongo(mongoConnection, is); + return commandExecutor.execute(command); + } +} Property changes on: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/BlobStoreMongo.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoConnection.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoConnection.java (revision 0) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoConnection.java (working copy) @@ -0,0 +1,104 @@ +/* + * 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.mongomk.impl; + +import org.apache.jackrabbit.mongomk.model.CommitMongo; +import org.apache.jackrabbit.mongomk.model.HeadMongo; +import org.apache.jackrabbit.mongomk.model.NodeMongo; + +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.Mongo; +import com.mongodb.gridfs.GridFS; + +/** + * The {@code MongoConnection} contains connection properties for the {@code MongoDB}. + * + * @author commits = new FetchValidCommitsQuery(mongoConnection, + fromRevision, toRevision).execute(); + + CommitMongo toCommit = getCommit(commits, toRevision); + + CommitMongo fromCommit; + if (toRevision == fromRevision) { + fromCommit = toCommit; + } else { + fromCommit = getCommit(commits, fromRevision); + if (fromCommit == null || (fromCommit.getTimestamp() > toCommit.getTimestamp())) { + // negative range, return empty journal + return "[]"; + } + } + + JsopBuilder commitBuff = new JsopBuilder().array(); + // iterate over commits in chronological order, + // starting with oldest commit + for (int i = commits.size() - 1; i >= 0; i--) { + CommitMongo commit = commits.get(i); + //if (commit.getParentId() == null) { + // continue; + //} + String diff = commit.getDiff(); + // FIXME Check that filter really works. + if (!filtered || commit.getAffectedPaths().contains(path)) { + commitBuff.object() + .key("id").value(MongoUtil.fromMongoRepresentation(commit.getRevisionId())) + .key("ts").value(commit.getTimestamp()) + .key("msg").value(commit.getMessage()) + .key("changes").value(diff).endObject(); + } + } + return commitBuff.endArray().toString(); + } + + @Override + public String getRevisionHistory(long since, int maxEntries, String path) { + path = (path == null || "".equals(path)) ? "/" : path; + boolean filtered = !"/".equals(path); + maxEntries = maxEntries < 0 ? Integer.MAX_VALUE : maxEntries; + + List history = new FetchValidCommitsQuery(mongoConnection, maxEntries).execute(); + JsopBuilder buff = new JsopBuilder().array(); + for (int i = history.size() - 1; i >= 0; i--) { + CommitMongo commit = history.get(i); + if (commit.getTimestamp() >= since) { + // FIXME [Mete] Check that filter really works. + if (!filtered || commit.getAffectedPaths().contains(path)) { + buff.object() + .key("id").value(MongoUtil.fromMongoRepresentation(commit.getRevisionId())) + .key("ts").value(commit.getTimestamp()) + .key("msg").value(commit.getMessage()) + .endObject(); + } + } + } + + return buff.endArray().toString(); + } + + @Override + public String waitForCommit(String oldHeadRevisionId, long timeout) throws InterruptedException { + long startTimestamp = System.currentTimeMillis(); + long initialHeadRevisionId = getHeadRevisionId(); + + if (timeout <= 0) { + return MongoUtil.fromMongoRepresentation(initialHeadRevisionId); + } + + long oldHeadRevision = MongoUtil.toMongoRepresentation(oldHeadRevisionId); + if (oldHeadRevision < initialHeadRevisionId) { + return MongoUtil.fromMongoRepresentation(initialHeadRevisionId); + } + + long waitForCommitPollMillis = Math.min(WAIT_FOR_COMMIT_POLL_MILLIS, timeout); + while (true) { + long headRevisionId = getHeadRevisionId(); + long now = System.currentTimeMillis(); + if (headRevisionId != initialHeadRevisionId || now - startTimestamp >= timeout) { + return MongoUtil.fromMongoRepresentation(headRevisionId); + } + Thread.sleep(waitForCommitPollMillis); + } + } + + // FIXME - Consolidate with getHeadRevision + private long getHeadRevisionId() { + DBCollection headCollection = mongoConnection.getHeadCollection(); + HeadMongo headMongo = (HeadMongo)headCollection.findOne(); + long headRevisionId = headMongo.getHeadRevisionId(); + return headRevisionId; + } + + // FIXME - Move to a command. + private CommitMongo getCommit(List commits, Long revisionId) { + for (CommitMongo commit : commits) { + if (commit.getRevisionId() == revisionId) { + return commit; + } + } + return null; + } +} Property changes on: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeStoreMongo.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/AbstractQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/AbstractQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/AbstractQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; /** * An abstract base class for queries performed with {@code MongoDB}. Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java (working copy) @@ -19,7 +19,7 @@ import java.io.InputStream; import java.util.Properties; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.junit.After; import org.junit.AfterClass; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java (working copy) @@ -56,14 +56,14 @@ String getPath(); /** - * Returns the revision id of this commit if known already, else this will return {@code null}. The revision - * id will be determined only after the commit has been successfully performed. + * Returns the revision id of this commit if known already, else this will return {@code null}. + * The revision id will be determined only after the commit has been successfully performed. * - * @see #setRevisionId(String) + * @see #setRevisionId(Long) * * @return The revision id of this commit or {@code null}. */ - String getRevisionId(); + Long getRevisionId(); /** * Sets the revision id of this commit. @@ -72,7 +72,7 @@ * * @param revisionId The revision id to set. */ - void setRevisionId(String revisionId); + void setRevisionId(Long revisionId); /** Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java (working copy) @@ -51,10 +51,11 @@ * @throws Exception If an error occurred while creating the {@code Commit}. */ public static Commit build(String path, String diff, String message) throws Exception { - CommitHandler commitHandler = new CommitHandler(new CommitImpl(path, diff, message)); + CommitImpl commit = new CommitImpl(path, diff, message); + CommitHandler commitHandler = new CommitHandler(commit); JsopParser jsopParser = new JsopParser(path, diff, commitHandler); jsopParser.parse(); - return commitHandler.getCommit(); + return commit; } private CommitBuilder() { @@ -106,9 +107,5 @@ SetPropertyInstruction instruction = new SetPropertyInstructionImpl(path, key, value); commit.addInstruction(instruction); } - - Commit getCommit() { - return commit; - } } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitCommandInstructionVisitor.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitCommandInstructionVisitor.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitCommandInstructionVisitor.java (working copy) @@ -21,9 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.model.Instruction.AddNodeInstruction; import org.apache.jackrabbit.mongomk.api.model.Instruction.AddPropertyInstruction; import org.apache.jackrabbit.mongomk.api.model.Instruction.CopyNodeInstruction; @@ -31,6 +29,7 @@ import org.apache.jackrabbit.mongomk.api.model.Instruction.RemoveNodeInstruction; import org.apache.jackrabbit.mongomk.api.model.Instruction.SetPropertyInstruction; import org.apache.jackrabbit.mongomk.api.model.InstructionVisitor; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.query.FetchNodeByPathQuery; import org.apache.jackrabbit.oak.commons.PathUtils; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongo.java (working copy) @@ -23,10 +23,10 @@ import java.util.Map; import java.util.Set; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; import org.apache.jackrabbit.mongomk.api.model.Commit; import org.apache.jackrabbit.mongomk.api.model.Instruction; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitCommandInstructionVisitor; import org.apache.jackrabbit.mongomk.model.CommitMongo; import org.apache.jackrabbit.mongomk.model.HeadMongo; @@ -50,7 +50,7 @@ * * @author instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "1")); - - Commit commit = new CommitImpl("/", "+1 : {}", "This is the 1st commit", instructions); + public void addNodesToSameParent() throws Exception { + Commit commit = CommitBuilder.build("/", "+\"a\" : {}", "This is the 1st commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String firstRevisionId = command.execute(); - - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "2")); + Long firstRevisionId = command.execute(); - commit = new CommitImpl("/", "+2 : {}", "This is the 2nd commit", instructions); + commit = CommitBuilder.build("/", "+\"b\" : {}", "This is the 2nd commit"); command = new CommitCommandMongo(mongoConnection, commit); - String secondRevisionId = command.execute(); - - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "3")); + Long secondRevisionId = command.execute(); - commit = new CommitImpl("/", "+3 : {}", "This is the 3rd commit", instructions); + commit = CommitBuilder.build("/", "+\"c\" : {}", "This is the 3rd commit"); command = new CommitCommandMongo(mongoConnection, commit); - String thirdRevisionId = command.execute(); + Long thirdRevisionId = command.execute(); - MongoAssert.assertNodesExist("", NodeBuilder.build(String.format( - "{ \"/#%3$s\" : { \"1#%1$s\" : { } , \"2#%2$s\" : { } , \"3#%3$s\" : { } } }", + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%3$s\" : { \"a#%1$s\" : { } , \"b#%2$s\" : { } , \"c#%3$s\" : { } } }", firstRevisionId, secondRevisionId, thirdRevisionId))); } @Test - public void addNodes() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - instructions.add(new AddNodeInstructionImpl("/a", "c")); - - Commit commit = new CommitImpl("/", "+a : { b : {} , c : {} }", - "This is a simple commit", instructions); + public void addIntermediataryNodes() throws Exception { + Commit commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : { \"c\": {} }}", + "Add /a/b/c"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + Long revisionId1 = command.execute(); - Assert.assertNotNull(revisionId); - MongoAssert.assertNodesExist("", NodeBuilder.build(String.format( - "{ \"/#%1$s\" : { \"a#%1$s\" : { \"b#%1$s\" : {} , \"c#%1$s\" : {} } } }", revisionId))); + commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : { \"e\": {} }, \"d\" : {} }", + "Add /a/d and /a/b/e"); + command = new CommitCommandMongo(mongoConnection, commit); + Long revisionId2 = command.execute(); - MongoAssert.assertCommitExists(commit); - MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/", "/a", "/a/b", "/a/c"); - MongoAssert.assertHeadRevision(1); - MongoAssert.assertNextRevision(2); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%2$s\" : { \"b#%2$s\" : { \"c#%1$s\" : {}, \"e#%2$s\" : {} }, " + + " \"d#%2$s\" : {} } } }", revisionId1, revisionId2))); } @Test public void addDuplicateNode() throws Exception { - // Add /a and /a/b - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - Commit commit = new CommitImpl("/", "+a : { \"b\" : {} }", "Add /a, /a/b", instructions); + Commit commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : {} }", "Add a/b"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); command.execute(); - // Add /a/b again - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - commit = new CommitImpl("/a", "+b", "Add /a/b", instructions); + commit = CommitBuilder.build("/a", "+\"b\" : {}", "Add a/b again"); command = new CommitCommandMongo(mongoConnection, commit); try { command.execute(); @@ -122,257 +108,139 @@ } @Test - public void addNodesAndPropertiesOutOfOrder() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddPropertyInstructionImpl("/a", "key1", "value1")); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - instructions.add(new AddPropertyInstructionImpl("/a/b", "key2", "value2")); - instructions.add(new AddPropertyInstructionImpl("/a/c", "key3", "value3")); - instructions.add(new AddNodeInstructionImpl("/a", "c")); + public void addNodesAndProperties() throws Exception { + SimpleNodeScenario scenario1 = new SimpleNodeScenario(mongoConnection); + scenario1.create(); - Commit commit = new CommitImpl("/", - "+a : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", - "This is a simple commit", instructions); + Commit commit = CommitBuilder.build("/", + "+\"a\" : { \"key1\" : \"value1\" , \"b\" : {\"key2\" : \"value2\"}" + + ", \"c\" : {\"key3\" : \"value3\"}}", + "This is a simple commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + Long revisionId = command.execute(); Assert.assertNotNull(revisionId); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"key1\" : \"value1\", \"b#%1$s\" : { \"key2\" : \"value2\" } , \"c#%1$s\" : { \"key3\" : \"value3\" } } } }", - revisionId))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%1$s\" : { \"int\" : 1 , \"key1\" : \"value1\", \"b#%1$s\" : { \"string\" : \"foo\" , \"key2\" : \"value2\" } , \"c#%1$s\" : { \"bool\" : true , \"key3\" : \"value3\" } } } }", + revisionId))); MongoAssert.assertCommitExists(commit); MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/", "/a", "/a/b", "/a/c"); - MongoAssert.assertHeadRevision(1); - MongoAssert.assertNextRevision(2); } @Test - public void addNodesWhichAlreadyExist() throws Exception { - SimpleNodeScenario scenario1 = new SimpleNodeScenario(mongoConnection); - scenario1.create(); - - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddPropertyInstructionImpl("/a", "key1", "value1")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - instructions.add(new AddPropertyInstructionImpl("/a/b", "key2", "value2")); - instructions.add(new AddNodeInstructionImpl("/a", "c")); - instructions.add(new AddPropertyInstructionImpl("/a/c", "key3", "value3")); - - Commit commit = new CommitImpl("/", - "+a : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", - "This is a simple commit", instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - - Assert.assertNotNull(revisionId); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"int\" : 1 , \"key1\" : \"value1\", \"b#%1$s\" : { \"string\" : \"foo\" , \"key2\" : \"value2\" } , \"c#%1$s\" : { \"bool\" : true , \"key3\" : \"value3\" } } } }", - revisionId))); + @Ignore + // FIXME - This currently fails due to some limit in property sizes in Mongo + // which affects path property. + public void bigCommit() throws Exception { + String path = "/"; + String baseNodeName = "test"; + int numberOfCommits = 1000; - MongoAssert.assertCommitExists(commit); - // MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/a", "/a/b", "/a/c"); TODO think about - // whether / should really be included since it already contained /a - MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/", "/a", "/a/b", "/a/c"); + for (int i = 0; i < numberOfCommits; i++) { + Commit commit = CommitBuilder.build(path, "+\"" + baseNodeName + i + "\" : {}", + "Add node n" + i); + CommitCommandMongo command = new CommitCommandMongo( + mongoConnection, commit); + command.execute(); + if (!PathUtils.denotesRoot(path)) { + path += "/"; + } + path += baseNodeName + i; + } } @Test public void commitAndMergeNodes() throws Exception { SimpleNodeScenario scenario1 = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario1.create(); - String secondRevisionId = scenario1.update_A_and_add_D_and_E(); + Long firstRevisionId = scenario1.create(); + Long secondRevisionId = scenario1.update_A_and_add_D_and_E(); SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario2.create(); + Long thirdRevisionId = scenario2.create(); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"int\" : 1 , \"b#%1$s\" : { \"string\" : \"foo\" } , \"c#%1$s\" : { \"bool\" : true } } } }", - firstRevisionId))); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%2$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%2$s\" : { \"string\" : \"foo\" , \"e#%2$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%1$s\" : { \"bool\" : true }, \"d#%2$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId))); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%3$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%2$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%3$s\" : { \"bool\" : true }, \"d#%2$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId, - thirdRevisionId))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%1$s\" : { \"int\" : 1 , \"b#%1$s\" : { \"string\" : \"foo\" } , \"c#%1$s\" : { \"bool\" : true } } } }", + firstRevisionId))); + + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%2$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%2$s\" : { \"string\" : \"foo\" , \"e#%2$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%1$s\" : { \"bool\" : true }, \"d#%2$s\" : { \"null\" : null } } } }", + firstRevisionId, secondRevisionId))); + + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%3$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%2$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%3$s\" : { \"bool\" : true }, \"d#%2$s\" : { \"null\" : null } } } }", + firstRevisionId, secondRevisionId, thirdRevisionId))); } @Test public void commitContainsAllAffectedNodes() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); + Long firstRevisionId = scenario.create(); + Long secondRevisionId = scenario.update_A_and_add_D_and_E(); MongoAssert.assertCommitContainsAffectedPaths(firstRevisionId, "/", "/a", "/a/b", "/a/c"); MongoAssert.assertCommitContainsAffectedPaths(secondRevisionId, "/a", "/a/b", "/a/d", "/a/b/e"); } @Test - public void removeNode() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - instructions.add(new AddNodeInstructionImpl("/a", "c")); - - Commit commit = new CommitImpl("/", "+a : { b : {} , c : {} }", - "This is a simple commit", instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - Assert.assertNotNull(revisionId); - - instructions = new LinkedList(); - instructions.add(new RemoveNodeInstructionImpl("/", "a")); - - commit = new CommitImpl("/", "-a", "This is a simple commit", instructions); - command = new CommitCommandMongo(mongoConnection, commit); - revisionId = command.execute(); - Assert.assertNotNull(revisionId); - - MongoAssert.assertNodesExist("", - NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", revisionId))); - - MongoAssert.assertCommitExists(commit); - MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/"); - } - - @Test - public void removeNonExistentNode() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - - Commit commit = new CommitImpl("/", "+a : { b : {} }", "Add nodes", instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - command.execute(); - - instructions = new LinkedList(); - instructions.add(new RemoveNodeInstructionImpl("/a", "c")); - - commit = new CommitImpl("/a", "-c", "Non-existent node delete", instructions); - command = new CommitCommandMongo(mongoConnection, commit); - try { - command.execute(); - fail("Exception expected"); - } catch (Exception expected) { - - } - } - - @Test public void existingParentContainsChildren() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/", "b")); - instructions.add(new AddNodeInstructionImpl("/", "c")); - - Commit commit = new CommitImpl("/", "+a : { b : {} , c : {} }", - "This is a simple commit", instructions); + Commit commit = CommitBuilder.build("", "+ \"/\" : {\"a\" : {}, \"b\" : {}, \"c\" : {}}", + "This is a simple commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + Long revisionId = command.execute(); - Assert.assertNotNull(revisionId); - MongoAssert.assertNodesExist("", NodeBuilder.build(String.format( + assertNotNull(revisionId); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( "{ \"/#%1$s\" : { \"a#%1$s\" : {}, \"b#%1$s\" : {} , \"c#%1$s\" : {} } }", revisionId))); GetNodesCommandMongo command2 = new GetNodesCommandMongo(mongoConnection, "/", revisionId, 0); Node rootOfPath = command2.execute(); - Assert.assertEquals(3, rootOfPath.getChildCount()); + assertEquals(3, rootOfPath.getChildCount()); } @Test - public void mergePropertiesAndChildren_noneExistedAndNewAdded() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddPropertyInstructionImpl("/a", "key1", "value1")); - instructions.add(new AddPropertyInstructionImpl("/a", "key2", "value2")); - instructions.add(new AddPropertyInstructionImpl("/a", "key3", "value3")); - - Commit commit = new CommitImpl("/", - "+a : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", - "This is a simple commit", instructions); + public void mergePropertiesAndChildrenNoneExistedAndNewAdded() throws Exception { + Commit commit = CommitBuilder.build("/", + "+\"a\" : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", + "This is a simple commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + Long revisionId = command.execute(); - MongoAssert.assertNodesExist("", NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", "0"))); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"key1\" : \"value1\", \"key2\" : \"value2\", \"key3\" : \"value3\" } } }", - revisionId))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", "0"))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%1$s\" : { \"key1\" : \"value1\", \"key2\" : \"value2\", \"key3\" : \"value3\" } } }", + revisionId))); } @Test - public void mergePropertiesAndChildren_someExistedAndNewAdded() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddPropertyInstructionImpl("/a", "existed_key1", "value1")); - instructions.add(new AddPropertyInstructionImpl("/a", "existed_key2", "value2")); - instructions.add(new AddPropertyInstructionImpl("/a", "existed_key3", "value3")); - - Commit commit = new CommitImpl("/", - "+a : { \"existed_key1\" : \"value1\" , \"existed_key2\" : \"value2\" , \"existed_key3\" : \"value3\" }", - "This is a simple commit", instructions); + public void mergePropertiesAndChildrenSomeExistedAndNewAdded() throws Exception { + Commit commit = CommitBuilder.build("/", + "+\"a\" : { \"existed_key1\" : \"value1\" , \"existed_key2\" : \"value2\" , \"existed_key3\" : \"value3\" }", + "This is a simple commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + Long revisionId = command.execute(); - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddPropertyInstructionImpl("/a", "key1", "value1")); - instructions.add(new AddPropertyInstructionImpl("/a", "key2", "value2")); - instructions.add(new AddPropertyInstructionImpl("/a", "key3", "value3")); - - commit = new CommitImpl("/", - "+a : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", - "This is a simple commit", instructions); + commit = CommitBuilder.build("/", + "+\"a\" : { \"key1\" : \"value1\" , \"key2\" : \"value2\" , \"key3\" : \"value3\" }", + "This is a simple commit"); command = new CommitCommandMongo(mongoConnection, commit); revisionId = command.execute(); - MongoAssert.assertNodesExist("", NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", "0"))); - MongoAssert - .assertNodesExist( - "", - NodeBuilder.build(String - .format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"existed_key1\" : \"value1\", \"existed_key2\" : \"value2\", \"existed_key3\" : \"value3\", \"key1\" : \"value1\", \"key2\" : \"value2\", \"key3\" : \"value3\" } } }", - revisionId))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", "0"))); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format("{ \"/#%1$s\" : { \"a#%1$s\" : { \"existed_key1\" : \"value1\", \"existed_key2\" : \"value2\", \"existed_key3\" : \"value3\", \"key1\" : \"value1\", \"key2\" : \"value2\", \"key3\" : \"value3\" } } }", + revisionId))); } @Test public void noOtherNodesTouched() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/", "b")); - instructions.add(new AddNodeInstructionImpl("/", "c")); - - Commit commit = new CommitImpl("/", "+a : { b : {} , c : {} }", - "This is a simple commit", instructions); + Commit commit = CommitBuilder.build("/", "+\"a\" : {}" + + "\n+\"b\" : {}" + "\n+\"c\" : {}", "Simple commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String firstRevisionId = command.execute(); - - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/a", "d")); - instructions.add(new AddNodeInstructionImpl("/a", "e")); + Long firstRevisionId = command.execute(); - commit = new CommitImpl("/a", "+d: {} \n+e : {}", "This is a simple commit", instructions); + commit = CommitBuilder.build("/a", "+\"d\": {} \n+\"e\" : {}", "This is a simple commit"); command = new CommitCommandMongo(mongoConnection, commit); - String secondRevisionId = command.execute(); + Long secondRevisionId = command.execute(); MongoAssert.assertNodeRevisionId("/", firstRevisionId, true); MongoAssert.assertNodeRevisionId("/a", firstRevisionId, true); @@ -390,42 +258,51 @@ } @Test - public void rootNodeHasEmptyRootPath() throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("", "/")); - - Commit commit = new CommitImpl(MongoUtil.INITIAL_COMMIT_PATH, MongoUtil.INITIAL_COMMIT_DIFF, - MongoUtil.INITIAL_COMMIT_MESSAGE, instructions); + public void removeNode() throws Exception { + Commit commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : {} , \"c\" : {} }", + "Add a and its children"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - Assert.assertNotNull(revisionId); + Long revisionId = command.execute(); + assertNotNull(revisionId); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format( + "{ \"/#%1$s\" : { \"a#%1$s\" : { \"b#%1$s\" : {} , \"c#%1$s\" : {} } } }", revisionId))); - Node expected = NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", revisionId)); - MongoAssert.assertNodesExist(MongoUtil.INITIAL_COMMIT_PATH, expected); + commit = CommitBuilder.build("/", "-\"a\"", "Remove a"); + command = new CommitCommandMongo(mongoConnection, commit); + revisionId = command.execute(); + assertNotNull(revisionId); + MongoAssert.assertNodesExist(NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", + revisionId))); + + MongoAssert.assertCommitExists(commit); + MongoAssert.assertCommitContainsAffectedPaths(commit.getRevisionId(), "/"); } @Test - @Ignore - // FIXME - This currently fails due to some limit in property sizes in Mongo - // which affects path property. - public void bigCommit() throws Exception { - String path = "/"; - String baseNodeName = "test"; - int numberOfCommits = 1000; + public void removeNonExistentNode() throws Exception { + Commit commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : {} }", "Add nodes"); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); + command.execute(); - List instructions = new LinkedList(); - for (int i = 0; i < numberOfCommits; i++) { - instructions.clear(); - instructions.add(new AddNodeInstructionImpl(path, baseNodeName + i)); - Commit commit = new CommitImpl(path, "+" + baseNodeName + i + " : {}", - "Add node n" + i, instructions); - CommitCommandMongo command = new CommitCommandMongo( - mongoConnection, commit); + commit = CommitBuilder.build("/a", "-\"c\"", "Non-existent node delete"); + command = new CommitCommandMongo(mongoConnection, commit); + try { command.execute(); - if (!PathUtils.denotesRoot(path)) { - path += "/"; - } - path += baseNodeName + i; + fail("Exception expected"); + } catch (Exception expected) { + } } -} + + @Test + public void rootNodeHasEmptyRootPath() throws Exception { + Commit commit = CommitBuilder.build(MongoUtil.INITIAL_COMMIT_PATH, MongoUtil.INITIAL_COMMIT_DIFF, + MongoUtil.INITIAL_COMMIT_MESSAGE); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); + Long revisionId = command.execute(); + assertNotNull(revisionId); + + Node expected = NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", revisionId)); + MongoAssert.assertNodesExist(expected); + } +} \ No newline at end of file Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/CommitImpl.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/CommitImpl.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/CommitImpl.java (working copy) @@ -24,7 +24,6 @@ import org.apache.jackrabbit.mongomk.api.model.Commit; import org.apache.jackrabbit.mongomk.api.model.Instruction; - /** * Implementation of {@link Commit}. * @@ -37,18 +36,8 @@ private final String message; private final String path; private final long timestamp; - private String revisionId; - /** - * Constructs a new {@code CommitImpl}. - * - * @param path The path. - * @param diff The diff. - * @param message The message. - */ - public CommitImpl(String path, String diff, String message) { - this(path, diff, message, new LinkedList()); - } + private Long revisionId; /** * Constructs a new {@code CommitImpl}. @@ -56,13 +45,12 @@ * @param path The path. * @param diff The diff. * @param message The message. - * @param instructions The {@link Instruction}s. */ - public CommitImpl(String path, String diff, String message, List instructions) { + public CommitImpl(String path, String diff, String message) { this.path = path; this.diff = diff; this.message = message; - this.instructions = instructions; + this.instructions = new LinkedList(); timestamp = new Date().getTime(); } @@ -91,11 +79,11 @@ return path; } - public String getRevisionId() { + public Long getRevisionId() { return revisionId; } - public void setRevisionId(String revisionId) { + public void setRevisionId(Long revisionId) { this.revisionId = revisionId; } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitMongo.java (working copy) @@ -25,7 +25,6 @@ import org.apache.jackrabbit.mongomk.api.model.Commit; import org.apache.jackrabbit.mongomk.api.model.Instruction; import org.apache.jackrabbit.mongomk.api.model.Instruction.AddNodeInstruction; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.apache.jackrabbit.oak.commons.PathUtils; import com.mongodb.BasicDBObject; @@ -60,7 +59,7 @@ String diff = commit.getDiff(); commitMongo.setDiff(diff); - String revisionId = commit.getRevisionId(); + Long revisionId = commit.getRevisionId(); if (revisionId != null) { commitMongo.setRevisionId(revisionId); } @@ -141,10 +140,6 @@ put(KEY_REVISION_ID, revisionId); } - public void setRevisionId(String revisionId) { - setRevisionId(MongoUtil.toMongoRepresentation(revisionId)); - } - public void setTimestamp(long timestamp) { put(KEY_TIMESTAMP, timestamp); } Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/ConcurrentCommitCommandMongoTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/ConcurrentCommitCommandMongoTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/ConcurrentCommitCommandMongoTest.java (working copy) @@ -30,6 +30,7 @@ import org.apache.jackrabbit.mongomk.api.model.Commit; import org.apache.jackrabbit.mongomk.api.model.Instruction; import org.apache.jackrabbit.mongomk.api.model.Node; +import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder; import org.apache.jackrabbit.mongomk.impl.command.CommandExecutorImpl; import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl; import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; @@ -50,10 +51,8 @@ // create the commands List commands = new ArrayList(numOfConcurrentThreads); for (int i = 0; i < numOfConcurrentThreads; ++i) { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", String.valueOf(i))); - Commit commit = new CommitImpl("/", "+" + i + " : {}", - "This is a concurrent commit", instructions); + Commit commit = CommitBuilder.build("/", "+\"" + i + "\" : {}", + "This is a concurrent commit"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit) { @Override protected boolean saveAndSetHeadRevision() throws Exception { @@ -75,7 +74,7 @@ // execute the commands final CommandExecutor commandExecutor = new CommandExecutorImpl(); ExecutorService executorService = Executors.newFixedThreadPool(numOfConcurrentThreads); - final List revisionIds = new LinkedList(); + final List revisionIds = new LinkedList(); for (int i = 0; i < numOfConcurrentThreads; ++i) { final CommitCommandMongo command = commands.get(i); Runnable runnable = new Runnable() { @@ -83,7 +82,7 @@ @Override public void run() { try { - String revisionId = commandExecutor.execute(command); + Long revisionId = commandExecutor.execute(command); revisionIds.add(revisionId); } catch (Exception e) { revisionIds.add(null); @@ -101,18 +100,17 @@ } } while (revisionIds.size() < numOfConcurrentThreads); - // verify the result by sorting the revision ids and verifying that all children are contained in the next - // revision - Collections.sort(revisionIds, new Comparator() { + // Verify the result by sorting the revision ids and verifying that all + // children are contained in the next revision + Collections.sort(revisionIds, new Comparator() { @Override - public int compare(String o1, String o2) { - return Long.valueOf(o1).compareTo(Long.valueOf(o2)); + public int compare(Long o1, Long o2) { + return o1.compareTo(o2); } }); List lastChildren = new LinkedList(); for (int i = 0; i < numOfConcurrentThreads; ++i) { - String revisionId = revisionIds.get(i); - + Long revisionId = revisionIds.get(i); GetNodesCommandMongo command2 = new GetNodesCommandMongo(mongoConnection, "/", revisionId, 0); Node root = command2.execute(); Set children = root.getChildren(); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.HeadMongo; import com.mongodb.DBCollection; @@ -31,8 +31,7 @@ /** * Constructs a new {@code FetchHeadQuery}. * - * @param mongoConnection - * The {@link MongoConnection}. + * @param mongoConnection The {@link MongoConnection}. */ public FetchHeadQuery(MongoConnection mongoConnection) { super(mongoConnection); @@ -41,8 +40,6 @@ @Override public HeadMongo execute() throws Exception { DBCollection headCollection = mongoConnection.getHeadCollection(); - HeadMongo headMongo = (HeadMongo) headCollection.findOne(); - - return headMongo; + return (HeadMongo)headCollection.findOne(); } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadRevisionQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadRevisionQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadRevisionQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.HeadMongo; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java (working copy) @@ -18,7 +18,7 @@ import java.util.List; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; import com.mongodb.DBCollection; @@ -96,7 +96,8 @@ if (revisionId == 0) { return true; } - FetchValidRevisionsQuery query = new FetchValidRevisionsQuery(mongoConnection, String.valueOf(Long.MAX_VALUE)); + FetchValidRevisionsQuery query = new FetchValidRevisionsQuery(mongoConnection, + Long.MAX_VALUE); List revisionIds = query.execute(); return revisionIds.contains(revisionId); } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java (working copy) @@ -19,9 +19,8 @@ import java.util.List; import java.util.regex.Pattern; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,21 +40,18 @@ private final int depth; private final String path; - private final String revisionId; + private final Long revisionId; /** * Constructs a new {@code FetchNodesByPathAndDepthQuery}. * - * @param mongoConnection - * The {@link MongoConnection}. - * @param path - * The path. - * @param revisionId - * The revision id. - * @param depth - * The depth. + * @param mongoConnection The {@link MongoConnection}. + * @param path The path. + * @param revisionId The revision id. + * @param depth The depth. */ - public FetchNodesByPathAndDepthQuery(MongoConnection mongoConnection, String path, String revisionId, int depth) { + public FetchNodesByPathAndDepthQuery(MongoConnection mongoConnection, String path, + Long revisionId, int depth) { super(mongoConnection); this.path = path; this.revisionId = revisionId; @@ -100,7 +96,7 @@ return pattern; } - private List fetchValidRevisions(MongoConnection mongoConnection, String revisionId) { + private List fetchValidRevisions(MongoConnection mongoConnection, Long revisionId) { return new FetchValidRevisionsQuery(mongoConnection, revisionId).execute(); } @@ -109,7 +105,7 @@ QueryBuilder qb = QueryBuilder.start(NodeMongo.KEY_PATH).regex(pattern); if (revisionId != null) { - qb = qb.and(NodeMongo.KEY_REVISION_ID).lessThanEquals(MongoUtil.toMongoRepresentation(revisionId)); + qb = qb.and(NodeMongo.KEY_REVISION_ID).lessThanEquals(revisionId); } DBObject query = qb.get(); Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQueryTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQueryTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQueryTest.java (working copy) @@ -16,23 +16,19 @@ */ package org.apache.jackrabbit.mongomk.query; -import java.util.LinkedList; import java.util.List; import java.util.Set; import org.apache.jackrabbit.mongomk.BaseMongoTest; import org.apache.jackrabbit.mongomk.api.model.Commit; -import org.apache.jackrabbit.mongomk.api.model.Instruction; import org.apache.jackrabbit.mongomk.api.model.Node; import org.apache.jackrabbit.mongomk.command.CommitCommandMongo; import org.apache.jackrabbit.mongomk.impl.NodeAssert; +import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder; import org.apache.jackrabbit.mongomk.impl.builder.NodeBuilder; -import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl; -import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; import org.apache.jackrabbit.mongomk.model.CommitMongo; import org.apache.jackrabbit.mongomk.model.NodeMongo; import org.apache.jackrabbit.mongomk.scenario.SimpleNodeScenario; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.junit.Test; import com.mongodb.BasicDBObject; @@ -44,12 +40,12 @@ @Test public void fetchWithInvalidFirstRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId1); - updateBaseRevisionId(revisionId2, "0"); + updateBaseRevisionId(revisionId2, 0L); FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, "/", revisionId3, -1); @@ -63,9 +59,9 @@ @Test public void fetchWithInvalidLastRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId3); @@ -81,9 +77,9 @@ @Test public void fetchWithInvalidMiddleRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId2); updateBaseRevisionId(revisionId3, revisionId1); @@ -100,11 +96,11 @@ @Test public void simpleFetchRootAndAllDepths() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); + Long firstRevisionId = scenario.create(); + Long secondRevisionId = scenario.update_A_and_add_D_and_E(); - FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, "/", firstRevisionId, - 0); + FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, + "/", firstRevisionId, 0); List result = query.execute(); List actuals = NodeMongo.toNode(result); Node expected = NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", firstRevisionId)); @@ -176,32 +172,28 @@ NodeAssert.assertEquals(expecteds, actuals); } - private String addNode(String nodeName) throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", nodeName)); - Commit commit = new CommitImpl("/", "+" + nodeName, "Add /" + nodeName, instructions); + private Long addNode(String nodeName) throws Exception { + Commit commit = CommitBuilder.build("/", "+\"" + nodeName + "\" : {}", "Add /" + nodeName); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - return revisionId; + return command.execute(); } - private void invalidateCommit(String revisionId) { + private void invalidateCommit(Long revisionId) { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(revisionId)).get(); + .is(revisionId).get(); DBObject update = new BasicDBObject(); update.put("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); commitCollection.update(query, update); } - private void updateBaseRevisionId(String revisionId2, String baseRevisionId) { + private void updateBaseRevisionId(Long revisionId2, Long baseRevisionId) { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(revisionId2)) + .is(revisionId2) .get(); DBObject update = new BasicDBObject("$set", - new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, - MongoUtil.toMongoRepresentation(baseRevisionId))); + new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, baseRevisionId)); commitCollection.update(query, update); } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java (working copy) @@ -21,9 +21,8 @@ import java.util.List; import java.util.Set; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,19 +41,17 @@ private static final Logger LOG = LoggerFactory.getLogger(FetchNodesForRevisionQuery.class); private final Set paths; - private final String revisionId; + private final Long revisionId; /** * Constructs a new {@code FetchNodesForRevisionQuery}. * - * @param mongoConnection - * The {@link MongoConnection}. - * @param paths - * The paths to fetch. - * @param revisionId - * The revision id. + * @param mongoConnection The {@link MongoConnection}. + * @param paths The paths to fetch. + * @param revisionId The revision id. */ - public FetchNodesForRevisionQuery(MongoConnection mongoConnection, Set paths, String revisionId) { + public FetchNodesForRevisionQuery(MongoConnection mongoConnection, Set paths, + Long revisionId) { super(mongoConnection); this.paths = paths; this.revisionId = revisionId; @@ -63,40 +60,31 @@ /** * Constructs a new {@code FetchNodesForRevisionQuery}. * - * @param mongoConnection - * The {@link MongoConnection}. - * @param paths - * The paths to fetch. - * @param revisionId - * The revision id. + * @param mongoConnection The {@link MongoConnection}. + * @param paths The paths to fetch. + * @param revisionId The revision id. */ - public FetchNodesForRevisionQuery(MongoConnection mongoConnection, String[] paths, String revisionId) { + public FetchNodesForRevisionQuery(MongoConnection mongoConnection, String[] paths, + Long revisionId) { this(mongoConnection, new HashSet(Arrays.asList(paths)), revisionId); } @Override public List execute() { - List validRevisions = fetchValidRevisions(mongoConnection, revisionId); - + List validRevisions = new FetchValidRevisionsQuery(mongoConnection, revisionId).execute(); DBCursor dbCursor = retrieveAllNodes(); List nodes = QueryUtils.convertToNodes(dbCursor, validRevisions); - return nodes; } - private List fetchValidRevisions(MongoConnection mongoConnection, String revisionId) { - return new FetchValidRevisionsQuery(mongoConnection, revisionId).execute(); - } - private DBCursor retrieveAllNodes() { DBCollection nodeCollection = mongoConnection.getNodeCollection(); - DBObject query = QueryBuilder.start(NodeMongo.KEY_PATH).in(paths).and(NodeMongo.KEY_REVISION_ID) - .lessThanEquals(MongoUtil.toMongoRepresentation(revisionId)).get(); + DBObject query = QueryBuilder.start(NodeMongo.KEY_PATH).in(paths) + .and(NodeMongo.KEY_REVISION_ID) + .lessThanEquals(revisionId).get(); LOG.debug(String.format("Executing query: %s", query)); - DBCursor dbCursor = nodeCollection.find(query); - - return dbCursor; + return nodeCollection.find(query); } -} +} \ No newline at end of file Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQueryTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQueryTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQueryTest.java (working copy) @@ -26,6 +26,7 @@ import org.apache.jackrabbit.mongomk.api.model.Node; import org.apache.jackrabbit.mongomk.command.CommitCommandMongo; import org.apache.jackrabbit.mongomk.impl.NodeAssert; +import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder; import org.apache.jackrabbit.mongomk.impl.builder.NodeBuilder; import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl; import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; @@ -49,12 +50,12 @@ @Test public void fetchWithInvalidFirstRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId1); - updateBaseRevisionId(revisionId2, "0"); + updateBaseRevisionId(revisionId2, 0L); FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, new String[] { "/", "/a", "/b", "/c", "not_existing" }, revisionId3); @@ -68,9 +69,9 @@ @Test public void fetchWithInvalidLastRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId3); @@ -85,9 +86,9 @@ @Test public void fetchWithInvalidMiddleRevision() throws Exception { - String revisionId1 = addNode("a"); - String revisionId2 = addNode("b"); - String revisionId3 = addNode("c"); + Long revisionId1 = addNode("a"); + Long revisionId2 = addNode("b"); + Long revisionId3 = addNode("c"); invalidateCommit(revisionId2); updateBaseRevisionId(revisionId3, revisionId1); @@ -104,7 +105,7 @@ @Test public void fetchWithOneRevision() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String revisionId = scenario.create(); + Long revisionId = scenario.create(); FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, new String[] { "/", "/a", "/a/b", "/a/c", "not_existing" }, revisionId); @@ -129,11 +130,12 @@ @Test public void fetchWithTwoRevisions() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); + Long firstRevisionId = scenario.create(); + Long secondRevisionId = scenario.update_A_and_add_D_and_E(); - FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, new String[] { "/", "/a", - "/a/b", "/a/c", "/a/d", "/a/b/e", "not_existing" }, firstRevisionId); + FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, + new String[] { "/", "/a", "/a/b", "/a/c", "/a/d", "/a/b/e", "not_existing" }, + firstRevisionId); List nodeMongos = query.execute(); List actuals = NodeMongo.toNode(nodeMongos); Node expected = NodeBuilder @@ -155,32 +157,28 @@ NodeAssert.assertEquals(expecteds, actuals); } - private String addNode(String nodeName) throws Exception { - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", nodeName)); - Commit commit = new CommitImpl("/", "+" + nodeName, "Add /" + nodeName, instructions); + private Long addNode(String nodeName) throws Exception { + Commit commit = CommitBuilder.build("/", "+\"" + nodeName + "\" : {}", "Add /" + nodeName); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - return revisionId; + return command.execute(); } - private void invalidateCommit(String revisionId) { + private void invalidateCommit(Long revisionId) { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(revisionId)).get(); + .is(revisionId).get(); DBObject update = new BasicDBObject(); update.put("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); commitCollection.update(query, update); } - private void updateBaseRevisionId(String revisionId2, String baseRevisionId) { + private void updateBaseRevisionId(Long revisionId2, Long baseRevisionId) { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(revisionId2)) + .is(revisionId2) .get(); DBObject update = new BasicDBObject("$set", - new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, - MongoUtil.toMongoRepresentation(baseRevisionId))); + new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, baseRevisionId)); commitCollection.update(query, update); } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java (working copy) @@ -22,9 +22,8 @@ import java.util.List; import java.util.Map; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitMongo; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,8 +42,8 @@ private static final int LIMITLESS = 0; private static final Logger LOG = LoggerFactory.getLogger(FetchValidCommitsQuery.class); - private final String fromRevisionId; - private String toRevisionId; + private final Long fromRevisionId; + private Long toRevisionId; private int maxEntries = LIMITLESS; /** @@ -53,8 +52,8 @@ * @param mongoConnection Mongo connection. * @param fromRevisionId From revision id. */ - public FetchValidCommitsQuery(MongoConnection mongoConnection, String toRevisionId) { - this(mongoConnection, null, toRevisionId); + public FetchValidCommitsQuery(MongoConnection mongoConnection, Long toRevisionId) { + this(mongoConnection, 0L, toRevisionId); } /** @@ -64,8 +63,8 @@ * @param fromRevisionId From revision id. * @param toRevisionId To revision id. */ - public FetchValidCommitsQuery(MongoConnection mongoConnection, String fromRevisionId, - String toRevisionId) { + public FetchValidCommitsQuery(MongoConnection mongoConnection, Long fromRevisionId, + Long toRevisionId) { super(mongoConnection); this.fromRevisionId = fromRevisionId; this.toRevisionId = toRevisionId; @@ -81,8 +80,8 @@ */ public FetchValidCommitsQuery(MongoConnection mongoConnection, int maxEntries) { super(mongoConnection); - fromRevisionId = null; - toRevisionId = String.valueOf(Integer.MAX_VALUE); + fromRevisionId = 0L; + toRevisionId = Long.MAX_VALUE; this.maxEntries = maxEntries; } @@ -106,7 +105,7 @@ return validCommits; } - Long currentRevision = MongoUtil.toMongoRepresentation(toRevisionId); + Long currentRevision = toRevisionId; if (!revisions.containsKey(currentRevision)) { currentRevision = Collections.max(revisions.keySet()); } @@ -118,11 +117,9 @@ } validCommits.add(commitMongo); Long baseRevision = commitMongo.getBaseRevisionId(); - Long fromRevision = MongoUtil.toMongoRepresentation(fromRevisionId); - if ((currentRevision == 0L) || (baseRevision == null || baseRevision < fromRevision)) { + if ((currentRevision == 0L) || (baseRevision == null || baseRevision < fromRevisionId)) { break; } - currentRevision = baseRevision; } @@ -134,7 +131,7 @@ private DBCursor fetchListOfValidCommits() { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject query = QueryBuilder.start(CommitMongo.KEY_FAILED).notEquals(Boolean.TRUE) - .and(CommitMongo.KEY_REVISION_ID).lessThanEquals(MongoUtil.toMongoRepresentation(toRevisionId)) + .and(CommitMongo.KEY_REVISION_ID).lessThanEquals(toRevisionId) .get(); LOG.debug(String.format("Executing query: %s", query)); Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQueryTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQueryTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQueryTest.java (working copy) @@ -27,7 +27,6 @@ import org.apache.jackrabbit.mongomk.scenario.SimpleNodeScenario; import org.junit.Test; - public class FetchValidCommitsQueryTest extends BaseMongoTest { private static final int MIN_COMMITS = 1; @@ -36,7 +35,7 @@ @Test public void simple() throws Exception { FetchValidCommitsQuery query = new FetchValidCommitsQuery(mongoConnection, - String.valueOf(Integer.MAX_VALUE) /*maxRevisionId*/); + Long.MAX_VALUE); List commits = query.execute(); assertEquals(MIN_COMMITS, commits.size()); @@ -54,7 +53,7 @@ @Test public void revisionId() throws Exception { FetchValidCommitsQuery query = new FetchValidCommitsQuery(mongoConnection, - String.valueOf(Integer.MAX_VALUE) /*maxRevisionId*/); + Long.MAX_VALUE); List commits = query.execute(); CommitMongo commit0 = commits.get(0); @@ -74,7 +73,7 @@ @Test public void time() throws Exception { FetchValidCommitsQuery query = new FetchValidCommitsQuery(mongoConnection, - String.valueOf(Integer.MAX_VALUE) /*maxRevisionId*/); + Long.MAX_VALUE); List commits = query.execute(); CommitMongo commit0 = commits.get(0); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java (working copy) @@ -19,10 +19,9 @@ import java.util.ArrayList; import java.util.List; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitMongo; - /** * An query for fetching valid revisions. * @@ -30,24 +29,22 @@ */ public class FetchValidRevisionsQuery extends AbstractQuery> { - private final String maxRevisionId; + private final Long maxRevisionId; /** * Constructs a new {@code FetchValidRevisionsQuery}. * - * @param mongoConnection - * The {@link MongoConnection}. - * @param maxRevisionId - * The max revision id which should be fetched. + * @param mongoConnection The {@link MongoConnection}. + * @param maxRevisionId The max revision id which should be fetched. */ - public FetchValidRevisionsQuery(MongoConnection mongoConnection, String maxRevisionId) { + public FetchValidRevisionsQuery(MongoConnection mongoConnection, Long maxRevisionId) { super(mongoConnection); this.maxRevisionId = maxRevisionId; } @Override public List execute() { - List validCommits = fetchValidCommits(); + List validCommits = new FetchValidCommitsQuery(mongoConnection, maxRevisionId).execute(); List validRevisions = new ArrayList(validCommits.size()); for (CommitMongo commitMongo : validCommits) { validRevisions.add(commitMongo.getRevisionId()); @@ -55,8 +52,4 @@ return validRevisions; } - - private List fetchValidCommits() { - return new FetchValidCommitsQuery(mongoConnection, maxRevisionId).execute(); - } -} +} \ No newline at end of file Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetBlobLengthCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetBlobLengthCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetBlobLengthCommandMongo.java (working copy) @@ -16,8 +16,8 @@ */ package org.apache.jackrabbit.mongomk.command; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import com.mongodb.BasicDBObject; import com.mongodb.gridfs.GridFS; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetHeadRevisionCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetHeadRevisionCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetHeadRevisionCommandMongo.java (working copy) @@ -16,8 +16,8 @@ */ package org.apache.jackrabbit.mongomk.command; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.query.FetchHeadRevisionQuery; /** @@ -25,7 +25,7 @@ * * @author properties = expected.getProperties(); if (properties != null) { for (Map.Entry entry : properties.entrySet()) { @@ -113,7 +114,7 @@ Assert.assertEquals(children.size(), childNames.size()); Assert.assertEquals(children.size(), new HashSet(childNames).size()); for (Node child : children) { - assertNodesExist(expected.getPath(), child); + assertNodesExist(child); Assert.assertTrue(childNames.contains(child.getName())); } } else { Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java (working copy) @@ -20,6 +20,7 @@ import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.api.MicroKernelException; +import org.apache.jackrabbit.mk.util.NodeFilter; import org.apache.jackrabbit.mongomk.api.BlobStore; import org.apache.jackrabbit.mongomk.api.NodeStore; import org.apache.jackrabbit.mongomk.api.model.Commit; Index: oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoMicroKernelFixture.java =================================================================== --- oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoMicroKernelFixture.java (revision 1390863) +++ oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoMicroKernelFixture.java (working copy) @@ -21,12 +21,12 @@ import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.test.MicroKernelFixture; -import org.apache.jackrabbit.mongomk.BlobStoreMongo; -import org.apache.jackrabbit.mongomk.MongoConnection; -import org.apache.jackrabbit.mongomk.NodeStoreMongo; import org.apache.jackrabbit.mongomk.api.BlobStore; import org.apache.jackrabbit.mongomk.api.NodeStore; +import org.apache.jackrabbit.mongomk.impl.BlobStoreMongo; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.impl.MongoMicroKernel; +import org.apache.jackrabbit.mongomk.impl.NodeStoreMongo; import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.junit.Assert; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java (working copy) @@ -18,7 +18,7 @@ import java.util.Arrays; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitMongo; import org.apache.jackrabbit.mongomk.model.HeadMongo; import org.apache.jackrabbit.mongomk.model.NodeMongo; @@ -37,7 +37,7 @@ public static final String INITIAL_COMMIT_MESSAGE = "This is an autogenerated initial commit"; public static final String INITIAL_COMMIT_PATH = ""; - public static final String INITIAL_COMMIT_DIFF = "+/ : {}"; + public static final String INITIAL_COMMIT_DIFF = "+\"/\" : {}"; public static void clearCommitCollection(MongoConnection mongoConnection) { DBCollection commitCollection = mongoConnection.getCommitCollection(); @@ -63,7 +63,7 @@ public static void initCommitCollection(MongoConnection mongoConnection) { DBCollection commitCollection = mongoConnection.getCommitCollection(); DBObject index = new BasicDBObject(); - index.put(CommitMongo.KEY_REVISION_ID, Long.valueOf(1)); + index.put(CommitMongo.KEY_REVISION_ID, 1L); DBObject options = new BasicDBObject(); options.put("unique", Boolean.TRUE); commitCollection.ensureIndex(index, options); @@ -96,8 +96,8 @@ public static void initNodeCollection(MongoConnection mongoConnection) { DBCollection nodeCollection = mongoConnection.getNodeCollection(); DBObject index = new BasicDBObject(); - index.put(NodeMongo.KEY_PATH, Long.valueOf(1)); - index.put(NodeMongo.KEY_REVISION_ID, Long.valueOf(1)); + index.put(NodeMongo.KEY_PATH, 1L); + index.put(NodeMongo.KEY_REVISION_ID, 1L); DBObject options = new BasicDBObject(); options.put("unique", Boolean.TRUE); nodeCollection.ensureIndex(index, options); @@ -107,7 +107,11 @@ nodeCollection.insert(root); } + public static String fromMongoRepresentation(Long revisionId) { + return String.valueOf(revisionId); + } + public static Long toMongoRepresentation(String revisionId) { - return revisionId != null? Long.parseLong(revisionId) : 0L; + return revisionId != null? Long.parseLong(revisionId) : null; } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java (working copy) @@ -79,15 +79,15 @@ Map getProperties(); /** - * Returns the revision id of this node if known already, else this will return {@code null}. The revision id - * will be determined only after the commit has been successfully performed or the node has been read as part of an - * existing revision. + * Returns the revision id of this node if known already, else this will return {@code null}. + * The revision id will be determined only after the commit has been successfully + * performed or the node has been read as part of an existing revision. * - * @see #setRevisionId(String) + * @see #setRevisionId(Long) * * @return The revision id of this commit or {@code null}. */ - String getRevisionId(); + Long getRevisionId(); /** * Sets the revision id of this node. @@ -96,5 +96,5 @@ * * @param revisionId The revision id to set. */ - void setRevisionId(String revisionId); + void setRevisionId(Long revisionId); } Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/NodeAssert.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/NodeAssert.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/NodeAssert.java (working copy) @@ -81,8 +81,8 @@ Assert.assertEquals(expected.getName(), actual.getName()); Assert.assertEquals(expected.getPath(), actual.getPath()); - String expectedRevisionId = expected.getRevisionId(); - String actualRevisionId = actual.getRevisionId(); + Long expectedRevisionId = expected.getRevisionId(); + Long actualRevisionId = actual.getRevisionId(); if (expectedRevisionId == null) { Assert.assertNull(actualRevisionId); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java (working copy) @@ -23,6 +23,7 @@ import org.apache.jackrabbit.mongomk.api.model.Node; import org.apache.jackrabbit.mongomk.impl.json.JsonUtil; import org.apache.jackrabbit.mongomk.impl.model.NodeImpl; +import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.apache.jackrabbit.oak.commons.PathUtils; import org.json.JSONArray; import org.json.JSONException; @@ -95,7 +96,7 @@ } NodeImpl node = new NodeImpl(realPath); - node.setRevisionId(revisionId); + node.setRevisionId(MongoUtil.toMongoRepresentation(revisionId)); Map properties = null; for (@SuppressWarnings("rawtypes") Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilderTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilderTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilderTest.java (working copy) @@ -48,13 +48,13 @@ Node node = NodeBuilder.build(json); Node node_c = new NodeImpl("/a/c"); - node_c.setRevisionId("2"); + node_c.setRevisionId(2L); Node node_b = new NodeImpl("/a/b"); - node_b.setRevisionId("2"); + node_b.setRevisionId(2L); Node node_a = new NodeImpl("/a", new Node[] { node_b, node_c }); - node_a.setRevisionId("1"); + node_a.setRevisionId(1L); Node node_root = new NodeImpl("/", new Node[] { node_a }); - node_root.setRevisionId("1"); + node_root.setRevisionId(1L); NodeAssert.assertDeepEquals(node, node_root); } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongo.java (working copy) @@ -18,9 +18,9 @@ import java.util.Set; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; import org.apache.jackrabbit.mongomk.api.model.Node; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.oak.commons.PathUtils; /** @@ -31,7 +31,7 @@ public class NodeExistsCommandMongo extends AbstractCommand { private final MongoConnection mongoConnection; - private final String revisionId; + private final Long revisionId; private Node parentNode; private String path; @@ -41,9 +41,10 @@ * * @param mongoConnection The {@link MongoConnection}. * @param path The root path of the nodes to get. - * @param revisionId The {@link RevisionId} or {@code null}. + * @param revisionId The revision id or null. */ - public NodeExistsCommandMongo(MongoConnection mongoConnection, String path, String revisionId) { + public NodeExistsCommandMongo(MongoConnection mongoConnection, String path, + Long revisionId) { this.mongoConnection = mongoConnection; this.path = path; this.revisionId = revisionId; Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongoTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongoTest.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongoTest.java (working copy) @@ -20,15 +20,9 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.LinkedList; -import java.util.List; - import org.apache.jackrabbit.mongomk.BaseMongoTest; import org.apache.jackrabbit.mongomk.api.model.Commit; -import org.apache.jackrabbit.mongomk.api.model.Instruction; -import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl; -import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; -import org.apache.jackrabbit.mongomk.impl.model.RemoveNodeInstructionImpl; +import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder; import org.apache.jackrabbit.mongomk.scenario.SimpleNodeScenario; import org.junit.Test; @@ -38,7 +32,7 @@ @Test public void simple() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String revisionId = scenario.create(); + Long revisionId = scenario.create(); NodeExistsCommandMongo command = new NodeExistsCommandMongo( mongoConnection, "/a", revisionId); @@ -85,7 +79,7 @@ scenario.create(); NodeExistsCommandMongo command = new NodeExistsCommandMongo( - mongoConnection, "/a", "123456789"); + mongoConnection, "/a", 123456789L); try { command.execute(); fail("Expected: Invalid revision id exception"); @@ -111,22 +105,12 @@ @Test public void grandParentDelete() throws Exception { - // Add a->b->c->d. - List instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/", "a")); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - instructions.add(new AddNodeInstructionImpl("/a/b", "c")); - instructions.add(new AddNodeInstructionImpl("/a/b/c", "d")); - - Commit commit = new CommitImpl("/", "TODO", "Add nodes", instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, - commit); + Commit commit = CommitBuilder.build("/", "+\"a\" : { \"b\" : { \"c\" : { \"d\" : {} } } }", + "Add /a/b/c/d"); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); command.execute(); - // Remove b. - instructions = new LinkedList(); - instructions.add(new RemoveNodeInstructionImpl("/a", "b")); - commit = new CommitImpl("/a", "-b", "Delete /b", instructions); + commit = CommitBuilder.build("/a", "-\"b\"", "Remove /b"); command = new CommitCommandMongo(mongoConnection, commit); command.execute(); @@ -139,23 +123,12 @@ @Test public void existsInHeadRevision() throws Exception { - - List instructions = new LinkedList(); - - // Add /a - instructions.add(new AddNodeInstructionImpl("/", "a")); - Commit commit1 = new CommitImpl("/", "+a : {}", "Add node a", - instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, - commit1); + Commit commit = CommitBuilder.build("/", "+\"a\" : {}", "Add /a"); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); command.execute(); - // Add /a/b - instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/a", "b")); - Commit commit2 = new CommitImpl("/a", "+b : {}", "Add node a/b", - instructions); - command = new CommitCommandMongo(mongoConnection, commit2); + commit = CommitBuilder.build("/a", "+\"b\" : {}", "Add /a/b"); + command = new CommitCommandMongo(mongoConnection, commit); command.execute(); // Verify /a is visible in the head revision @@ -168,8 +141,8 @@ @Test public void existsInOldRevNotInNewRev() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String rev1 = scenario.create(); - String rev2 = scenario.delete_A(); + Long rev1 = scenario.create(); + Long rev2 = scenario.delete_A(); NodeExistsCommandMongo command = new NodeExistsCommandMongo( mongoConnection, "/a", rev1); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/NodeImpl.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/NodeImpl.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/model/NodeImpl.java (working copy) @@ -44,7 +44,7 @@ private String name; private String path; private Map properties; - private String revisionId; + private Long revisionId; /** * Constructs a new {@code NodeImpl}. @@ -209,12 +209,12 @@ } @Override - public String getRevisionId() { + public Long getRevisionId() { return revisionId; } @Override - public void setRevisionId(String revisionId) { + public void setRevisionId(Long revisionId) { this.revisionId = revisionId; } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/NodeMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/NodeMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/NodeMongo.java (working copy) @@ -27,7 +27,6 @@ import org.apache.jackrabbit.mongomk.api.model.Node; import org.apache.jackrabbit.mongomk.impl.model.NodeImpl; -import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.apache.jackrabbit.oak.commons.PathUtils; import com.mongodb.BasicDBObject; @@ -61,7 +60,7 @@ String path = node.getPath(); nodeMongo.setPath(path); - String revisionId = node.getRevisionId(); + Long revisionId = node.getRevisionId(); if (revisionId != null) { nodeMongo.setRevisionId(revisionId); } @@ -104,7 +103,6 @@ } public static NodeImpl toNode(NodeMongo nodeMongo) { - String revisionId = String.valueOf(nodeMongo.getRevisionId()); String path = nodeMongo.getPath(); List childNames = nodeMongo.getChildren(); long childCount = childNames != null ? childNames.size() : 0; @@ -119,6 +117,7 @@ } } + Long revisionId = nodeMongo.getRevisionId(); NodeImpl nodeImpl = new NodeImpl(); nodeImpl.setPath(path); nodeImpl.setChildCount(childCount); @@ -170,7 +169,8 @@ return true; } } - return addedChildExists(childName); + return false; + //return addedChildExists(childName); } private boolean addedChildExists(String childName) { @@ -247,10 +247,6 @@ put(KEY_REVISION_ID, revisionId); } - public void setRevisionId(String revisionId) { - this.setRevisionId(MongoUtil.toMongoRepresentation(revisionId)); - } - @Override public String toString() { StringBuilder sb = new StringBuilder(); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.HeadMongo; import com.mongodb.BasicDBObject; @@ -43,7 +43,7 @@ @Override public HeadMongo execute() throws Exception { DBObject query = new BasicDBObject(); - DBObject inc = new BasicDBObject(HeadMongo.KEY_NEXT_REVISION_ID, Long.valueOf(1)); + DBObject inc = new BasicDBObject(HeadMongo.KEY_NEXT_REVISION_ID, 1L); DBObject update = new BasicDBObject("$inc", inc); DBCollection headCollection = mongoConnection.getHeadCollection(); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/ReadBlobCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/ReadBlobCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/ReadBlobCommandMongo.java (working copy) @@ -19,8 +19,8 @@ import java.io.InputStream; import org.apache.commons.io.IOUtils; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import com.mongodb.BasicDBObject; import com.mongodb.gridfs.GridFS; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.HeadMongo; import com.mongodb.BasicDBObject; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.mongomk.query; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitMongo; import com.mongodb.DBCollection; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java (working copy) @@ -18,7 +18,7 @@ import java.util.Collection; -import org.apache.jackrabbit.mongomk.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; import com.mongodb.DBCollection; Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/scenario/SimpleNodeScenario.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/scenario/SimpleNodeScenario.java (revision 1390863) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/scenario/SimpleNodeScenario.java (working copy) @@ -19,29 +19,27 @@ import java.util.LinkedList; import java.util.List; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.model.Commit; import org.apache.jackrabbit.mongomk.api.model.Instruction; import org.apache.jackrabbit.mongomk.command.CommitCommandMongo; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; +import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder; import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl; import org.apache.jackrabbit.mongomk.impl.model.AddPropertyInstructionImpl; -import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; -import org.apache.jackrabbit.mongomk.impl.model.RemoveNodeInstructionImpl; /** * Creates a defined scenario in {@code MongoDB}. * * @author instructions = new LinkedList(); - instructions.add(new AddNodeInstructionImpl("/a", "child" + i)); - Commit commit = new CommitImpl("/a", "TODO", "Add child" + i, instructions); + Commit commit = CommitBuilder.build("/a", "+\"child" + i + "\" : {}", "Add child" + i); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); revisionId = command.execute(); } return revisionId; } - /** - * Deletes the a node. - * - *
-     * "-a"
-     * 
- * - * @return The {@link RevisionId}. - * @throws Exception - * If an error occurred. - */ - public String delete_A() throws Exception { - List instructions = new LinkedList(); - instructions.add(new RemoveNodeInstructionImpl("/", "a")); - - Commit commit = new CommitImpl("/", "-a", "This is a commit with deleted /a", - instructions); + public Long delete_A() throws Exception { + Commit commit = CommitBuilder.build("/", "-\"a\"", "This is a commit with deleted /a"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); - - return revisionId; + return command.execute(); } - public String delete_B() throws Exception { - List instructions = new LinkedList(); - instructions.add(new RemoveNodeInstructionImpl("/a", "b")); - Commit commit = new CommitImpl("/a", "-b", "This is a commit with deleted /a/b", - instructions); + public Long delete_B() throws Exception { + Commit commit = CommitBuilder.build("/a", "-\"b\"", "This is a commit with deleted /a/b"); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); return command.execute(); } - /** - * Updates the following nodes: - * - *
-     * TBD
-     * 
- * - * @return The {@link RevisionId}. - * @throws Exception - * If an error occurred. - */ - public String update_A_and_add_D_and_E() throws Exception { + public Long update_A_and_add_D_and_E() throws Exception { List instructions = new LinkedList(); instructions.add(new AddNodeInstructionImpl("/a", "d")); instructions.add(new AddNodeInstructionImpl("/a/b", "e")); @@ -140,11 +94,16 @@ instructions.add(new AddPropertyInstructionImpl("/a/b/e", "array", new Object[] { 123, null, 123.456D, "for:bar", Boolean.TRUE })); - Commit commit = new CommitImpl("", "TODO", "This is a commit with updated /a and added /a/d and /a/b/e", - instructions); - CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); - String revisionId = command.execute(); + StringBuilder diff = new StringBuilder(); + diff.append("+\"a/d\" : {}"); + diff.append("+\"a/b/e\" : {}"); + diff.append("+\"a/double\" : 0.123"); + diff.append("+\"a/d/null\" : null"); + diff.append("+\"a/b/e/array\" : [ 123, null, 123.456, \"for:bar\", true ]"); + Commit commit = CommitBuilder.build("/", diff.toString(), + "This is a commit with updated /a and added /a/d and /a/b/e"); - return revisionId; + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); + return command.execute(); } } Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/WriteBlobCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/WriteBlobCommandMongo.java (revision 1390863) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/WriteBlobCommandMongo.java (working copy) @@ -21,8 +21,8 @@ import java.io.InputStream; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.api.command.AbstractCommand; +import org.apache.jackrabbit.mongomk.impl.MongoConnection; import com.mongodb.BasicDBObject; import com.mongodb.gridfs.GridFS;