1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.jexl3.internal.introspection;
19
20 import java.lang.reflect.Array;
21 import java.util.Iterator;
22 import java.util.NoSuchElementException;
23
24 /**
25 * <p>
26 * An Iterator wrapper for an Object[]. This will
27 * allow us to deal with all array like structures
28 * in a consistent manner.
29 * </p>
30 * <p>
31 * WARNING : this class's operations are NOT synchronized.
32 * It is meant to be used in a single thread, newly created
33 * for each use in the #foreach() directive.
34 * If this is used or shared, synchronize in the
35 * next() method.
36 * </p>
37 *
38 * @since 1.0
39 */
40 public class ArrayIterator implements Iterator<Object> {
41 /** The objects to iterate over. */
42 private final Object array;
43 /** The size of the array. */
44 private final int size;
45 /** The current position and size in the array. */
46 private int pos;
47
48 /**
49 * Creates a new iterator instance for the specified array.
50 * @param arr The array for which an iterator is desired.
51 */
52 public ArrayIterator(final Object arr) {
53 if (arr == null) {
54 array = null;
55 pos = 0;
56 size = 0;
57 } else if (!arr.getClass().isArray()) {
58 throw new IllegalArgumentException(arr.getClass() + " is not an array");
59 } else {
60 array = arr;
61 pos = 0;
62 size = Array.getLength(array);
63 }
64 }
65
66 /**
67 * Check to see if there is another element in the array.
68 *
69 * @return Whether there is another element.
70 */
71 @Override
72 public boolean hasNext() {
73 return pos < size;
74 }
75
76 /**
77 * Move to next element in the array.
78 *
79 * @return The next object in the array.
80 */
81 @Override
82 public Object next() {
83 if (pos < size) {
84 return Array.get(array, pos++);
85 }
86 // we screwed up...
87 throw new NoSuchElementException("No more elements: " + pos
88 + " / " + size);
89 }
90 }