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

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

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

import eu.dnetlib.data.sts.constants.DepotServiceConstants;
import eu.dnetlib.data.sts.ds.DepotServiceException;
import eu.dnetlib.data.sts.ds.IDepotService;
import eu.dnetlib.data.sts.ds.lls.ILLSStoreFacade;
import eu.dnetlib.data.sts.ds.lls.sdo.SimpleDigitalObject;
import eu.dnetlib.data.sts.lls.LLSAccessFacade;
import eu.dnetlib.data.sts.lls.LLSStoreFacade;
import eu.dnetlib.data.sts.utils.FileUtils;
import eu.dnetlib.data.sts.utils.SpringUtils;
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;

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

	/** The ctx. */
	private ApplicationContext ctx;
	
	/** The ctx. */
	private ApplicationContext ctx1;
	
	/** The depot service. */
	private IDataAccessService dataAccessService;

	private ResultSetService resultSetService;
	
	/** The lls storage. */
	private ILLSStoreFacade llsStoreFacade;
	
	/**
	 * Sets the up.
	 * 
	 * @throws java.lang.Exception 	 * @throws Exception the exception
	 */
	
	@Before
	public void  setUp() throws Exception {
	
		ctx = SpringUtils
				.getSpringContext(SpringUtils.DEFAULT_JUNIT_RESOURCE_DAS);
		
		dataAccessService = (IDataAccessService) ctx.getBean("DataAccessService");
		resultSetService = (ResultSetService) ctx.getBean("resultSetService");
		this.llsStoreFacade = (LLSStoreFacade) this.ctx
			.getBean("ossStorage");
	}
	
	@Test
	public void identifyTest() {
		System.out.println("IDENTIFY");
		assertNotNull(dataAccessService);
		assertNotNull(dataAccessService.identify());
		System.out.println("Here is my depot identifier: "+ dataAccessService.identify());
		System.out.println();
	}
	
	
	@Test
	public void testStoreLookUpRS() throws Exception {
		
		List<String> objectType = null;
		
		String storeDataStructureId = creatStructure();
		storeObject(storeDataStructureId);
		//dataAccessService.storeLookUpRS(storeDataStructureId, objectType );
		
		
	
		
	}
	
	@Test
	public void testStoreLookUpDataRS() throws Exception {

		List<String> objectType = null;
		
		String storeDataStructureId = creatStructure();
		storeObject(storeDataStructureId);
		//dataAccessService.storeLookUpRS(storeDataStructureId, objectType );

	}
	
	@Test
	public void testStoreLookUpSDORS() throws Exception {
		
		List<String> objectType = null;
		
		String storeDataStructureId = creatStructure();
		storeObject(storeDataStructureId);
		
		//dataAccessService.storeLookUpRS(storeDataStructureId, objectType );
		
		

	}
	
	
	private String creatStructure() throws DepotServiceException {
		System.out.println("\nSTORE OBJECTS");
		
		String storeDataStructureId = "lookUpStructure";
		llsStoreFacade.createStoreDataStructure(storeDataStructureId); 
		
		return storeDataStructureId;
	}
	
	private void storeObject(String storeDataStructId) throws Exception {
		
		String dummyObjectPath = "/tmp/dummyObject"; 
		File file = new File(dummyObjectPath);
		
		try {
			if (!file.exists())
				assertTrue("Can not create file " +
						"required for testing: "  +
						dummyObjectPath,file.createNewFile());
			
			storeDataStructId = 
				llsStoreFacade.createStoreDataStructure(storeDataStructId);
			assertNotNull(storeDataStructId);
			System.out.println("The Store Data Structure identifier:" 
					+ storeDataStructId);
		
			SimpleDigitalObject sdo = new SimpleDigitalObject();
			sdo.setDataStructureType(DepotServiceConstants.
					STORE_DATA_STRUCTURE_SUBTYPE_OBJECTS);
			sdo.setObjectLocation(
					FileUtils.convertStreamToByteArray(
							new FileInputStream (dummyObjectPath)));
			sdo.setObjectMimeType("application/xml");
			sdo.setObjectName(file.getName());
			sdo.setObjectExtension("xml");
			String objectId = 
				llsStoreFacade.storeObject(storeDataStructId, sdo);
			assertNotNull(objectId);
			
		} catch(Exception e) {
			throw new Exception("Nested Exception: " +e);
		} finally {
			//file.delete();
			//llsStoreFacade.removeStoreDataStructure(storeDataStructId);
		}		
		
	}
	
}
