/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed 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.seasar.mayaa.impl.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import org.seasar.mayaa.cycle.scope.AttributeScope;
/**
* 配列やEnumeration, Collectionなどを共通で扱ってIteratorを取得するためのユーティリティ。
* AttributeScopeの場合はiterateAttributeNames()の結果を返す。
* Mapの場合はentrySet()のiterator()を返す。
* Iteratorを取得できないオブジェクトの場合は、それ自体をObject配列に入れた
* もののIteratorを返す。ただしnullの場合はNullIteratorを返す。
*
* @author Koji Suga (Gluegent, Inc.)
*/
public class IteratorUtil {
private IteratorUtil() {
// no instantiation.
}
public static final Iterator NULL_ITERATOR = new Iterator() {
public void remove() {
throw new UnsupportedOperationException();
}
public boolean hasNext() {
return false;
}
public Object next() {
throw new NoSuchElementException();
}
};
public static Iterator toIterator(Object o) {
if (o instanceof AttributeScope) {
return ((AttributeScope)o).iterateAttributeNames();
} else if (o instanceof Collection) {
return ((Collection) o).iterator();
} else if (o instanceof Iterator) {
return (Iterator) o;
} else if (o instanceof Enumeration) {
return new EnumrationIterator((Enumeration) o);
} else if (o instanceof Map) {
return ((Map) o).entrySet().iterator();
} else if (o instanceof Object[]) {
return toObjectIterator((Object[]) o);
} else if (o instanceof boolean[]) {
return toObjectIterator((boolean[]) o);
} else if (o instanceof byte[]) {
return toObjectIterator((byte[]) o);
} else if (o instanceof char[]) {
return toObjectIterator((char[]) o);
} else if (o instanceof short[]) {
return toObjectIterator((short[]) o);
} else if (o instanceof int[]) {
return toObjectIterator((int[]) o);
} else if (o instanceof long[]) {
return toObjectIterator((long[]) o);
} else if (o instanceof float[]) {
return toObjectIterator((float[]) o);
} else if (o instanceof double[]) {
return toObjectIterator((double[]) o);
} else if (o != null) {
return toObjectIterator(new Object[] { o });
}
return NULL_ITERATOR;
}
private static Iterator toObjectIterator(Object[] objects) {
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(boolean[] booleans) {
Boolean[] objects = new Boolean[booleans.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = Boolean.valueOf(booleans[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(byte[] bytes) {
Byte[] objects = new Byte[bytes.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Byte(bytes[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(char[] chars) {
Character[] objects = new Character[chars.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Character(chars[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(short[] shorts) {
Short[] objects = new Short[shorts.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Short(shorts[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(int[] ints) {
Integer[] objects = new Integer[ints.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Integer(ints[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(long[] longs) {
Long[] objects = new Long[longs.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Long(longs[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(float[] floats) {
Float[] objects = new Float[floats.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Float(floats[i]);
}
return Arrays.asList(objects).iterator();
}
private static Iterator toObjectIterator(double[] doubles) {
Double[] objects = new Double[doubles.length];
for (int i = 0; i < objects.length; i++) {
objects[i] = new Double(doubles[i]);
}
return Arrays.asList(objects).iterator();
}
private static class EnumrationIterator implements Iterator {
private Enumeration _enumeration;
protected EnumrationIterator(Enumeration enumeration) {
_enumeration = enumeration;
}
public void remove() {
throw new UnsupportedOperationException();
}
public boolean hasNext() {
return _enumeration.hasMoreElements();
}
public Object next() {
return _enumeration.nextElement();
}
}
}