/**
 * Copyright 2009-2012 OpenAIRE PROJECT (Bielefeld University)
 * Original author: Marek Imialek <marek.imialek at uni-bielefeld.de>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.dnetlib.data.udm.rs;

import java.util.List;

import org.apache.log4j.Logger;

import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;

/**
 * The Class ResultSetLoader using resultset iterator, stores records of single mdstore 
 * in the output ResultSet. The mdstore records are taken from resultset 
 * created by MDStore Service.
 * 
 * @author <a href="mailto:marek.imialek at uni-bielefeld.de">Marek Imialek</a>
 */
@Deprecated
public class ResultSetLoader implements Runnable {

	/** The Constant LOGGER. */
	private final static Logger LOGGER = Logger.getLogger(ResultSetLoader.class);
	
	/** The in rs iterator. */
	private ResultSetIterator inRsIterator;
	
	/** The out result set service. */
	private ResultSetService outResultSetService;
	
	/** The out rs id. */
	private String outRsId;
	
	/** The processed md store number. */
	private int processedMDStoreNumber;
	
	/** The mdstores number. */
	private int mdstoresNumber;

	/** The mdstore identifier. */
	private String mdstoreIdentifier;
	
	/**
	 * Instantiates a new result set loader.
	 * 
	 * @param inRsIterator the in rs iterator
	 * @param outResultSetService the out result set service
	 * @param outRsId the out rs id
	 * @param processedMDStoreNumber the processed md store number
	 * @param mdstoresNumber the mdstores number
	 * @param mdstoreIdentifier the mdstore identifier
	 */
	public ResultSetLoader (ResultSetIterator inRsIterator, 
			ResultSetService outResultSetService, String outRsId, 
			int processedMDStoreNumber, int mdstoresNumber,
			String mdstoreIdentifier) {
		
		this.inRsIterator = inRsIterator;
		this.outResultSetService = outResultSetService;
		this.outRsId = outRsId;
		this.processedMDStoreNumber = processedMDStoreNumber;
		this.mdstoresNumber = mdstoresNumber;
		this.mdstoreIdentifier = mdstoreIdentifier;
	}
	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
	
		boolean status = true;
		int counter = 0;
		LOGGER.debug("("+processedMDStoreNumber+") Transfering data from MDStore "+ 
				processedMDStoreNumber +"("+mdstoresNumber+")");
		while(this.inRsIterator.hasNext()){
			List<String> recordList = this.inRsIterator.next();	
			if (recordList.get(0).equals("ignorethisobject"))
				continue;
			try {
				LOGGER.debug("("+processedMDStoreNumber+") Populating RS with "+ 
						recordList.size() + " results.");
				outResultSetService.populateRS(outRsId, recordList);
				counter +=  recordList.size();
				int mod = (int) (counter % 10000);
				if (mod == 0 && counter != 0)
					LOGGER.info("ResultSet Loader: " + counter
							+ " records populated in to the target ResultSet.");
				
			} catch (ResultSetException e) {
				LOGGER.error("("+processedMDStoreNumber+") Problem by populating out-ResultSet: "+e);
				status = false;
				break;
			}
		}
		if (status) {
			String logMsg = "("+processedMDStoreNumber+") Data from MDStore "+ 
				processedMDStoreNumber +"("+mdstoresNumber+") processed, " +
				"transfered "+ counter +" records (mdstoreID: "+mdstoreIdentifier+")";
			
			if (counter == 0)
				LOGGER.warn(logMsg);
			else
				LOGGER.info(logMsg);
		} else {
			LOGGER.warn("("+processedMDStoreNumber+") Data from MDStore "+ 
					processedMDStoreNumber +"("+mdstoresNumber+") not processed completely," +
							" transfered "+ counter +" records.");
		}
			
	}

}
