summaryrefslogtreecommitdiff
path: root/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java
diff options
context:
space:
mode:
authorArun Murthy <acmurthy@apache.org>2011-08-25 00:14:24 +0000
committerArun Murthy <acmurthy@apache.org>2011-08-25 00:14:24 +0000
commitcd7157784e5e5ddc4e77144d042e54dd0d04bac1 (patch)
tree04717b2c3e77d2f2f60629208f27e39ea3e27bc9 /hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java
parentbb0005cfec5fd2861600ff5babd259b48ba18b63 (diff)
HADOOP-7560. Change src layout to be heirarchical. Contributed by Alejandro Abdelnur.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1161332 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java')
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java
new file mode 100644
index 0000000000..78c385eab2
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/CyclicIteration.java
@@ -0,0 +1,113 @@
+/**
+ * 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.hadoop.hdfs.util;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.NoSuchElementException;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+/** Provide an cyclic {@link Iterator} for a {@link NavigableMap}.
+ * The {@link Iterator} navigates the entries of the map
+ * according to the map's ordering.
+ * If the {@link Iterator} hits the last entry of the map,
+ * it will then continue from the first entry.
+ */
+@InterfaceAudience.Private
+@InterfaceStability.Unstable
+public class CyclicIteration<K, V> implements Iterable<Map.Entry<K, V>> {
+ private final NavigableMap<K, V> navigablemap;
+ private final NavigableMap<K, V> tailmap;
+
+ /** Construct an {@link Iterable} object,
+ * so that an {@link Iterator} can be created
+ * for iterating the given {@link NavigableMap}.
+ * The iteration begins from the starting key exclusively.
+ */
+ public CyclicIteration(NavigableMap<K, V> navigablemap, K startingkey) {
+ if (navigablemap == null || navigablemap.isEmpty()) {
+ this.navigablemap = null;
+ this.tailmap = null;
+ }
+ else {
+ this.navigablemap = navigablemap;
+ this.tailmap = navigablemap.tailMap(startingkey, false);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public Iterator<Map.Entry<K, V>> iterator() {
+ return new CyclicIterator();
+ }
+
+ /** An {@link Iterator} for {@link CyclicIteration}. */
+ private class CyclicIterator implements Iterator<Map.Entry<K, V>> {
+ private boolean hasnext;
+ private Iterator<Map.Entry<K, V>> i;
+ /** The first entry to begin. */
+ private final Map.Entry<K, V> first;
+ /** The next entry. */
+ private Map.Entry<K, V> next;
+
+ private CyclicIterator() {
+ hasnext = navigablemap != null;
+ if (hasnext) {
+ i = tailmap.entrySet().iterator();
+ first = nextEntry();
+ next = first;
+ }
+ else {
+ i = null;
+ first = null;
+ next = null;
+ }
+ }
+
+ private Map.Entry<K, V> nextEntry() {
+ if (!i.hasNext()) {
+ i = navigablemap.entrySet().iterator();
+ }
+ return i.next();
+ }
+
+ /** {@inheritDoc} */
+ public boolean hasNext() {
+ return hasnext;
+ }
+
+ /** {@inheritDoc} */
+ public Map.Entry<K, V> next() {
+ if (!hasnext) {
+ throw new NoSuchElementException();
+ }
+
+ final Map.Entry<K, V> curr = next;
+ next = nextEntry();
+ hasnext = !next.equals(first);
+ return curr;
+ }
+
+ /** Not supported */
+ public void remove() {
+ throw new UnsupportedOperationException("Not supported");
+ }
+ }
+}