package it.cnr.isti.driver.utils;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xmlsoap.schemas.soap.envelope.IndexResultSetServiceStub;
import org.driver.www.wsdl.resultset_wsdl.*;

public class ResultSetClient {
	protected Log log = LogFactory.getLog(ResultSetClient.class);
	
	boolean cnr = false;
	IndexResultSetServiceStub resultset = null;
	ResultSetStub resultsetCNR = null;

	public ResultSetClient() {
		try {
			if (cnr) {
				resultsetCNR = new ResultSetStub();
			} else {
				resultset = new IndexResultSetServiceStub();
			}
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public ResultSetClient(String address) {
		setAddress(address);
	}

	public void setAddress(String address) {
		log.debug("Setting ResultSet address: " + address);	
		try {
			if (cnr) {
				resultsetCNR = new ResultSetStub(address);
			} else {
				resultset = new IndexResultSetServiceStub(address);
			}
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public int getNumberOfElements(String rsId) {
		log.debug("Resultset getting number of elements");	
		if (cnr) {
			ResultSetStub.GetNumberOfElements gneCNR = new ResultSetStub.GetNumberOfElements();
			ResultSetStub.GetNumberOfElementsResponse gnrCNR = new ResultSetStub.GetNumberOfElementsResponse();
			gneCNR.setRsId(rsId);
			try {
				gnrCNR = resultsetCNR.getNumberOfElements(gneCNR);
				int res = gnrCNR.getReturn();
				log.debug("Resultset got number of elements: " + res);
				return res;
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			IndexResultSetServiceStub.GetNumberOfElements21 gne21 = new IndexResultSetServiceStub.GetNumberOfElements21();
			IndexResultSetServiceStub.GetNumberOfElementsResponse4 gnr4 = new IndexResultSetServiceStub.GetNumberOfElementsResponse4();
			IndexResultSetServiceStub.GetNumberOfElements gne = new IndexResultSetServiceStub.GetNumberOfElements();
			gne.setRsId(rsId);
			gne21.setGetNumberOfElements(gne);
			try {
				gnr4 = resultset.getNumberOfElements(gne21);
				IndexResultSetServiceStub.GetNumberOfElementsResponse gnr = gnr4
						.getGetNumberOfElementsResponse();

				int res = gnr.getReturn();
				log.debug("Resultset got number of elements: " + res);
				return res;
				
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return 0;
	}

	public String[] getResult(String rsId, int fromPosition, int toPosition,
			String requestMode, String styleSheet) {
		
		log.debug("ResultSet getting result");	
		if (cnr) {
			ResultSetStub.GetResult grCNR = new ResultSetStub.GetResult();
			ResultSetStub.GetResultResponse grrCNR;
			ResultSetStub.GetResult_type grtCNR = new ResultSetStub.GetResult_type();
			grtCNR.setStyleSheet(styleSheet);
			grCNR.setFromPosition(fromPosition);
			grCNR.setRsId(rsId);
			grCNR.setToPosition(toPosition);
			grCNR.setRequestMode(requestMode);
			grCNR.setGetResult_type(grtCNR);
			try {
				grrCNR = resultsetCNR.getResult(grCNR);
				ResultSetStub.Array1 array1 = grrCNR.getReturn();
				log.debug("ResultSet got result");	
				return array1.getElement();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			IndexResultSetServiceStub.GetResult gr = new IndexResultSetServiceStub.GetResult();
			IndexResultSetServiceStub.GetResult10 gr10 = new IndexResultSetServiceStub.GetResult10();
			IndexResultSetServiceStub.GetResultResponse grr;
			IndexResultSetServiceStub.GetResultResponse18 grr18;
			IndexResultSetServiceStub.GetResult_type grt = new IndexResultSetServiceStub.GetResult_type();
			grt.setStyleSheet(styleSheet);
			gr.setRsId(rsId);
			gr.setFromPosition(fromPosition);
			gr.setToPosition(toPosition);
			gr.setRequestMode(requestMode);
			gr.setGetResult_type(grt);
			gr10.setGetResult(gr);
			try {
				grr18 = resultset.getResult(gr10);
				grr = grr18.getGetResultResponse();
				IndexResultSetServiceStub.Array1 array1 = grr.getReturn();
				log.debug("ResultSet got result");	
				return array1.getElement();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;

	}
}
