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

/**
 * The Class SimpleClient.
 * 
 * @author <a href="mailto:marek.imialek at uni-bielefeld.de">Marek Imialek</a>
 */
public class SimpleClient {
		
	private ResultSetService dsRS;

	private IDepotService dS;

	/**
	 * Sets the up.
	 * 
	 */
	@Before 
	public void setUp() {
	
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(ResultSetService.class);
		factory.setAddress(
				"http://146.48.85.160:8280/is/services/resultSet");
		dsRS = (ResultSetService) factory.create();
		assertNotNull(dsRS.identify());
		System.out.println("Identify Read from RS: " + dsRS.identify() );
		
		JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean();
		factory1.setServiceClass(IDepotService.class);
		//factory1.setAddress(
		//		"http://localhost:8980/dnet-sts-ds/services/DepotService");
		factory1.setAddress(
			"http://129.70.40.102:8380/dnet-sts-ds/services/DepotService");
		dS = (IDepotService) factory1.create();
		assertNotNull(dS.identify());
		System.out.println("Identify DA Service: " + dS.identify() );
			
	}
	
	@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 = dS.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>");
		dS.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
	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 = dS.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");
		dS.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
	public void storeObjectsFromRSTest() throws DepotServiceException, ResultSetException {
		System.out.println("\nSTORE OBJECTS");
		assertNotNull(dsRS.identify());
		
		W3CEndpointReference rsEPR = dsRS.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 = dS.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		dS.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
	public void storeObjectsFromRSURIsTest() throws DepotServiceException, ResultSetException {
		System.out.println("\nSTORE URIs");
		
		W3CEndpointReference rsEPR = dsRS.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 = dS.createStore(predefinedObjectTypes,maxSizeStDS);
		assertNotNull(storeIdentifer);
		
		dS.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!");
		
	}
	
	private void printRS (W3CEndpointReference downloadEPR) throws ResultSetException {
		
		final ServiceResolver serviceResolver2 = new JaxwsServiceResolverImpl();
		final String downloadServiceRsId = serviceResolver2.getResourceIdentifier(downloadEPR);
		
		int resultsNumber = dsRS.getNumberOfElements(downloadServiceRsId);
		System.out.println(downloadServiceRsId);
		System.out.println("Number of results in Download RS: "+ resultsNumber);
		System.out.println("RS Status:" + dsRS.getRSStatus(downloadServiceRsId));
		
		for (int i = 1; i<= resultsNumber; i++) {
			System.out.println("Getting Page: " + i);
			
			List<String> results = dsRS.getResult(downloadServiceRsId,
					i, i , "waiting");
		
			if (results != null ){
				Iterator<String> iter = results.iterator();
	
				while (iter.hasNext())
					System.out.println("Object: " + iter.next());	
			}
			else {
				System.out.println("Page "+i+" not returned!");
			}
		}	
	}
 
	
}
