1/* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.xml.internal.bind.v2.util; 27 28import java.util.Iterator; 29import java.util.Map; 30import java.util.NoSuchElementException; 31 32/** 33 * {@link Iterator} that walks over a map of maps. 34 * 35 * @author Kohsuke Kawaguchi 36 * @since 2.0 37 */ 38public final class FlattenIterator<T> implements Iterator<T> { 39 40 private final Iterator<? extends Map<?,? extends T>> parent; 41 private Iterator<? extends T> child = null; 42 private T next; 43 44 public FlattenIterator( Iterable<? extends Map<?,? extends T>> core ) { 45 this.parent = core.iterator(); 46 } 47 48 49 public void remove() { 50 throw new UnsupportedOperationException(); 51 } 52 53 public boolean hasNext() { 54 getNext(); 55 return next!=null; 56 } 57 58 public T next() { 59 T r = next; 60 next = null; 61 if(r==null) 62 throw new NoSuchElementException(); 63 return r; 64 } 65 66 private void getNext() { 67 if(next!=null) return; 68 69 if(child!=null && child.hasNext()) { 70 next = child.next(); 71 return; 72 } 73 // child is empty 74 if(parent.hasNext()) { 75 child = parent.next().values().iterator(); 76 getNext(); 77 } 78 // else 79 // no more object 80 } 81} 82