Index: oak-mongomk/src/test/resources/logback-test.xml =================================================================== --- oak-mongomk/src/test/resources/logback-test.xml (revision 0) +++ oak-mongomk/src/test/resources/logback-test.xml (working copy) @@ -0,0 +1,39 @@ + + + + + + %date{HH:mm:ss.SSS} %-5level %-40([%thread] %F:%L) %msg%n + + + + + target/unit-tests.log + + %date{HH:mm:ss.SSS} %-5level %-40([%thread] %F:%L) %msg%n + + + + + + + + + Property changes on: oak-mongomk/src/test/resources/logback-test.xml ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java (revision 1389420) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java (working copy) @@ -21,7 +21,6 @@ import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.util.MongoUtil; -import org.apache.log4j.BasicConfigurator; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -40,7 +39,6 @@ @BeforeClass public static void setUpBeforeClass() throws Exception { - BasicConfigurator.configure(); createDefaultMongoConnection(); MongoAssert.setMongoConnection(mongoConnection); } 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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitCommandInstructionVisitor.java (working copy) @@ -50,18 +50,14 @@ @Override public void visit(AddNodeInstruction instruction) { -// Old code -// String path = instruction.getPath(); -// getStagedNode(path); -// if (!PathUtils.denotesRoot(path)) { -// String parentPath = PathUtils.getParentPath(path); -// NodeMongo parentNode = getStagedNode(parentPath); -// parentNode.addChild(PathUtils.getName(path)); -// } - String path = instruction.getPath(); getStagedNode(path); + String nodeName = PathUtils.getName(path); + if (nodeName.isEmpty()) { + return; + } + String parentNodePath = PathUtils.getParentPath(path); NodeMongo parent = null; if (!PathUtils.denotesRoot(parentNodePath)) { @@ -69,10 +65,9 @@ if (parent == null) { throw new RuntimeException("No such parent: " + PathUtils.getName(parentNodePath)); } - // FIXME [Mete] Add once tests are fixed. - //if (parent.childExists(nodeName)) { - // throw new RuntimeException("There's already a child node with name '" + nodeName + "'"); - //} + if (parent.childExists(nodeName)) { + throw new RuntimeException("There's already a child node with name '" + nodeName + "'"); + } } else { parent = getStagedNode(parentNodePath); } @@ -213,8 +208,11 @@ public void visit(RemoveNodeInstruction instruction) { String path = instruction.getPath(); String parentPath = PathUtils.getParentPath(path); - NodeMongo parentNode = getStagedNode(parentPath); - // [Mete] What if there is no such child? + NodeMongo parentNode = getStoredNode(parentPath); + String childName = PathUtils.getName(path); + if (!parentNode.childExists(childName)) { + throw new RuntimeException(path); + } parentNode.removeChild(PathUtils.getName(path)); } 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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongo.java (working copy) @@ -36,7 +36,8 @@ import org.apache.jackrabbit.mongomk.query.SaveAndSetHeadRevisionQuery; import org.apache.jackrabbit.mongomk.query.SaveCommitQuery; import org.apache.jackrabbit.mongomk.query.SaveNodesQuery; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; @@ -51,7 +52,7 @@ */ public class CommitCommandMongo extends AbstractCommand { - private static final Logger logger = Logger.getLogger(CommitCommandMongo.class); + private static final Logger logger = LoggerFactory.getLogger(CommitCommandMongo.class); private final Commit commit; private final MongoConnection mongoConnection; Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongoTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongoTest.java (revision 1389420) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongoTest.java (working copy) @@ -32,6 +32,7 @@ import org.apache.jackrabbit.mongomk.impl.model.CommitImpl; import org.apache.jackrabbit.mongomk.impl.model.RemoveNodeInstructionImpl; import org.apache.jackrabbit.mongomk.scenario.SimpleNodeScenario; +import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.apache.jackrabbit.oak.commons.PathUtils; import org.junit.Assert; import org.junit.Ignore; @@ -77,7 +78,7 @@ } @Test - public void commitAddNodes() throws Exception { + public void addNodes() throws Exception { List instructions = new LinkedList(); instructions.add(new AddNodeInstructionImpl("/", "a")); instructions.add(new AddNodeInstructionImpl("/a", "b")); @@ -99,7 +100,29 @@ } @Test - public void commitAddNodesAndPropertiesOutOfOrder() throws Exception { + 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); + 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); + command = new CommitCommandMongo(mongoConnection, commit); + try { + command.execute(); + fail("Exception expected"); + } catch (Exception expected) { + } + } + + @Test + public void addNodesAndPropertiesOutOfOrder() throws Exception { List instructions = new LinkedList(); instructions.add(new AddPropertyInstructionImpl("/a", "key1", "value1")); instructions.add(new AddNodeInstructionImpl("/", "a")); @@ -129,7 +152,7 @@ } @Test - public void commitAddNodesWhichAlreadyExist() throws Exception { + public void addNodesWhichAlreadyExist() throws Exception { SimpleNodeScenario scenario1 = new SimpleNodeScenario(mongoConnection); scenario1.create(); @@ -230,7 +253,6 @@ } @Test - @Ignore // FIXME public void removeNonExistentNode() throws Exception { List instructions = new LinkedList(); instructions.add(new AddNodeInstructionImpl("/", "a")); @@ -368,18 +390,18 @@ } @Test - @Ignore /// FIXME public void rootNodeHasEmptyRootPath() throws Exception { List instructions = new LinkedList(); instructions.add(new AddNodeInstructionImpl("", "/")); - Commit commit = new CommitImpl("", "+/ : {}", "This is the root commit", instructions); + Commit commit = new CommitImpl(MongoUtil.INITIAL_COMMIT_PATH, MongoUtil.INITIAL_COMMIT_DIFF, + MongoUtil.INITIAL_COMMIT_MESSAGE, instructions); CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); String revisionId = command.execute(); - Assert.assertNotNull(revisionId); - MongoAssert.assertNodesExist("", - NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", revisionId))); + + Node expected = NodeBuilder.build(String.format("{ \"/#%1$s\" : {} }", revisionId)); + MongoAssert.assertNodesExist(MongoUtil.INITIAL_COMMIT_PATH, expected); } @Test 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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java (working copy) @@ -22,7 +22,8 @@ import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; import org.apache.jackrabbit.mongomk.util.MongoUtil; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -35,7 +36,9 @@ * @author Philipp Marx - */ -@SuppressWarnings("all") public class FetchNodesByPathAndDepthQueryTest extends BaseMongoTest { @Test - @Ignore - public void testFetchWithInvalidFirstRevision() throws Exception { - SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); - SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario.update_A_and_add_D_and_E(); + public void fetchWithInvalidFirstRevision() throws Exception { + String revisionId1 = addNode("a"); + String revisionId2 = addNode("b"); + String revisionId3 = addNode("c"); - DBCollection commitCollection = mongoConnection.getCommitCollection(); - DBObject q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(firstRevisionId)).get(); - DBObject u = new BasicDBObject("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); - commitCollection.update(q, u); + invalidateCommit(revisionId1); + updateBaseRevisionId(revisionId2, "0"); - q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID).is(MongoUtil.toMongoRepresentation(secondRevisionId)) - .get(); - u = new BasicDBObject("$set", new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, 0L)); - commitCollection.update(q, u); + FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, + "/", revisionId3, -1); + List actuals = NodeMongo.toNode(query.execute()); - FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, "/", thirdRevisionId, - -1); - List result = query.execute(); - List actuals = NodeMongo.toNode(result); - Node expected = NodeBuilder - .build(String - .format("{ \"/#%0$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%3$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"d#%3$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId, - thirdRevisionId)); - Set expecteds = expected.getDescendants(true); + //String json = String.format("{\"/#%1$s\" : { \"a#%2$s\" : {}, \"b#%3$s\" : {}, \"c#%1$s\" : {} }}", revisionId3, revisionId1, revisionId2); + String json = String.format("{\"/#%2$s\" : { \"b#%1$s\" : {}, \"c#%2$s\" : {} }}", revisionId2, revisionId3); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testFetchWithInvalidLastRevision() throws Exception { - SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); - SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario.update_A_and_add_D_and_E(); + public void fetchWithInvalidLastRevision() throws Exception { + String revisionId1 = addNode("a"); + String revisionId2 = addNode("b"); + String revisionId3 = addNode("c"); - DBCollection commitCollection = mongoConnection.getCommitCollection(); - DBObject q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(thirdRevisionId)).get(); - DBObject u = new BasicDBObject(); - u.put("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); - commitCollection.update(q, u); + invalidateCommit(revisionId3); - FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, "/", thirdRevisionId, - -1); - List result = query.execute(); - List actuals = NodeMongo.toNode(result); - Node expected = 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)); - Set expecteds = expected.getDescendants(true); + FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, + "/", revisionId3, -1); + List actuals = NodeMongo.toNode(query.execute()); + + //String json = String.format("{\"/#%1$s\" : { \"a#%2$s\" : {}, \"b#%3$s\" : {}, \"c#%1$s\" : {} }}", revisionId3, revisionId1, revisionId2); + String json = String.format("{\"/#%2$s\" : { \"a#%1$s\" : {}, \"b#%2$s\" : {} }}", revisionId1, revisionId2); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testFetchWithInvalidMiddleRevision() throws Exception { - SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); - SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario.update_A_and_add_D_and_E(); + public void fetchWithInvalidMiddleRevision() throws Exception { + String revisionId1 = addNode("a"); + String revisionId2 = addNode("b"); + String revisionId3 = addNode("c"); - DBCollection commitCollection = mongoConnection.getCommitCollection(); - DBObject q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(secondRevisionId)).get(); - DBObject u = new BasicDBObject("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); - commitCollection.update(q, u); + invalidateCommit(revisionId2); + updateBaseRevisionId(revisionId3, revisionId1); - q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID).is(MongoUtil.toMongoRepresentation(thirdRevisionId)) - .get(); - u = new BasicDBObject(); - u.put("$set", - new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, MongoUtil - .toMongoRepresentation(firstRevisionId))); - commitCollection.update(q, u); + FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, + "/", revisionId3, -1); + List actuals = NodeMongo.toNode(query.execute()); - FetchNodesByPathAndDepthQuery query = new FetchNodesByPathAndDepthQuery(mongoConnection, "/", thirdRevisionId, - -1); - List result = query.execute(); - List actuals = NodeMongo.toNode(result); - Node expected = NodeBuilder - .build(String - .format("{ \"/#%1$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%3$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%1$s\" : { \"bool\" : true }, \"d#%3$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId, - thirdRevisionId)); - Set expecteds = expected.getDescendants(true); + String json = String.format("{\"/#%2$s\" : { \"a#%1$s\" : {}, \"c#%2$s\" : {} }}", revisionId1, revisionId3); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testSimpleFetchRootAndAllDepths() throws Exception { + public void simpleFetchRootAndAllDepths() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); String firstRevisionId = scenario.create(); String secondRevisionId = scenario.update_A_and_add_D_and_E(); @@ -215,4 +175,33 @@ expecteds = expected.getDescendants(true); 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); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); + String revisionId = command.execute(); + return revisionId; + } + + private void invalidateCommit(String revisionId) { + DBCollection commitCollection = mongoConnection.getCommitCollection(); + DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) + .is(MongoUtil.toMongoRepresentation(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) { + DBCollection commitCollection = mongoConnection.getCommitCollection(); + DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) + .is(MongoUtil.toMongoRepresentation(revisionId2)) + .get(); + DBObject update = new BasicDBObject("$set", + new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, + MongoUtil.toMongoRepresentation(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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java (working copy) @@ -24,7 +24,8 @@ import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.model.NodeMongo; import org.apache.jackrabbit.mongomk.util.MongoUtil; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -37,7 +38,9 @@ * @author nodeMongos = query.execute(); - List actuals = NodeMongo.toNode(nodeMongos); - Node expected = NodeBuilder - .build(String - .format("{ \"/#%1$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%3$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%1$s\" : { \"bool\" : true }, \"d#%3$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId, - thirdRevisionId)); - Set expecteds = expected.getDescendants(true); + FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, + new String[] { "/", "/a", "/b", "/c", "not_existing" }, revisionId3); + List actuals = NodeMongo.toNode(query.execute()); + + //String json = String.format("{\"/#%1$s\" : { \"a#%2$s\" : {}, \"b#%3$s\" : {}, \"c#%1$s\" : {} }}", revisionId3, revisionId1, revisionId2); + String json = String.format("{\"/#%2$s\" : { \"b#%1$s\" : {}, \"c#%2$s\" : {} }}", revisionId2, revisionId3); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testFetchWithInvalidLastRevision() throws Exception { - SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); - SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario.update_A_and_add_D_and_E(); + public void fetchWithInvalidLastRevision() throws Exception { + String revisionId1 = addNode("a"); + String revisionId2 = addNode("b"); + String revisionId3 = addNode("c"); - DBCollection commitCollection = mongoConnection.getCommitCollection(); - DBObject q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(thirdRevisionId)).get(); - DBObject u = new BasicDBObject(); - u.put("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); - commitCollection.update(q, u); + invalidateCommit(revisionId3); - FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, new String[] { "/", "/a", - "/a/b", "/a/c", "/a/d", "/a/b/e", "not_existing" }, thirdRevisionId); - List nodeMongos = query.execute(); - List actuals = NodeMongo.toNode(nodeMongos); - Node expected = 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)); - Set expecteds = expected.getDescendants(true); + FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, + new String[] { "/", "/a", "/b", "/c", "not_existing" }, revisionId3); + List actuals = NodeMongo.toNode(query.execute()); + + String json = String.format("{\"/#%2$s\" : { \"a#%1$s\" : {}, \"b#%2$s\" : {} }}", revisionId1, revisionId2); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testFetchWithInvalidMiddleRevision() throws Exception { - SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); - String firstRevisionId = scenario.create(); - String secondRevisionId = scenario.update_A_and_add_D_and_E(); - SimpleNodeScenario scenario2 = new SimpleNodeScenario(mongoConnection); - String thirdRevisionId = scenario.update_A_and_add_D_and_E(); + public void fetchWithInvalidMiddleRevision() throws Exception { + String revisionId1 = addNode("a"); + String revisionId2 = addNode("b"); + String revisionId3 = addNode("c"); - DBCollection commitCollection = mongoConnection.getCommitCollection(); - DBObject q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) - .is(MongoUtil.toMongoRepresentation(secondRevisionId)).get(); - DBObject u = new BasicDBObject("$set", new BasicDBObject(CommitMongo.KEY_FAILED, Boolean.TRUE)); - commitCollection.update(q, u); + invalidateCommit(revisionId2); + updateBaseRevisionId(revisionId3, revisionId1); - q = QueryBuilder.start(CommitMongo.KEY_REVISION_ID).is(MongoUtil.toMongoRepresentation(thirdRevisionId)) - .get(); - u = new BasicDBObject(); - u.put("$set", - new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, MongoUtil - .toMongoRepresentation(firstRevisionId))); - commitCollection.update(q, u); + FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, + new String[] { "/", "/a", "/b", "/c", "not_existing" }, revisionId3); + List actuals = NodeMongo.toNode(query.execute()); - FetchNodesForRevisionQuery query = new FetchNodesForRevisionQuery(mongoConnection, new String[] { "/", "/a", - "/a/b", "/a/c", "/a/d", "/a/b/e", "not_existing" }, thirdRevisionId); - List nodeMongos = query.execute(); - List actuals = NodeMongo.toNode(nodeMongos); - Node expected = NodeBuilder - .build(String - .format("{ \"/#%1$s\" : { \"a#%3$s\" : { \"int\" : 1 , \"double\" : 0.123 , \"b#%3$s\" : { \"string\" : \"foo\" , \"e#%3$s\" : { \"array\" : [ 123, null, 123.456, \"for:bar\", true ] } } , \"c#%1$s\" : { \"bool\" : true }, \"d#%3$s\" : { \"null\" : null } } } }", - firstRevisionId, secondRevisionId, - thirdRevisionId)); - Set expecteds = expected.getDescendants(true); + String json = String.format("{\"/#%2$s\" : { \"a#%1$s\" : {}, \"c#%2$s\" : {} }}", revisionId1, revisionId3); + Set expecteds = NodeBuilder.build(json).getDescendants(true); NodeAssert.assertEquals(expecteds, actuals); } @Test - public void testFetchWithOneRevision() throws Exception { + public void fetchWithOneRevision() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); String revisionId = scenario.create(); @@ -158,7 +127,7 @@ } @Test - public void testFetchWithTwoRevisions() throws Exception { + public void fetchWithTwoRevisions() throws Exception { SimpleNodeScenario scenario = new SimpleNodeScenario(mongoConnection); String firstRevisionId = scenario.create(); String secondRevisionId = scenario.update_A_and_add_D_and_E(); @@ -185,4 +154,33 @@ expecteds = expected.getDescendants(true); 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); + CommitCommandMongo command = new CommitCommandMongo(mongoConnection, commit); + String revisionId = command.execute(); + return revisionId; + } + + private void invalidateCommit(String revisionId) { + DBCollection commitCollection = mongoConnection.getCommitCollection(); + DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) + .is(MongoUtil.toMongoRepresentation(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) { + DBCollection commitCollection = mongoConnection.getCommitCollection(); + DBObject query = QueryBuilder.start(CommitMongo.KEY_REVISION_ID) + .is(MongoUtil.toMongoRepresentation(revisionId2)) + .get(); + DBObject update = new BasicDBObject("$set", + new BasicDBObject(CommitMongo.KEY_BASE_REVISION_ID, + MongoUtil.toMongoRepresentation(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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java (working copy) @@ -25,7 +25,8 @@ import org.apache.jackrabbit.mongomk.MongoConnection; import org.apache.jackrabbit.mongomk.model.CommitMongo; import org.apache.jackrabbit.mongomk.util.MongoUtil; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -40,7 +41,7 @@ public class FetchValidCommitsQuery extends AbstractQuery> { private static final int LIMITLESS = 0; - private static final Logger LOG = Logger.getLogger(FetchValidCommitsQuery.class); + private static final Logger LOG = LoggerFactory.getLogger(FetchValidCommitsQuery.class); private final String fromRevisionId; private String toRevisionId; Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetNodesCommandMongo.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetNodesCommandMongo.java (revision 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetNodesCommandMongo.java (working copy) @@ -32,7 +32,8 @@ import org.apache.jackrabbit.mongomk.query.FetchValidCommitsQuery; import org.apache.jackrabbit.mongomk.util.MongoUtil; import org.apache.jackrabbit.oak.commons.PathUtils; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A {@code Command} for getting nodes from {@code MongoDB}. @@ -45,7 +46,7 @@ private static final long serialVersionUID = 8155418280936077632L; } - private static final Logger LOG = Logger.getLogger(GetNodesCommandMongo.class); + private static final Logger LOG = LoggerFactory.getLogger(GetNodesCommandMongo.class); private final MongoConnection mongoConnection; private final String path; 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 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java (working copy) @@ -35,6 +35,10 @@ @SuppressWarnings("javadoc") public class MongoUtil { + 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 void clearCommitCollection(MongoConnection mongoConnection) { DBCollection commitCollection = mongoConnection.getCommitCollection(); commitCollection.drop(); @@ -66,9 +70,9 @@ CommitMongo commit = new CommitMongo(); commit.setAffectedPaths(Arrays.asList(new String[] { "/" })); commit.setBaseRevId(0L); - commit.setDiff("+/ : {}"); - commit.setMessage("This is an autogenerated initial commit"); - commit.setPath(""); + commit.setDiff(INITIAL_COMMIT_DIFF); + commit.setMessage(INITIAL_COMMIT_MESSAGE); + commit.setPath(INITIAL_COMMIT_PATH); commit.setRevisionId(0L); commitCollection.insert(commit); } Index: oak-mongomk/pom.xml =================================================================== --- oak-mongomk/pom.xml (revision 1389420) +++ oak-mongomk/pom.xml (working copy) @@ -26,7 +26,8 @@ org.apache.jackrabbit oak-parent - 0.5-SNAPSHOT + 0.6-SNAPSHOT + ../oak-parent/pom.xml oak-mongomk @@ -50,9 +51,9 @@ - log4j - log4j - 1.2.16 + org.slf4j + slf4j-api + 1.6.4 @@ -84,6 +85,12 @@ 3.1 test + + ch.qos.logback + logback-classic + 1.0.1 + test + Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java (revision 1389420) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java (working copy) @@ -22,7 +22,8 @@ import java.util.Map; import org.apache.jackrabbit.mongomk.model.NodeMongo; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.mongodb.DBCursor; @@ -33,7 +34,7 @@ */ public class QueryUtils { - private static final Logger LOG = Logger.getLogger(QueryUtils.class); + private static final Logger LOG = LoggerFactory.getLogger(QueryUtils.class); /** * Reads nodes from the given {@link DBCursor} and add them to the returned list if their revision id is contained