org.openanzo.jdbc.utils.IteratorUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.openanzo.jdbc.utils.IteratorUtils.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2007 IBM Corporation and Cambridge Semantics Incorporated.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * File:        $Source: /cvsroot/slrp/common/com.ibm.adtech.jdbc.utils/src/com/ibm/adtech/jdbc/utils/IteratorUtils.java,v $
 * Created by:  Joe Betz
 * Created on:  9/30/2005
 * Revision:   $Id: IteratorUtils.java 176 2007-07-31 14:22:30Z mroy $
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Cambridge Semantics Incorporated - Fork to Anzo
 *******************************************************************************/
package org.openanzo.jdbc.utils;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.iterators.CollatingIterator;
import org.apache.commons.collections.iterators.FilterIterator;
import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.commons.collections.iterators.TransformIterator;

/**
 * Convenience methods for working with iterators.
 * 
 * @author Joe Betz
 * 
 */
public class IteratorUtils {
    /**
     * Makes a best effort to close any closable iterator. Can close iterators nested in IteratorChain, TransformIterator, FilterIterator and CollatingIterator
     * instances.
     * 
     * @param iterator
     *            The iterator to close.
     */
    public static void close(Iterator<?> iterator) {
        if (iterator == null)
            return;
        // obvious case
        if (iterator instanceof ClosableIterator<?>) {
            ((ClosableIterator<?>) iterator).close();
        }
        // now check for all cases we know of where iterators can be nested..
        else if (iterator instanceof IteratorChain) {
            IteratorChain chain = (IteratorChain) iterator;

            @SuppressWarnings("unchecked")
            // marshal from apache commons collections
            List<Iterator<?>> iterators = chain.getIterators();

            for (Iterator<?> iteratorElement : iterators) {
                close(iteratorElement);
            }
        } else if (iterator instanceof TransformIterator) {
            TransformIterator trans = (TransformIterator) iterator;
            close(trans.getIterator());
        } else if (iterator instanceof FilterIterator) {
            FilterIterator filter = (FilterIterator) iterator;
            close(filter.getIterator());
        } else if (iterator instanceof CollatingIterator) {
            CollatingIterator iter = (CollatingIterator) iterator;

            @SuppressWarnings("unchecked")
            // marshal from apache commons collections
            List<Iterator<?>> iterators = iter.getIterators();

            for (Iterator<?> iteratorElement : iterators) {
                close(iteratorElement);
            }
        }
    }
}