package eu.dnetlib.data.utility.objectpackaging;

import java.util.List;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.dnetlib.data.utility.objectpackaging.rmi.ObjectPackagingException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.ServiceResolver;

public class ObjectProviderImpl implements ObjectProvider {
	private static final Log log = LogFactory.getLog(ObjectProviderImpl.class); // NOPMD by marko on 11/24/08 5:02 PM

	private final ResultSetService provider;
	private final String rsId;

	public ObjectProviderImpl(final W3CEndpointReference epr, final ServiceResolver serviceResolver) {
		provider = serviceResolver.getService(ResultSetService.class, epr);
		rsId = serviceResolver.getResourceIdentifier(epr);
	}

	@Override
	public int getSize() throws ObjectPackagingException {
		try {
			return provider.getNumberOfElements(rsId);
		} catch (final ResultSetException e) {
			throw new ObjectPackagingException(e);
		}
	}

	@Override
	public List<String> getElements(final int from, final int to) throws ObjectPackagingException {
		if (from == 0) {
			final IllegalStateException e = new IllegalStateException(
					"cannot request from == 0, because resultset API is 1 based, something is corrupted");
			log.fatal("assertion", e);
			throw e;
		}

		try {
			return provider.getResult(rsId, from, to, "WAITING");
		} catch (final ResultSetException e) {
			throw new ObjectPackagingException(e);
		}
	}

}
