package org.eclipse.wst.ws.internal.provisional.wsrt;

import java.util.List;

import org.eclipse.wst.command.internal.provisional.env.core.selection.BooleanSelection;
import org.eclipse.wst.server.core.IServer;
/**
 * This holds info that comes from user input or some calculations that 
 * which might be useful to any test extenders
 */

public class TestInfo {
  private String jspFolder;
  private String generationModule;
  private String generationProject;
  private String serviceProject;
  private String proxyBean;
  private String setEndpointMethod;
  private String clientProject;
  private BooleanSelection[] methods;
  private String serviceServerTypeID;
  private String clientServerTypeID;
  private IServer serviceExistingServer;
  private IServer clientExistingServer;
  private List endpoints;
  private String wsdlServiceURL;
  

  /**
  * This is the folder the user has chosen to generate any jsps 
  * @param jspFolder
  */
  public void setJspFolder(String jspFolder){
	this.jspFolder = jspFolder;  
  }
  
  public String getJspFolder(){
    return jspFolder;  
  }
  
  /**
  * This is the project the user has chosen to generate artifacts to  
  * @param generationProject
  */
  public void setGenerationProject(String generationProject){
    this.generationProject = generationProject;	  
  }
  
  public String getGenerationProject(){
    return generationProject;	  
  }
  
  /**
   * This is the Module the user has chosen to generate artifacts to  
   * @param generationModule
   */
   public void setGenerationModule(String generationModule){
     this.generationModule = generationModule;	  
   }
   
   public String getGenerationModule(){
     return generationModule;	  
   }
  
  /**
  * The proxy bean was generated by us this is the name of it  
  * @param proxyBean
  */
  public void setProxyBean(String proxyBean){
    this.proxyBean = proxyBean;	  
  }
  
  public String getProxyBean(){
    return proxyBean;	  
  }
	  
  /**
  * This is the SetEndpointMethod   
  * @param 
  */
  public void setSetEndpointMethod(String setEndpointMethod){
	this.setEndpointMethod = setEndpointMethod;  
  }
  
  public String getSetEndpointMethod(){
    return setEndpointMethod;  
  }
  
  /**
  * The clientProject contains the client artifacts including the 
  * generated proxy bean   
  * @param clientProject String
  */
  public void setClientProject(String clientProject){
    this.clientProject = clientProject;	  
  }
  
  public String getClientProject(){
    return clientProject;	  
  }
	  
  /**
  * These are methods on the proxybean the user has checked ones 
  * they want included in the test client     
  * @param methods
  */
  public void setMethods(BooleanSelection[] methods){
	this.methods = methods;  
  }
  
  public BooleanSelection[] getMethods(){
    return methods;  
  }
  
  /**
  * If the command needs a server this is the chosen 
  * client serverID
  * @param sampleServerTypeID
  */
  public void setServiceServerTypeID(String serviceServerTypeID){
    this.serviceServerTypeID = serviceServerTypeID;  
  }
  
  public String getServiceServerTypeID(){
    return serviceServerTypeID;  
  }
  
  /**
  * If the command needs a server this is the chosen 
  * client serverID
  * @param sampleServerTypeID
  */
   public void setClientServerTypeID(String clientServerTypeID){
     this.clientServerTypeID = clientServerTypeID;  
   }
   
   public String getClientServerTypeID(){
     return clientServerTypeID;  
   }
	  
  /**
  * This is the IServer if required
  * @param sampleExistingServer
  */
  public void setServiceExistingServer(IServer serviceExistingServer){
	this.serviceExistingServer = serviceExistingServer;   
  }
  
  public IServer getServiceExistingServer(){
    return serviceExistingServer;   
  }
  
  /**
  * This is the IServer if required
  * @param sampleExistingServer
  */
  public void setClientExistingServer(IServer clientExistingServer){
    this.clientExistingServer = clientExistingServer;   
  }
   
  public IServer getClientExistingServer(){
    return clientExistingServer;   
  }
   
  /**
  * This is the endpoints if monitor service is enabled
  * @param endpoints
  */
  public void setEndpoint(List endpoints){
	this.endpoints = endpoints;  
  }
  public List getEndpoint(){
    return endpoints;  
  } 

  /**
  * This is the project that should be used when dealing with
  * wsdl
  * @param serviceProject
  */
  public void setServiceProject(String serviceProject){
    this.serviceProject = serviceProject;    	  
  }

  public String getServiceProject(){
    return serviceProject;
  }

  /**
  * WSDL URL
  */
  public void setWsdlServiceURL(String wsdlServiceURL){
	this.wsdlServiceURL = wsdlServiceURL;  
  }
  
  public String getWsdlServiceURL(){
    return wsdlServiceURL;  
  }


}
