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

import static org.junit.Assert.assertNotNull;

import java.io.StringReader;
import java.util.List;

import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Before;
import org.junit.Test;

import eu.dnetlib.common.interfaces.ws.ServiceException;
import eu.dnetlib.data.textengine.ITextEngineService;
import eu.dnetlib.data.textengine.RecognizeType;
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.resultset.impl.IndexResultSetFaultMessage;

/**
 * Simple Index Client Test
 * 
 * @author <a href="mailto:marek.imialek at uni-bielefeld.de">Marek Imialek</a>
 * @version 0.0.1
 */
public class SimpleIndexClient {

	String ixAddress = "http://146.48.85.160:8180/dnet-index/services/IndexResultSet";
	//String ixAddress1 = "http://localhost:8080/IndexService/IndexService";
	
	IIndexService ix;
	
	@Before
	public void setUp() throws Exception {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IIndexService.class);
		factory.setAddress(ixAddress);
		ix = (IIndexService) factory.create();
		assertNotNull(ix.identify());
		System.out.println("Index Service Identify: " + ix.identify() );
	}
		
	@Test
	public void testIndexLookUp() throws ResultSetException,
			IndexResultSetFaultMessage, IndexServiceException {
		
		W3CEndpointReference epr = ix.indexLookup("all", "creator=Robert",
				"DMF", "index");
		assertNotNull(epr);
		System.out.println("LookUp EPR: " + epr);

		final ServiceResolver serviceResolver = new JaxwsServiceResolverImpl();
		final ResultSetService resultSetService = serviceResolver.getService(
				ResultSetService.class, epr);
		final String rsId = serviceResolver.getResourceIdentifier(epr);
		int recNumber = resultSetService.getNumberOfElements(rsId);
		System.out.println("LookUp records number: " + recNumber);
		if (recNumber != 0) {
			List<String> results = resultSetService.getResult(rsId, 1,
					recNumber, "waiting");
			System.out.println(results.get(2));
		}

	}

	@Test
	public void testBrowsingStatistics() throws IndexServiceException, ResultSetException {
		
		String query = "query=test&groupby=creator";
		String ixId = "all";
		W3CEndpointReference epr = ix.getBrowsingStatistics(query, ixId,"DMF", "index");
		//getBrowsingStatistics("creator=Robert",
		//		"all", "DMF", "index");
		assertNotNull(epr);
		System.out.println("Browsing EPR: " + epr);

		final ServiceResolver serviceResolver = new JaxwsServiceResolverImpl();
		final ResultSetService resultSetService = serviceResolver.getService(
				ResultSetService.class, epr);
		final String rsId = serviceResolver.getResourceIdentifier(epr);
		int recNumber = resultSetService.getNumberOfElements(rsId);
		System.out.println("Browsing records number: " + recNumber);
		if (recNumber != 0) {
			List<String> results = resultSetService.getResult(rsId, 1,
					recNumber, "waiting");
			System.out.println(results.get(2));
		}
	}
	// @Test
	public void testTE() throws ResultSetException, ServiceException,
			IndexServiceException {
		// String ixAddress =
		// "http://146.48.85.160:8082/IndexService/IndexService";
		// JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		// / factory.setServiceClass(IIndexService.class);
		// / factory.setAddress(ixAddress);
		// / IIndexService rss = (IIndexService) factory.create();
		// System.out.println("identify: " + rss.identify());

		// W3CEndpointReference epr = rss.indexLookup("all", "creator=Robert",
		// "DMF", "index");

		String resultSetEPR = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
				+ "<EndpointReference xmlns=\"http://www.w3.org/2005/08/addressing\">"
				+ "<Address>http://146.48.85.160:8080/mdstoreService_node1.local/ResultSet</Address>"
				+ "<ReferenceParameters><ResourceIdentifier:ResourceIdentifier xmlns:wsa=\"http://www.w3.org/2005/08/addressing\""
				+ " xmlns:ResourceIdentifier=\"http://www.driver.org\">rs-1238950177915-797"
				+ "</ResourceIdentifier:ResourceIdentifier></ReferenceParameters>"
				+ "<Metadata><wsaw:ServiceName EndpointName=\"theResultSet\" xmlns=\"\" "
				+ "xmlns:ns2=\"http://www.w3.org/2006/02/addressing/wsdl\" "
				+ "xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" "
				+ "xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" "
				+ "xmlns:ns5=\"http://www.w3.org/2005/08/addressing\">ns2:theResultSet</wsaw:ServiceName>"
				+ "<wsdl:definitions xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" "
				+ "xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" "
				+ "xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">"
				+ "<wsdl:import location=\"http://146.48.85.160:8080/mdstoreService_node1.local/ResultSet?WSDL\" "
				+ "namespace=\"http://www.w3.org/2006/02/addressing/wsdl\" xmlns=\"\" "
				+ "xmlns:ns5=\"http://www.w3.org/2005/08/addressing\"/></wsdl:definitions></Metadata></EndpointReference>";

		W3CEndpointReference epr = (W3CEndpointReference) W3CEndpointReference
				.readFrom(new StreamSource(new StringReader(resultSetEPR)));

		System.out.println("TXE epr:" + epr);

		String txAddress = "http://129.70.40.104:8180/textengineService/TextEngineService";
		JaxWsProxyFactoryBean factoryT = new JaxWsProxyFactoryBean();
		factoryT.setServiceClass(ITextEngineService.class);
		factoryT.setAddress(txAddress);
		ITextEngineService te = (ITextEngineService) factoryT.create();
		System.out.println("identify: " + te.identify());

		RecognizeType recognize_type = new RecognizeType();
		W3CEndpointReference eprtx = te.recognizeRS(epr, recognize_type);
		assertNotNull(eprtx);
		System.out.println("TX EPR: " + eprtx.toString());

		final ServiceResolver serviceResolver = new JaxwsServiceResolverImpl();
		final ResultSetService resultSetService = serviceResolver.getService(
				ResultSetService.class, eprtx);
		final String rsId = serviceResolver.getResourceIdentifier(eprtx);

		int recNumber = resultSetService.getNumberOfElements(rsId);
		System.out.println("Recognize RS records number: " + recNumber);

		if (recNumber != 0) {
			List<String> results = resultSetService.getResult(rsId, 1,
					recNumber, "waiting");
			System.out.println(results.get(2));
		}

	}
	
	@Test
	public void  testRSinIndex (){
		String ixRsAddress = "http://146.48.85.160:8180/dnet-mdstore/services/MDStoreResultSet";
		
		JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean();
		factory1.setServiceClass(ResultSetService.class);
		factory1.setAddress(ixRsAddress);
		ResultSetService ixrs = (ResultSetService) factory1.create();
		assertNotNull(ixrs.identify());
		System.out.println("RS Identify: " + ixrs.identify() );
	}

}
