/**
 * Copyright 2008-2009 DRIVER 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.utility.download.manager;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

import eu.dnetlib.common.ws.dataprov.DataProviderException;
import eu.dnetlib.common.ws.dataprov.ResultsResponse;
import eu.dnetlib.data.utility.download.DownloadServiceException;
import eu.dnetlib.data.utility.download.dataprov.CreateBasicBulkDataDTO;
import eu.dnetlib.data.utility.download.dataprov.SimpleStoreDataProvider;
import eu.dnetlib.data.utility.download.manager.DownloadManager;
import eu.dnetlib.data.utility.download.rs.iterator.ListResultSetIterator;
import eu.dnetlib.data.utility.download.utils.SpringUtils;

/**
 * Test for DownloadManager Class.
 * 
 * @author <a href="mailto:marek.imialek at uni-bielefeld.de">Marek Imialek</a>
 */
public class DownloadManagerTest {

	/** The ctx. */
	private ApplicationContext ctx;
	
	private SimpleStoreDataProvider dataProvider;
	
	@Before
	public void  setUp() throws Exception {
		ctx = SpringUtils
			.getSpringContext(SpringUtils.DEFAULT_RESOURCE);
		dataProvider = (SimpleStoreDataProvider) ctx.getBean("SimpleDataProvider");
	}
	
	@Test
	public void testDownloadList() throws DataProviderException, DownloadServiceException {
		
		String url = "http://dobreprogramy.pl/index.php";
		String url2 = "http://www.google.de/index.html";
		String url3 = "http://labs.google.com/papers/gfs-sosp2003.pdf";
		
		List<String> list = new ArrayList<String>();
		list.add(url);
		list.add(url2);
		list.add(url3);
		int listSize = list.size();
		
		DownloadManager dmanager = new DownloadManager();
		dmanager.init();
		dmanager.setDataProvider(dataProvider);
		
		dataProvider.setDownloadDirectory(dmanager.getDownloadDirectory());
		
		CreateBasicBulkDataDTO bulkDataDTO = new CreateBasicBulkDataDTO();
		dataProvider.createBulkData(bulkDataDTO);
		
		dmanager.downloadList(list, bulkDataDTO.getId(), null);
		
		ResultsResponse num = dataProvider.getNumberOfResults(bulkDataDTO.getId());
		
		String status = num.getStatus();
		System.out.println("RS: !!"+status+"!!");
		while ("open".equals(status)) {
			System.out.println("RS Status: " +num.getStatus());
			System.out.println("Sleeping to give some time for finishing junit job!");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("WakeUp!");
			num = dataProvider.getNumberOfResults(bulkDataDTO.getId());
			status = num.getStatus();
		}
		
		System.out.println("Number of downloaded objects: "+ +num.getTotal());
		System.out.println("RS Status:" + num.getStatus());
		assertEquals(listSize, num.getTotal());
		String[] dataProvivedResults = dataProvider.getSimpleBulkData(bulkDataDTO.getId(), 1, num.getTotal());
		assertEquals(listSize, dataProvivedResults.length);
		for (int i=0;i<dataProvivedResults.length; i++)
			System.out.println(dataProvivedResults[i]);
		
	}
	
	@Test
	public void testDownloadListForXMLObjects() throws DataProviderException, DownloadServiceException {
		
		String url = "<storeRecord><storeRecordIdentifier>h212121-767671</storeRecordIdentifier>" +
			"<storeObject datatype=\"URI\">http://www.onet.pl/index.html</storeObject>" +
			"</storeRecord>";
		String url2 = "<storeRecord><storeRecordIdentifier>h212121-767671</storeRecordIdentifier>" +
		"<storeObject datatype=\"URI\">http://www.google.de/index.html</storeObject>" +
		"</storeRecord>";
		String url3 = "<storeRecord><storeRecordIdentifier>h212121-767671</storeRecordIdentifier>" +
		"<storeObject datatype=\"URI\">http://labs.google.com/papers/gfs-sosp2003.pdf</storeObject>" +
		"</storeRecord>";
	
		List<String> list = new ArrayList<String>();
		list.add(url);
		list.add(url2);
		list.add(url3);
		int listSize = list.size();
		
		String xmlXPath = "//storeObject";
		DownloadManager dmanager = new DownloadManager();
		dmanager.init();
		dmanager.setDataProvider(dataProvider);
		
		dataProvider.setDownloadDirectory(dmanager.getDownloadDirectory());
		
		CreateBasicBulkDataDTO bulkDataDTO = new CreateBasicBulkDataDTO();
		bulkDataDTO.setReturnXmls(true);
		
		dataProvider.createBulkData(bulkDataDTO);
		
		dmanager.downloadList(list, bulkDataDTO.getId(), xmlXPath);
		
		ResultsResponse num = dataProvider.getNumberOfResults(bulkDataDTO.getId());
		
		String status = num.getStatus();
		System.out.println("RS: !!"+status+"!!");
		while ("open".equals(status)) {
			System.out.println("RS Status: " +num.getStatus());
			System.out.println("Sleeping to give some time for finishing junit job!");
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("WakeUp!");
			num = dataProvider.getNumberOfResults(bulkDataDTO.getId());
			status = num.getStatus();
		}
		
		System.out.println("Number of downloaded objects: "+ +num.getTotal());
		System.out.println("RS Status:" + num.getStatus());
		assertEquals(listSize,num.getTotal());
		String[] dataProvivedResults = dataProvider.getSimpleBulkData(bulkDataDTO.getId(), 1, num.getTotal());
		assertEquals(listSize,dataProvivedResults.length);
		for (int i=0;i<dataProvivedResults.length; i++)
			System.out.println(dataProvivedResults[i]);
		
	}

	@Test
	public void testCleanup() {
		DownloadManager dmanager = new DownloadManager();
		dmanager.init();
		dmanager.cleanup();
	}
}
