package eu.dnetlib.openaire.oaf.resultset;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.core.io.Resource;

import eu.dnetlib.enabling.database.rmi.DatabaseService;
import eu.dnetlib.enabling.tools.ServiceLocator;

public class OafResultSetImpl implements OafResultSet {
	private ServiceLocator<DatabaseService> dbServiceLocator;
	private String openaireDB; 
	private Resource sqlFileForIndex;
	private Resource sqlCountFileForIndex;
	private Resource xsltFileForIndex;
	
	
	private static final Log log = LogFactory.getLog(OafResultSetImpl.class); // NOPMD by marko on 11/24/08 5:02 PM

	
	@Override
	public W3CEndpointReference generateResultSetForIndexing() {
		try {
			StringWriter sql        = new StringWriter();
			StringWriter sqlForSize = new StringWriter();
			StringWriter xslt       = new StringWriter();
			
			IOUtils.copy(sqlFileForIndex.getInputStream()     , sql);
			IOUtils.copy(sqlCountFileForIndex.getInputStream(), sqlForSize);
			IOUtils.copy(xsltFileForIndex.getInputStream()    , xslt);
			
			return dbServiceLocator.getService().alternativeXsltSearchSQL(openaireDB, sql.toString(), sqlForSize.toString(), xslt.toString());
		} catch (IOException e) {
			throw new RuntimeException("Error generating resultset for OAF Index" , e);
		}
	}
	
	public void test() {
		log.info("****************************");
		log.info("Generated EPR dor OAF index:");
		log.info(generateResultSetForIndexing());
		log.info("****************************");
	}
	
	@Required
	public void setDbServiceLocator(ServiceLocator<DatabaseService> dbServiceLocator) {
		this.dbServiceLocator = dbServiceLocator;
	}

	public ServiceLocator<DatabaseService> getDbServiceLocator() {
		return dbServiceLocator;
	}

	@Required
	public void setOpenaireDB(String openaireDB) {
		this.openaireDB = openaireDB;
	}

	public String getOpenaireDB() {
		return openaireDB;
	}

	@Required
	public void setSqlFileForIndex(Resource sqlFileForIndex) {
		this.sqlFileForIndex = sqlFileForIndex;
	}

	public Resource getSqlFileForIndex() {
		return sqlFileForIndex;
	}

	@Required
	public void setXsltFileForIndex(Resource xsltFileForIndex) {
		this.xsltFileForIndex = xsltFileForIndex;
	}

	public Resource getXsltFileForIndex() {
		return xsltFileForIndex;
	}

	@Required
	public void setSqlCountFileForIndex(Resource sqlCountFileForIndex) {
		this.sqlCountFileForIndex = sqlCountFileForIndex;
	}

	public Resource getSqlCountFileForIndex() {
		return sqlCountFileForIndex;
	}

}
