/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.ws.internal.creation.ui.extension;

import org.eclipse.jst.ws.internal.consumption.command.common.AssociateModuleWithEARCommand;
import org.eclipse.jst.ws.internal.consumption.command.common.CreateModuleCommand;
import org.eclipse.wst.command.internal.provisional.env.core.SimpleCommand;
import org.eclipse.wst.command.internal.provisional.env.core.common.Environment;
import org.eclipse.wst.command.internal.provisional.env.core.common.SimpleStatus;
import org.eclipse.wst.command.internal.provisional.env.core.common.Status;
import org.eclipse.wst.ws.internal.provisional.wsrt.IWebService;

public class PreServiceAssembleCommand extends SimpleCommand 
{
	private IWebService				webService_;
	private String						project_;
  private String            module_;
	private String						earProject_;
  private String            ear_;
	private String            j2eeLevel_;

  public Status execute(Environment environment) 
  {
	  System.out.println( "In Pre service assemble command." );
    
		// Check if EAR module is req'd, ie. !=null
		if (earProject_==null)
			return new SimpleStatus("");
	  
	  
		//Create the service EAR module
		CreateModuleCommand command = new CreateModuleCommand();
		command.setProjectName(earProject_);
		command.setModuleName(ear_);
		command.setModuleType(CreateModuleCommand.EAR);
		command.setServerFactoryId(webService_.getWebServiceInfo().getServerFactoryId());
		command.setJ2eeLevel(j2eeLevel_);
		Status status = command.execute(environment);
		if (status.getSeverity()==Status.ERROR)
		{
			environment.getStatusHandler().reportError(status);
		  return status;
		}			
		
		
		//Associate the service module and service EAR
		AssociateModuleWithEARCommand associateCommand = new AssociateModuleWithEARCommand();
		associateCommand.setProject(project_);
		associateCommand.setModule(module_);
		associateCommand.setEARProject(earProject_);
		associateCommand.setEar(ear_);
		status = associateCommand.execute(environment);
		if (status.getSeverity()==Status.ERROR)
		{
			environment.getStatusHandler().reportError(status);		  
		}			
		
		return status;	  
  }
	
  public void setProject( String project )
  {
	  project_ = project;
  }
	  
  public void setModule( String module )
  {
	  module_ = module;
  }	
	
  public void setEarProject( String earProject )
  {
	  earProject_ = earProject;
  }
  
  public void setEar( String ear )
  {
	  ear_ = ear;  
  }
	
 
  public void setJ2eeLevel( String j2eeLevel )
  {
	  j2eeLevel_ = j2eeLevel;  
  }
	
  public void setWebService( IWebService webService )
  {
	  webService_ = webService;  
  }	
}
