/**
 * 
 */
package eu.dnetlib.data.utility.featureextraction.dataprovider;

import java.util.List;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;

import eu.dnetlib.data.utility.featureextraction.FeatureExtractionException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.ServiceResolver;

/**
 * @author jochen
 *
 */
public class SourceDataProviderImpl implements SourceDataProvider {

	private static final Log log = LogFactory.getLog(SourceDataProviderImpl.class);
	private static final int MAX_TRIALS = 10;
	private ResultSetService rsService;
	private String rsId;

	public SourceDataProviderImpl(W3CEndpointReference epr, ServiceResolver resolver){
		rsService = resolver.getService(ResultSetService.class, epr);
		Assert.state(rsService != null);
		rsId      = resolver.getResourceIdentifier(epr);
	}
	
	/* (non-Javadoc)
	 * @see eu.dnetlib.data.utility.featureextraction.resultset.SourceDataProvider#getRecords(int, int)
	 */
	@Override
	public List<String> getRecords(int from, int to)
			throws FeatureExtractionException {
		List<String> results = null;
		
		try {
			int trials = 0;
			while (trials < MAX_TRIALS && results == null){
				log.debug("get records from: " + from + ", to: " + to);
				results = rsService.getResult(rsId, from, to, "WAITING");
				if (results == null){
					trials++;
					Thread.sleep(1000);
					log.debug("retry.");
				}
			}
			if (results == null){
				throw new FeatureExtractionException("cannot retrieve results from resultsetservice for params: rs-id: " + rsId + ", from: "  + from + ", to: " + to);
			}
			return results;
		} catch (Exception e) {
			log.error(e);
			throw new FeatureExtractionException("unexpected exception occured while retrieving results from resultset for params: rs-id: " + rsId + ", from: "  + from + ", to: " + to, e);
		}
	}

	/* (non-Javadoc)
	 * @see eu.dnetlib.data.utility.featureextraction.resultset.SourceDataProvider#getSize()
	 */
	@Override
	public int getSize() throws FeatureExtractionException {
		try {
			int i = rsService.getNumberOfElements(rsId);
			log.debug("numOfElements:" + i);
			return i;
		} catch (ResultSetException e) {
			log.error(e);
			throw new FeatureExtractionException(e);
		}
	}

	/* (non-Javadoc)
	 * @see eu.dnetlib.data.utility.featureextraction.dataprovider.SourceDataProvider#getStatus()
	 */
	@Override
	public String getStatus() throws FeatureExtractionException {
		try {
			String status = rsService.getRSStatus(rsId);
			log.debug("RS Status" + status);
			return status;
		} catch (ResultSetException e) {
			log.error(e);
			throw new FeatureExtractionException(e);
		}	
	}

}
