import org.biomoby.client.*;
import org.biomoby.shared.*;
import org.biomoby.shared.data.*;
/**
 *
 * @author Paul Gordon
 */
public class TestClientServiceChain {
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{
        Central worker = new CentralImpl();
	MobyRequest mr = new MobyRequest(worker);

	// Retrieve the DNASequence from the NCBI GI ID
	MobyService templateService = new MobyService("MOBYSHoundGetGenBankWhateverSequence");
        MobyService[] validServices = worker.findService(templateService);
	mr.setService(validServices[0]); // id -> dna
	mr.setInput(new MobyDataObject("NCBI_gi","54695"));
	MobyContentInstance responses = mr.invokeService();

	// Retrieve the GFF predictions for each DNASequence returned 
	// (should be only one for this service, but the API doesn't know that)
        templateService = new MobyService("runGeneIDGFF");
	validServices = worker.findService(templateService);
	mr.setService(validServices[0]);  // dna -> gff

	for(MobyDataJob response: responses.values()){
	    for(MobyDataObject dna: response.getPrimaryDataObjects()){
		mr.setInput(dna);
		setSecondaries(mr, validServices[0]);
		System.out.println(mr.invokeService().toString());
	    }
	}
    }

    public static void setSecondaries(MobyRequest mr, MobyService service) throws Exception{
        MobySecondaryData[] secondaryData = service.getSecondaryInputs();
        MobyDataSecondaryInstance[] secondaryInstances = 
	    new MobyDataSecondaryInstance[secondaryData.length];

	for(int i = 0; i < secondaryData.length; i++){
	    MobySecondaryData param = secondaryData[i];
	    // Set specific values for the following params
	    if(param.getName().equals("strand")){
		secondaryInstances[i] = new MobyDataSecondaryInstance(param, "Reverse");
	    }
	    else if(param.getName().equals("profile")){
		secondaryInstances[i] = new MobyDataSecondaryInstance(param, "Arabidopsis thaliana (weed)");
	    }
	    else if(param.getName().equals("engine")){
		secondaryInstances[i] = new MobyDataSecondaryInstance(param, "Exon Mode");
	    }
	    else if(param.getName().equals("signals")){
		secondaryInstances[i] = new MobyDataSecondaryInstance(param, "Start codons");
	    }
	    else if(param.getName().equals("exons")){
		secondaryInstances[i] = new MobyDataSecondaryInstance(param, "All exons");
	    }
	    // Use default value for other parameters (if any)
	    else{
		secondaryInstances[i] = new MobyDataSecondaryInstance(param);
	    }
	}

        mr.setSecondaryInput(secondaryInstances);        
    }
    
}
