summaryrefslogtreecommitdiffstats
path: root/yolean/src/main/java/com/yahoo/yolean/chain/Chain.java
diff options
context:
space:
mode:
Diffstat (limited to 'yolean/src/main/java/com/yahoo/yolean/chain/Chain.java')
-rw-r--r--yolean/src/main/java/com/yahoo/yolean/chain/Chain.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/yolean/src/main/java/com/yahoo/yolean/chain/Chain.java b/yolean/src/main/java/com/yahoo/yolean/chain/Chain.java
new file mode 100644
index 00000000000..86ff0e07d00
--- /dev/null
+++ b/yolean/src/main/java/com/yahoo/yolean/chain/Chain.java
@@ -0,0 +1,98 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.yolean.chain;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * An immutable and ordered list of components
+ *
+ * @author tonytv
+ */
+public final class Chain<T> implements Iterable<T> {
+
+ private final String id;
+ private final Collection<T> components;
+
+ @SafeVarargs
+ public Chain(String id, T... components) {
+ this(id, Arrays.asList(components));
+ }
+
+ public Chain(String id, List<? extends T> components) {
+ requireNonNull(id, "id must be non-null.");
+ requireNonNull(components, "components must be non-null");
+
+ this.components = ImmutableList.copyOf(components);
+ this.id = id;
+ }
+
+ public String id() {
+ return id;
+ }
+
+ public boolean isEmpty() {
+ return components.isEmpty();
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return components.iterator();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder b = new StringBuilder();
+ b.append("chain '").append(id).append("'{");
+ boolean first = true;
+ for (T component : components) {
+ if (!first) {
+ b.append("->");
+ } else {
+ first = false;
+ }
+ b.append(" ").append(component.getClass().getSimpleName()).append(" ");
+ }
+ b.append("}");
+ return b.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other instanceof Chain && equals((Chain<?>)other);
+ }
+
+ public boolean equals(Chain<?> other) {
+ return id.equals(other.id) && componentsIdentical(components, other.components);
+ }
+
+ private boolean componentsIdentical(Collection<T> components1, Collection<?> components2) {
+ if (components1.size() != components2.size()) {
+ return false;
+ }
+ Iterator<T> iterator1 = components1.iterator();
+ Iterator<?> iterator2 = components2.iterator();
+ while (iterator1.hasNext()) {
+ T c1 = iterator1.next();
+ Object c2 = iterator2.next();
+
+ if (c1 != c2) {
+ return false;
+ }
+ }
+ return true;
+ }
+}