/*******************************************************************************
 * Copyright (c) 2005, 2006 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
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20060529   141422 kathy@ca.ibm.com - Kathy Chan
 *******************************************************************************/

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

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.ws.internal.consumption.command.common.AddModuleToServerCommand;
import org.eclipse.jst.ws.internal.consumption.command.common.CreateServerCommand;
import org.eclipse.wst.common.environment.IEnvironment;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.ws.internal.wsrt.IContext;
import org.eclipse.wst.ws.internal.wsrt.IWebServiceClient;

public class PreClientInstallCommand extends AbstractDataModelOperation 
{
  private IWebServiceClient webServiceClient_;
  private String            project_;
  private String            module_;
  private String            earProject_;
  private String            ear_;
  private IContext			context_;
  
  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable )
  {	  
	  if (context_ != null && context_.getInstall())
	  {  
	      IEnvironment environment = getEnvironment();
	      
	      if (webServiceClient_.getWebServiceClientInfo().getServerInstanceId()==null)
	      {
	        CreateServerCommand createServerCommand = new CreateServerCommand();
	        createServerCommand.setServerFactoryid(webServiceClient_.getWebServiceClientInfo().getServerFactoryId());
	        createServerCommand.setEnvironment( environment );
	        IStatus createServerStatus = createServerCommand.execute(null, null);
	        if (createServerStatus.getSeverity()==Status.OK)
	        {
	          webServiceClient_.getWebServiceClientInfo().setServerInstanceId(createServerCommand.getServerInstanceId());
	        }
	        else
	        {
	          if (createServerStatus.getSeverity()==Status.ERROR)
	          {
	            environment.getStatusHandler().reportError( createServerStatus );
	          }               
	          return createServerStatus;
	        }
	      }
	      
	      AddModuleToServerCommand command = new AddModuleToServerCommand();
	      command.setServerInstanceId(webServiceClient_.getWebServiceClientInfo().getServerInstanceId());
	      if (earProject_ != null && earProject_.length()>0 && ear_!= null && ear_.length()>0)
	      {
	        command.setProject(earProject_);
	        command.setModule(ear_);
	      }
	      else
	      {
	        command.setProject(project_);
	        command.setModule(module_);       
	      }
	
	      command.setEnvironment( environment );
	      IStatus status = command.execute( null, null );
	      if (status.getSeverity()==Status.ERROR)
	      {
	        environment.getStatusHandler().reportError( status );
	      }     
	      return status;
	   }
	   return Status.OK_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 setWebService( IWebServiceClient webServiceClient )
    {
      webServiceClient_ = webServiceClient;  
    }    
    
    public void setContext(IContext context)
    {
    	context_ = context;
    }
}
