package eu.dnetlib.r2d2.search;

import javax.annotation.Resource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Component;

import eu.dnetlib.data.index.IIndexService;
import eu.dnetlib.data.index.IndexServiceException;
import eu.dnetlib.enabling.resultset.client.ResultSet;
import eu.dnetlib.enabling.resultset.client.ResultSetFactory;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.tools.ServiceLocator;

/**
 * Low level dnet search connector.
 * 
 * @author marko
 *
 */
public class DNetSearchConnector implements SearchConnector {

//	@Resource
	private ResultSetFactory resultSetFactory;

	private ServiceLocator<IIndexService> indexLocator;

	/**
	 * {@inheritDoc}
	 * 
	 * @see eu.dnetlib.r2d2.search.SearchConnector#search(java.lang.String)
	 */
	@Override
	public ResultSet search(String query) {
		try {
			W3CEndpointReference epr = indexLocator.getService().indexLookup("all", query, "DMF", "index");
			return resultSetFactory.newInstance(epr);
		} catch (IndexServiceException e) {
			throw new IllegalStateException(e);
		}
	}

	@Override
	public String documentById(String id) {
		try {
			ResultSet res = search("objIdentifier = \""+id+"\"");
			if(res.getNumberOfElements() > 0)
				return res.getResult(1, 1).get(0);
			return null;
		} catch (ResultSetException e) {
			throw new IllegalStateException(e);
		}
	}

	public ResultSetFactory getResultSetFactory() {
		return resultSetFactory;
	}

	@Required
	public void setResultSetFactory(ResultSetFactory resultSetFactory) {
		this.resultSetFactory = resultSetFactory;
	}

	public ServiceLocator<IIndexService> getIndexLocator() {
		return indexLocator;
	}

	@Required
	public void setIndexLocator(ServiceLocator<IIndexService> indexLocator) {
		this.indexLocator = indexLocator;
	}

}
