/**
 * 
 */
package org.eclipse.jst.ws.tests.unittest;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IProject;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.ws.internal.common.ResourceUtils;
import org.eclipse.jst.ws.internal.consumption.command.common.CreateModuleCommand;
import org.eclipse.jst.ws.tests.util.JUnitUtils;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;

/**
 * Tests the various Component creation commands
 */
public class ComponentCreationTests extends TestCase implements WSJUnitConstants {

	public static Test suite(){
		return new TestSuite(ComponentCreationTests.class);
	}
	
	public void testWebComponentCreation(){

        createServerRuntime();
        createWebModule(projectName, webComponentName, J2EEVersionConstants.J2EE_1_4_ID);
        createWebModule(projectName, webComponent2Name, J2EEVersionConstants.J2EE_1_3_ID);
        
        createWebModule(project2Name, webComp3Name, J2EEVersionConstants.J2EE_1_3_ID);
        createWebModule(project2Name, webComp4Name, J2EEVersionConstants.J2EE_1_3_ID);
        
	}
  
  
    public void createServerRuntime(){
      
      try {
        JUnitUtils.createServerRuntime(RUNTIMETYPEID_TC50, SERVER_INSTALL_PATH);
      }
      catch(Exception e){
        e.printStackTrace();
      }      
      
    }
  
    private void createWebModule(String projectNm, String componentName, int j2eeVersion){

      CreateModuleCommand cmc = new CreateModuleCommand();
      cmc.setJ2eeLevel(new Integer(j2eeVersion).toString());
      cmc.setModuleName(componentName);
      cmc.setModuleType(CreateModuleCommand.WEB);
      cmc.setProjectName(projectNm);
      cmc.setServerFactoryId(SERVERTYPEID_TC50);
      cmc.setSupportMultipleModules(true);
      cmc.execute(null);
      
      System.out.println("Done creating Web component..."+projectNm+"\""+componentName);      
      IProject p = ResourceUtils.getWorkspaceRoot().getProject(projectNm);
      IVirtualComponent vc = ComponentCore.createComponent(p, componentName);
      assertTrue(vc.exists());      
      
    }
    
    public void dtestCreateEJBModule(){
     
      CreateModuleCommand cmc = new CreateModuleCommand();
      cmc.setJ2eeLevel(new Integer(J2EEVersionConstants.J2EE_1_3_ID).toString());
      cmc.setModuleName(ejbComponentName);
      cmc.setModuleType(CreateModuleCommand.EJB);
      cmc.setProjectName(ejbProjectName);
      cmc.setServerFactoryId(SERVERTYPEID_TC50);
      cmc.execute(null);
      
      System.out.println("Done creating EJB component.");
      IProject p = ResourceUtils.getWorkspaceRoot().getProject(ejbProjectName);
      IVirtualComponent vc = ComponentCore.createComponent(p, ejbComponentName);
      assertTrue(vc.exists());      
    }
    
    public void dtestCreateAppClientModule(){
      CreateModuleCommand cmc = new CreateModuleCommand();
      cmc.setJ2eeLevel(new Integer(J2EEVersionConstants.J2EE_1_3_ID).toString());
      cmc.setModuleName(appClientCompName);
      cmc.setModuleType(CreateModuleCommand.APPCLIENT);
      cmc.setProjectName(appClientProjectName);
      cmc.setServerFactoryId(SERVERTYPEID_TC50);
      cmc.execute(null);
      
      System.out.println("Done creating App client component.");
      IProject p = ResourceUtils.getWorkspaceRoot().getProject(appClientProjectName);
      IVirtualComponent vc = ComponentCore.createComponent(p, appClientCompName);
      assertTrue(vc.exists());       
    }

    public void dtestCreateEARModule(){
      CreateModuleCommand cmc = new CreateModuleCommand();
      cmc.setJ2eeLevel(new Integer(J2EEVersionConstants.J2EE_1_3_ID).toString());
      cmc.setModuleName(earCompName);
      cmc.setModuleType(CreateModuleCommand.EAR);
      cmc.setProjectName(projectName);
      cmc.setServerFactoryId(SERVERTYPEID_TC50);
      cmc.execute(null);
      
      System.out.println("Done creating EAR component.");
      IProject p = ResourceUtils.getWorkspaceRoot().getProject(projectName);
      IVirtualComponent vc = ComponentCore.createComponent(p, earCompName);
      assertTrue(vc.exists());       
    }
}
