All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.lambdaj.proxy.ProxyIterator Maven / Gradle / Ivy

// Modified or written by Ex Machina SAGL for inclusion with lambdaj.
// Copyright (c) 2009 Mario Fusco.
// Licensed under the Apache License, Version 2.0 (the "License")

package ch.lambdaj.proxy;

import static ch.lambdaj.proxy.ProxyUtil.*;
import ch.lambdaj.util.iterator.*;

import java.lang.reflect.*;
import java.util.*;

/**
 * Proxies a list of objects in order to seamlessly iterate on them by exposing the API of a single object.
 * @author Mario Fusco
 */
public class ProxyIterator extends InvocationInterceptor implements Iterable {

	private final ResettableIterator proxiedIterator;

	protected ProxyIterator(ResettableIterator proxiedIterator) {
        this.proxiedIterator = proxiedIterator;
	}

	public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
		if (method.getName().equals("iterator")) return iterator();
		return createProxyIterator(iterateOnValues(method, args), (Class)method.getReturnType());
	}

	protected ResettableIterator iterateOnValues(Method method, Object[] args) throws Throwable {
        proxiedIterator.reset();
        List list = new ArrayList();
        while (proxiedIterator.hasNext()) list.add(method.invoke(proxiedIterator.next(), args));
		return new ResettableIteratorOnIterable(list);
	}

	public static  T createProxyIterator(ResettableIterator proxiedIterator, Class clazz) {
		return createIterableProxy(new ProxyIterator(proxiedIterator), clazz);
	}

    public static  T createProxyIterator(ResettableIterator proxiedIterator, T firstItem) {
        T proxy = createProxyIterator(proxiedIterator, (Class)firstItem.getClass());
        proxiedIterator.reset();
        return proxy;
    }

    @SuppressWarnings("unchecked")
	public Iterator iterator() {
		return (Iterator)proxiedIterator;
	}
}