001 package net.sourceforge.retroweaver.runtime.java.lang; 002 003 import java.lang.reflect.Method; 004 import java.util.Collection; 005 import java.util.Iterator; 006 007 /** 008 * Replacements for methods added to java.lang.Iterable in Java 1.5, used 009 * for targets of the "foreach" statement. 010 */ 011 public final class Iterable_ { 012 013 private Iterable_() { 014 // private constructor 015 } 016 017 /** 018 * Returns an iterator for <code>iterable</code>. 019 * 020 * @param iterable the object to get the Iterator from 021 * @return an Iterator. 022 * @throws UnsupportedOperationException if an iterator method can not be found. 023 * @throws NullPointerException if <code>iterable</code> is null. 024 */ 025 public static Iterator iterator(final Object iterable) { 026 if (iterable == null) { 027 throw new NullPointerException(); // NOPMD by xlv 028 } 029 030 if (iterable instanceof Collection) { 031 // core jdk classes implementing Iterable: they are not weaved but, 032 // at least in 1.5, they all implement Collection and as its iterator 033 // method exits in pre 1.5 jdks, a valid Iterator can be returned. 034 return ((Collection) iterable).iterator(); 035 } 036 037 if (iterable instanceof net.sourceforge.retroweaver.runtime.java.lang.Iterable) { 038 // weaved classes inheriting from Iterable 039 return ((net.sourceforge.retroweaver.runtime.java.lang.Iterable) iterable).iterator(); 040 } 041 042 // for future jdk Iterable classes not inheriting from Collection 043 // use reflection to try to get the iterator if it was present pre 1.5 044 try { 045 final Method method = iterable.getClass().getMethod("iterator", (Class[]) null); 046 if (method != null) { 047 return (Iterator) method.invoke(iterable, (Object[]) null); 048 } 049 } catch (Exception ignored) { // NOPMD by xlv 050 } 051 052 throw new UnsupportedOperationException("iterator call on " + iterable.getClass()); 053 } 054 055 }