Created mongodb idempotent repository.
https://issues.apache.org/jira/browse/CAMEL-10006


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/eb36d34b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/eb36d34b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/eb36d34b

Branch: refs/heads/master
Commit: eb36d34bcda07824fe284805904f02a936cb51d1
Parents: f897449
Author: Joseluis Pedrosa <joseluis.pedr...@elephanttalk.com>
Authored: Wed Jun 1 15:41:49 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Jun 2 08:15:42 2016 +0200

----------------------------------------------------------------------
 .../idempotent/MongoDbIdempotentRepository.java | 127 ++++++++++++++++++
 .../component/mongodb/AbstractMongoDbTest.java  |   9 +-
 .../MongoDbIdempotentRepositoryTest.java        | 129 +++++++++++++++++++
 3 files changed, 259 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/eb36d34b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java
----------------------------------------------------------------------
diff --git 
a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java
 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java
new file mode 100644
index 0000000..56fc378
--- /dev/null
+++ 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java
@@ -0,0 +1,127 @@
+/**
+ * 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.camel.component.mongodb.processor.idempotent;
+
+
+import com.mongodb.ErrorCategory;
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.result.DeleteResult;
+import org.apache.camel.api.management.ManagedOperation;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.spi.IdempotentRepository;
+import org.apache.camel.support.ServiceSupport;
+import org.bson.BsonDocument;
+import org.bson.Document;
+
+
+@ManagedResource(description = "Mongo db based message id repository")
+public class MongoDbIdempotentRepository<E> extends ServiceSupport implements 
IdempotentRepository<E> {
+
+    private MongoClient cli;
+    private String collectionName;
+    private String dbName;
+
+    private MongoCollection<Document> collection;
+
+
+    public MongoDbIdempotentRepository(MongoClient cli, String collectionName, 
String dbName) {
+        this.cli = cli;
+        this.collectionName = collectionName;
+        this.dbName = dbName;
+        collection = cli.getDatabase(dbName).getCollection(collectionName);
+    }
+
+    @ManagedOperation(description = "Adds the key to the store")
+    @Override
+    public boolean add(E key) {
+
+        Document document = new Document("_id", key);
+        try {
+            collection.insertOne(document);
+        } catch (com.mongodb.MongoWriteException ex) {
+            if (ex.getError().getCategory() == ErrorCategory.DUPLICATE_KEY) {
+                return false;
+            }
+
+            throw ex;
+        }
+        return true;
+    }
+
+    @ManagedOperation(description = "Does the store contain the given key")
+    @Override
+    public boolean contains(E key) {
+        Document document = new Document("_id", key);
+        long count =  collection.count(document);
+        return count > 0;
+    }
+
+    @ManagedOperation(description = "Remove the key from the store")
+    @Override
+    public boolean remove(E key) {
+        Document document = new Document("_id", key);
+        DeleteResult res = collection.deleteOne(document);
+        return  res.getDeletedCount() > 0;
+    }
+
+    @Override
+    public boolean confirm(E key) {
+        return true;
+    }
+
+    @ManagedOperation(description = "Clear the store")
+    @Override
+    public void clear() {
+        collection.deleteMany(new BsonDocument());
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+
+    }
+
+    public MongoClient getCli() {
+        return cli;
+    }
+
+    public void setCli(MongoClient cli) {
+        this.cli = cli;
+    }
+
+    public String getCollectionName() {
+        return collectionName;
+    }
+
+    public void setCollectionName(String collectionName) {
+        this.collectionName = collectionName;
+    }
+
+    public String getDbName() {
+        return dbName;
+    }
+
+    public void setDbName(String dbName) {
+        this.dbName = dbName;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/eb36d34b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
index bf9e892..661fced 100644
--- 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
@@ -18,13 +18,8 @@ package org.apache.camel.component.mongodb;
 
 import java.util.Formatter;
 
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import com.mongodb.Mongo;
-import com.mongodb.WriteConcern;
+import com.mongodb.*;
 import com.mongodb.util.JSON;
-
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.component.properties.PropertiesComponent;
@@ -35,6 +30,8 @@ import org.apache.camel.util.ObjectHelper;
 import org.springframework.context.ApplicationContext;
 import 
org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
+
+
 public abstract class AbstractMongoDbTest extends CamelTestSupport {
 
     protected static Mongo mongo;

http://git-wip-us.apache.org/repos/asf/camel/blob/eb36d34b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryTest.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryTest.java
new file mode 100644
index 0000000..84156a1
--- /dev/null
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryTest.java
@@ -0,0 +1,129 @@
+/**
+ * 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.camel.component.mongodb.processor.idempotent;
+
+import java.util.UUID;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoClient;
+import org.apache.camel.component.mongodb.AbstractMongoDbTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+
+public class MongoDbIdempotentRepositoryTest extends AbstractMongoDbTest {
+
+
+    MongoDbIdempotentRepository<String> repo;
+
+    @Before
+    @After
+    public void clearDB() {
+        testCollection.remove(new BasicDBObject());
+    }
+
+    @Override
+    public void doPostSetup() {
+        super.doPostSetup();
+        repo = new MongoDbIdempotentRepository<>((MongoClient) mongo, 
testCollectionName, dbName);
+    }
+
+    @Test
+    public void add() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+
+        boolean added = repo.add(randomUUIDString);
+        assertEquals("Driver inserted document" , 1, testCollection.count());
+        assertTrue("Add ui returned true", added);
+    }
+
+    @Test
+    public void addAndContains() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+
+        repo.add(randomUUIDString);
+        assertEquals(1, testCollection.count());
+
+        boolean found =  repo.contains(randomUUIDString);
+        assertTrue("Added uid was found", found);
+    }
+
+    @Test
+    public void addAndRemove() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+
+        repo.add(randomUUIDString);
+        assertEquals(1, testCollection.count());
+
+        boolean removed =  repo.remove(randomUUIDString);
+        assertTrue("Added uid was removed correctly", removed);
+        assertEquals(0, testCollection.count());
+    }
+
+    @Test
+    public void addDuplicatedFails() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+
+        repo.add(randomUUIDString);
+        assertEquals(1, testCollection.count());
+
+        boolean added =  repo.add(randomUUIDString);
+        assertTrue("Duplicated entry was not added", !added);
+        assertEquals(1, testCollection.count());
+    }
+
+    @Test
+    public void deleteMissingiIsFailse() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+        assertEquals(0, testCollection.count());
+        boolean removed =  repo.remove(randomUUIDString);
+        assertTrue("Non exisint uid returns false", !removed);
+    }
+
+
+    @Test
+    public void containsMissingReturnsFalse() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+        boolean found =  repo.contains(randomUUIDString);
+        assertTrue("Non existing item is not found", !found);
+    }
+
+
+    @Test
+    public void confirmAllwaysReturnsTrue() throws Exception {
+
+        String randomUUIDString = UUID.randomUUID().toString();
+        boolean found =  repo.confirm(randomUUIDString);
+        assertTrue("Confirm always returns true", found);
+
+
+        found =  repo.confirm(null);
+        assertTrue("Confirm always returns true, even with null", found);
+
+    }
+
+}
+

Reply via email to