001: package org.apache.velocity.util;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.Iterator;
023: import java.util.NoSuchElementException;
024: import java.lang.reflect.Array;
025:
026: /**
027: * <p>
028: * An Iterator wrapper for an Object[]. This will
029: * allow us to deal with all array like structures
030: * in a consistent manner.
031: * </p>
032: * <p>
033: * WARNING : this class's operations are NOT synchronized.
034: * It is meant to be used in a single thread, newly created
035: * for each use in the #foreach() directive.
036: * If this is used or shared, synchronize in the
037: * next() method.
038: * </p>
039: *
040: * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
041: * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
042: * @version $Id: ArrayIterator.java 463298 2006-10-12 16:10:32Z henning $
043: */
044: public class ArrayIterator implements Iterator {
045: /**
046: * The objects to iterate.
047: */
048: private Object array;
049:
050: /**
051: * The current position and size in the array.
052: */
053: private int pos;
054: private int size;
055:
056: /**
057: * Creates a new iterator instance for the specified array.
058: *
059: * @param array The array for which an iterator is desired.
060: */
061: public ArrayIterator(Object array) {
062: /*
063: * if this isn't an array, then throw. Note that this is
064: * for internal use - so this should never happen - if it does
065: * we screwed up.
066: */
067:
068: if (!array.getClass().isArray()) {
069: throw new IllegalArgumentException(
070: "Programmer error : internal ArrayIterator invoked w/o array");
071: }
072:
073: this .array = array;
074: pos = 0;
075: size = Array.getLength(this .array);
076: }
077:
078: /**
079: * Move to next element in the array.
080: *
081: * @return The next object in the array.
082: */
083: public Object next() {
084: if (pos < size)
085: return Array.get(array, pos++);
086:
087: /*
088: * we screwed up...
089: */
090:
091: throw new NoSuchElementException("No more elements: " + pos
092: + " / " + size);
093: }
094:
095: /**
096: * Check to see if there is another element in the array.
097: *
098: * @return Whether there is another element.
099: */
100: public boolean hasNext() {
101: return (pos < size);
102: }
103:
104: /**
105: * No op--merely added to satify the <code>Iterator</code> interface.
106: */
107: public void remove() {
108: throw new UnsupportedOperationException();
109: }
110: }
|