package eu.dnetlib.data.utility.objectpackaging;

import java.util.ArrayList;
import java.util.List;

import org.dom4j.DocumentException;

import eu.dnetlib.data.utility.objectpackaging.rmi.ObjectPackagingException;

public abstract class ObjectPackagingItems {

	public static final int EHCACHE_TTL = 86400;
	public static final int EHCACHE_MAX_ELEMENT_IN_MEMORY = 5000;

	public abstract int getNumberOfComputedItems() throws ObjectPackagingException;

	public abstract List<String> retrieveOldItems(int from, int to) throws DocumentException, ObjectPackagingException;;

	public abstract List<String> calculateMoreItems(int size) throws DocumentException, ObjectPackagingException;

	public abstract boolean isComputationItemsEnded();

	public List<String> getResults(int fromPosition, int toPosition) throws ObjectPackagingException {
		List<String> response = new ArrayList<String>();
		try {
			int nci = getNumberOfComputedItems();

			if (toPosition <= nci) {
				response.addAll(retrieveOldItems(fromPosition, toPosition));
			} else if (fromPosition > nci) {
				int ignored = fromPosition - nci - 1;
				if (ignored > 0) {
					calculateMoreItems(ignored);
				}
				response.addAll(calculateMoreItems(toPosition - fromPosition + 1));
			} else {
				response.addAll(retrieveOldItems(fromPosition, nci));
				response.addAll(calculateMoreItems(toPosition - nci));
			}
		} catch (DocumentException e) {
			throw new ObjectPackagingException(e);
		}
		return response;
	}

}
