Repository: camel
Updated Branches:
  refs/heads/master 3da84a6ba -> e3b86b977


Add a data structure to model the way the shard list works.


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

Branch: refs/heads/master
Commit: 8f5136af0ceb93db47858b6ba96b3388ea19c0e7
Parents: 78fd81e
Author: Candle <can...@candle.me.uk>
Authored: Fri Dec 11 10:49:56 2015 +0000
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Dec 16 14:19:11 2015 +0100

----------------------------------------------------------------------
 .../component/aws/ddbstream/ShardList.java      |  57 ++++++++++
 .../component/aws/ddbstream/ShardListTest.java  | 104 +++++++++++++++++++
 2 files changed, 161 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8f5136af/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java
----------------------------------------------------------------------
diff --git 
a/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java
 
b/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java
new file mode 100644
index 0000000..fb188f4
--- /dev/null
+++ 
b/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java
@@ -0,0 +1,57 @@
+package org.apache.camel.component.aws.ddbstream;
+
+import com.amazonaws.services.dynamodbv2.model.Shard;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+class ShardList {
+
+    private final Map<String, Shard> shards = new HashMap<>();
+
+    void addAll(Collection<Shard> shards) {
+        for (Shard shard : shards) {
+            add(shard);
+        }
+    }
+
+    void add(Shard shard) {
+        shards.put(shard.getShardId(), shard);
+    }
+
+    Shard nextAfter(Shard previous) {
+        for (Shard shard : shards.values()) {
+            if (previous.getShardId().equals(shard.getParentShardId())) {
+                return shard;
+            }
+        }
+        throw new IllegalStateException("Unable to find the next shard for " + 
previous + " in " + shards);
+    }
+
+    Shard first() {
+        for (Shard shard : shards.values()) {
+            if (!shards.containsKey(shard.getParentShardId())) {
+                return shard;
+            }
+        }
+        throw new IllegalStateException("Unable to find an unparented shard in 
" + shards);
+    }
+
+    /**
+     * Removes shards that are older than the provided shard.
+     * Does not remove the provided shard.
+     * @param removeBefore
+     */
+    void removeOlderThan(Shard removeBefore) {
+        String current = removeBefore.getParentShardId();
+
+        while (current != null) {
+            Shard s = shards.remove(current);
+            if (s == null) {
+                current = null;
+            } else {
+                current = s.getParentShardId();
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8f5136af/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java
 
b/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java
new file mode 100644
index 0000000..773f4a0
--- /dev/null
+++ 
b/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java
@@ -0,0 +1,104 @@
+package org.apache.camel.component.aws.ddbstream;
+
+import com.amazonaws.services.dynamodbv2.model.Shard;
+import java.util.ArrayList;
+import java.util.List;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import org.junit.Test;
+
+public class ShardListTest {
+
+    @Test
+    public void nextReturnsShardWithParent() throws Exception {
+        Shard first = new Shard()
+                .withShardId("first_shard")
+                .withParentShardId("other_shard_id");
+        Shard second = new Shard()
+                .withParentShardId("first_shard")
+                .withShardId("second_shard");
+
+        ShardList shards = new ShardList();
+        shards.add(first);
+        shards.add(second);
+
+        assertThat(shards.nextAfter(first), is(second));
+    }
+
+    @Test
+    public void nextWithNullReturnsFirstKnownShard() throws Exception {
+        Shard first = new Shard()
+                .withShardId("first_shard");
+        Shard second = new Shard()
+                .withParentShardId("first_shard")
+                .withShardId("second_shard");
+
+        ShardList shards = new ShardList();
+        shards.add(first);
+        shards.add(second);
+
+        assertThat(shards.nextAfter(first), is(second));
+    }
+
+    @Test
+    public void reAddingEntriesMaintainsOrder() throws Exception {
+        Shard first = new Shard()
+                .withShardId("first_shard");
+        Shard second = new Shard()
+                .withParentShardId("first_shard")
+                .withShardId("second_shard");
+
+        ShardList shards = new ShardList();
+        shards.add(first);
+        shards.add(second);
+
+        assertThat(shards.nextAfter(first), is(second));
+
+        Shard second2 = new Shard()
+                .withParentShardId("first_shard")
+                .withShardId("second_shard");
+        Shard third = new Shard()
+                .withParentShardId("second_shard")
+                .withShardId("third_shard");
+        shards.add(second2);
+        shards.add(third);
+
+        assertThat(shards.nextAfter(first), is(second));
+        assertThat(shards.nextAfter(second), is(third));
+    }
+
+    @Test
+    public void firstShardGetsTheFirstWithoutAParent() throws Exception {
+        ShardList shards = new ShardList();
+        shards.addAll(createShards(null, "a", "b", "c", "d"));
+
+        assertThat(shards.first().getShardId(), is("a"));
+    }
+
+    @Test
+    public void firstShardGetsTheFirstWithAnUnknownParent() throws Exception {
+        ShardList shards = new ShardList();
+        shards.addAll(createShards("a", "b", "c", "d"));
+
+        assertThat(shards.first().getShardId(), is("b"));
+    }
+
+    @Test
+    public void removingShards() throws Exception {
+        ShardList shards = new ShardList();
+        shards.addAll(createShards(null, "a", "b", "c", "d"));
+        Shard removeBefore = new 
Shard().withShardId("c").withParentShardId("b");
+        shards.removeOlderThan(removeBefore);
+        assertThat(shards.first().getShardId(), is("c"));
+    }
+
+    List<Shard> createShards(String initialParent, String... shardIds) {
+        String previous = initialParent;
+        List<Shard> result = new ArrayList<>();
+        for (String s : shardIds) {
+            result.add(new Shard().withShardId(s).withParentShardId(previous));
+            previous = s;
+        }
+        return result;
+    }
+}
\ No newline at end of file

Reply via email to