/**
 * 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.sts.ds;

import static org.junit.Assert.assertNotNull;

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

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.JaxwsServiceResolverImpl;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.data.sts.utils.SpringUtils;

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

	/*
	private static transient W3CEndpointReference epr;
	@SuppressWarnings("unused")
	private static transient W3CEndpointReference eprLang;
	@SuppressWarnings("unused")
	private static transient JaxwsServiceResolverImpl resolver;

	private static transient JaxwsEndpointReferenceBuilder eprBuilder;
	*/
	//ResultSetService resultSetService;
	
	/** The ctx. */
	private ApplicationContext ctx;
	
	/** The depot service. */
	private IDepotService depotService;

	private ResultSetService resultSetService;
	
	/**
	 * Sets the up.
	 * 
	 * @throws java.lang.Exception 	 * @throws Exception the exception
	 */
	
	@Before
	public void  setUp() throws Exception {
		ctx = SpringUtils
			.getSpringContext(SpringUtils.DEFAULT_JUNIT_RESOURCE);
		depotService = (IDepotService) ctx.getBean("DepotService");
		//resultSetService = (ResultSetService) ctx.getBean("resultSetService");
		
		JaxWsProxyFactoryBean factory0 = new JaxWsProxyFactoryBean();
		factory0.setServiceClass(ResultSetService.class);
		factory0.setAddress(
				"http://146.48.85.160:8280/is/services/resultSet");
		resultSetService = (ResultSetService) factory0.create();
		assertNotNull(resultSetService.identify());
		System.out.println("Identify Push RS: " + resultSetService.identify() );
	}
	
	@Test
	public void identifyTest() {
		System.out.println("IDENTIFY");
		assertNotNull(depotService);
		assertNotNull(depotService.identify());
		System.out.println("Here is my depot identifier: "+ depotService.identify());
		System.out.println();
	}
	
	@Test
	public void createStoreTest() throws DepotServiceException {
		System.out.println("CREATE STORE DATA STRUCTURE");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		System.out.println("The identifier of new created structure. "+ storeIdentifer);
		System.out.println();
	}
	
	@Test
	public void deleteStoreTest() throws DepotServiceException {
		System.out.println("DELETE STORE");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		System.out.println("Deleting Store Data Structure");
		depotService.deleteStore(storeIdentifer);
		System.out.println();
	}
	
	@Test
	public void updateStoreTest() throws DepotServiceException {
		System.out.println("UPDATE STORE");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");		
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		List<String> predefinedObjectTypesUp = new ArrayList<String>();
		predefinedObjectTypesUp.add("text/html");
		predefinedObjectTypesUp.add("image/jpg");
		long maxSizeStDSUp = 70;

		System.out.println("Update Store Data Structure");
		depotService.updateStore(storeIdentifer, maxSizeStDSUp, predefinedObjectTypesUp);
		
		depotService.deleteStore(storeIdentifer);
		System.out.println();
	}
	
	@Test
	@Ignore
	public void getListOfStoreDataStructuresTest() throws DepotServiceException{
		System.out.println("GET LIST OF STORE DTA STRUCTURES");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		List<String> stsList = depotService.getListOfStoreDataStructures();
		assertNotNull(stsList);
		
		depotService.deleteStore(storeIdentifer);
		System.out.println();
	}
	
	@Test
	@Ignore
	public void getListOfStoreDataStructuresCSVTest() throws DepotServiceException{
		System.out.println("\nGET LIST OF STORE DATA STRUCTURES CSV");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		String stsListCsv = depotService.getListOfStoreDataStructuresCSV();
		assertNotNull(stsListCsv);
		
		String[] stsList = stsListCsv.split(",");
		assertNotNull(stsList);
		
		depotService.deleteStore(storeIdentifer);
	}
	
	@Test
	public void storeObjectsTest() throws DepotServiceException {
		System.out.println("\nSTORE OBJECTS");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		//String storeIdentifer = "sts-identifier-0";
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		//assertNotNull(storeIdentifer);
		
		System.out.println("STORING OBJECTS");
		List<String> objectsForStoring = new ArrayList<String>();
		objectsForStoring.add("AAAAAAAAAAAjjhjhjhjjjjjhhuyuy");
		objectsForStoring.add("BBBBBBBBBBB jbhhjbhbygy hbhbhbhb ");
		objectsForStoring.add("CCCCCCCCCCC juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("testeqeqeqwe qdsadd");
		objectsForStoring.add("DDDDDDD juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("EEEEEEEEE juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("%PDF-1.3"+"%##~O#"+"5 0 obj"+
				"<</Length 6 0 R/Filter /FlateDecode>>"+"stream"+"x~\\###m~\\");
		objectsForStoring.add("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				"<GGGGGGGGG><juhb> hvgvgc gfgc  gg g </juhb></GGGGGGGGG>");
		depotService.storeObjects(storeIdentifer, 
				objectsForStoring , "Data", "REFRESH");
		
		//List<String> stObjectIds = null;
		//depotService.deleteStoreObject(storeIdentifer, stObjectIds );
	
		//depotService.deleteStore(storeIdentifer);
		System.out.println("Juppi!!! I am out of this job! :) \n");
		System.out.println("Sleeping to give some time for finishing junit job!");
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("WakeUp!");
	}
	
	@Test
	@Ignore
	public void storeObjectsTestURIs() throws DepotServiceException {
		System.out.println("\nSTORE OBJECTS");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		//String storeIdentifer = "sts-identifier-0";
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		//assertNotNull(storeIdentifer);
		
		System.out.println("STORING OBJECTS");
		List<String> objectsForStoring = new ArrayList<String>();
		objectsForStoring.add("http://dobreprogramy.pl/index.php");
		objectsForStoring.add("http://localhost/index.html");
		depotService.storeObjects(storeIdentifer, 
				objectsForStoring , "URI", "REFRESH");
		
		//List<String> stObjectIds = null;
		//depotService.deleteStoreObject(storeIdentifer, stObjectIds );
	
		//depotService.deleteStore(storeIdentifer);
		System.out.println("Juppi!!! I am out of this job! :) \n");
		System.out.println("Sleeping to give some time for finishing junit job!");
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("WakeUp!");
	}
	
	@Test
	@Ignore
	public void storeObjectsFromRSTest() throws DepotServiceException, ResultSetException {
		System.out.println("\nSTORE OBJECTS");
		assertNotNull(resultSetService.identify());
		
		W3CEndpointReference rsEPR = resultSetService.createPushRS(70, 70);
		
		List<String> objectsForStoring = new ArrayList<String>();
		objectsForStoring.add("AAAAAAAAAAAjjhjhjhjjjjjhhuyuy");
		objectsForStoring.add("BBBBBBBBBBB jbhhjbhbygy hbhbhbhb ");
		objectsForStoring.add("CCCCCCCCCCC juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("testeqeqeqwe qdsadd");
		objectsForStoring.add("DDDDDDD juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("EEEEEEEEE juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("FFFFFFFFF juhb hvgvgc gfgc  gg g gcg");
		objectsForStoring.add("GGGGGGGGG juhb hvgvgc gfgc  gg g gcg");
		
		final ServiceResolver serviceResolver = new JaxwsServiceResolverImpl();
		final ResultSetService resultSetService = serviceResolver.getService(
				ResultSetService.class, rsEPR);
		final String rsId = serviceResolver.getResourceIdentifier(rsEPR);
		resultSetService.populateRS(rsId, objectsForStoring);
		resultSetService.closeRS(rsId);
		
		System.out.println("Number of objects stored in RS: "+ 
				resultSetService.getNumberOfElements(rsId));
		
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		depotService.storeObjectsFromRS(storeIdentifer, 
				rsEPR , "Data", "REFRESH");
		
		//List<String> stObjectIds = null;
		//depotService.deleteStoreObject(storeIdentifer, stObjectIds );
	
		//depotService.deleteStore(storeIdentifer);
		System.out.println("Juppi!!! I am out of this job! :) \n");
		
		System.out.println("Sleeping to give some time for finishing junit job!");
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("WakeUp!");
		
	}
	
	@Test
	@Ignore
	public void storeObjectsFromRSURIsTest() throws DepotServiceException, ResultSetException {
		System.out.println("\nSTORE URIs");
		
		W3CEndpointReference rsEPR = resultSetService.createPushRS(70, 70);
		
		List<String> objectsForStoring = new ArrayList<String>();
		objectsForStoring.add("http://dobreprogramy.pl/index.php");
		objectsForStoring.add("http://localhost/index.html");
		final ServiceResolver serviceResolver = new JaxwsServiceResolverImpl();
		final ResultSetService resultSetService = serviceResolver.getService(
				ResultSetService.class, rsEPR);
		final String rsId = serviceResolver.getResourceIdentifier(rsEPR);
		resultSetService.populateRS(rsId, objectsForStoring);
		resultSetService.closeRS(rsId);
		
		System.out.println("Number of objects stored in RS: "+ 
				resultSetService.getNumberOfElements(rsId));
		
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		depotService.storeObjectsFromRS(storeIdentifer, 
				rsEPR , "URI", "REFRESH");
		
		//List<String> stObjectIds = null;
		//depotService.deleteStoreObject(storeIdentifer, stObjectIds );
	
		//depotService.deleteStore(storeIdentifer);
		System.out.println("Juppi!!! I am out of this job! :) \n");
		
		System.out.println("Sleeping to give some time for finishing junit job!");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("WakeUp!");
		
	}
	
	//@Test
	public void deleteStoreObjectTest() throws DepotServiceException {
		System.out.println("DELETE OBJECTS");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		System.out.println("Deleting Store Objects");
		List<String> stObjectIds = null;
		depotService.deleteStoreObject(storeIdentifer, stObjectIds);
	
		depotService.deleteStore(storeIdentifer);
		System.out.println(" ");
	}
	
	@Test
	public void storingCallbackTest() throws DepotServiceException {
		
		System.out.println("\nSTORING CALLBACK TEST");
		List<String> predefinedObjectTypes = new ArrayList<String>();
		predefinedObjectTypes.add("application/msword");
		predefinedObjectTypes.add("application/pdf");
		predefinedObjectTypes.add("application/xml");
		long maxSizeStDS = 10;
		
		String storeIdentifer = depotService.createStore(predefinedObjectTypes,maxSizeStDS);
		
		String storingStatProfile = 
			depotService.storingCallback(storeIdentifer, null, true);
		System.out.println(storingStatProfile);
		assertNotNull(storingStatProfile);
	}
}
