package eu.dnetlib.test.epr;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.xml.namespace.QName;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;

import eu.dnetlib.soap.cxf.CxfEndpointReferenceBuilder;
import eu.dnetlib.test.epr.rmi.EprTestService;

public class EprTestServiceImpl implements EprTestService {
	/**
     * epr builder.
     */
    private CxfEndpointReferenceBuilder cxfEndpointReferenceBuilder;
	
    private static final Log log = LogFactory.getLog(EprTestServiceImpl.class); // NOPMD by marko on 11/24/08 5:02 PM
   
    
	@Override
	public String generateTestEprs(int total, int nthreads) throws Exception {
		ExecutorService executor = Executors.newFixedThreadPool(nthreads);
		
		if (total<0 || nthreads<0) throw new Exception("total and nthreads must be > 0");
		
		List<Callable<W3CEndpointReference>> tasks = new ArrayList<Callable<W3CEndpointReference>>();
		for (int i=0; i<total; i++) {
			tasks.add(new Callable<W3CEndpointReference>() {
				@Override
				public W3CEndpointReference call() throws Exception {
					return cxfEndpointReferenceBuilder.getEndpointReference(
			                "http://localhost/test",
			                new QName("http://rmi.resultset.enabling.dnetlib.eu/", "ResultSetServiceService"),
			                new QName("http://rmi.resultset.enabling.dnetlib.eu/", "ResultSetServiceService"),
			                "http://localhost/test?wsdl",
			                "XYZ",
			                null);
				}
			});
		}

		for (Future<W3CEndpointReference> future_epr : executor.invokeAll(tasks)) {
			log.info("EPR: " + future_epr.get());
		}
		
		return "DONE";
	}

	@Required
	public void setCxfEndpointReferenceBuilder(CxfEndpointReferenceBuilder cxfEndpointReferenceBuilder) {
		this.cxfEndpointReferenceBuilder = cxfEndpointReferenceBuilder;
	}

	public CxfEndpointReferenceBuilder getCxfEndpointReferenceBuilder() {
		return cxfEndpointReferenceBuilder;
	}

}
