
/*
 * Created on Feb 2, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

import org.biomoby.client.CentralImpl;
import org.biomoby.client.MobyRequest;
import org.biomoby.shared.Central;
import org.biomoby.shared.MobyService;
import org.biomoby.shared.data.*;
import java.util.Iterator;

/**
 * @author benjamgo
 * @author gordonp@ucalgary.ca
 *
 * A simple test program that build a base MobyObject, finds services at MOBY 
 * Central with it, then invokes a remote SeqHound service with it.
 */
public class TestRequest {

    public static void main(String[] args) {
        try{
       
            Central worker = new CentralImpl ();
            worker.setDebug(true);
	    // Make template for finding services
            MobyService templateService = new MobyService("dummy");
       
            MobyDataObject input = new MobyDataObject("NCBI_gi", "111076");       
	    // This is the default mode, but set it anyway just in case
	    input.setXmlMode(MobyDataInstance.CENTRAL_XML_MODE);

            templateService.addInput(input);
            templateService.setName("MOBYSHoundGetGenBankff");
           
            System.out.println("Finding services matching template: "+templateService);
            MobyService[] validServices = worker.findService(templateService);
           
	    // Make sure we have a service to run for this input
	    if(validServices == null || validServices.length == 0){
		System.err.println("Could not find any valid services");
	    }
	    else{
		System.out.println("Found some services");
	    }

	    MobyRequest mr = new MobyRequest(worker);

	    // Set input and run the service
	    mr.setDebugMode(true);
	    mr.setService(validServices[0]);
	    mr.setInput(input);  // use convenient anonymous single arg service parameterization
	    MobyContentInstance responses = mr.invokeService();

	    // Process responses
	    // The service invocation may have had many requests, there is a response
	    // object for each request
	    Iterator i = responses.keySet().iterator();
	    while(i.hasNext()){
                MobyDataJob responseObjects = responses.get(i.next());
		
		// The response for a request may have many objects
                Iterator<MobyDataInstance> i2 = responseObjects.values().iterator();
		while(i2.hasNext()){
		    MobyDataInstance responseObject = i2.next();
		    // The response objects may either be simple data, or data sets
		    if(responseObject instanceof MobyDataObject){
			System.out.println("Plain simple instance is "+((MobyDataInstance)responseObject).toXML());
		    }
		    else if(responseObject instanceof MobyDataObjectSet){
			System.out.println("Found a collection:");
			MobyDataObject[] simples = ((MobyDataObjectSet) responseObject).getElementInstances();
			for(int j = 0; j < simples.length; j++){
			    System.out.println("  Member instance is \n"+simples[j].toXML());
			}
		    }
		    else{
			System.out.println("Found funky data!" + responseObject);
		    }
		}
	    }
	}catch(Exception e){
	    System.out.println("Problem: "+e);
	    e.printStackTrace();
	}
    }
} 
