/*******************************************************************************
 * Copyright (c) 2004, 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.tests.util;

import java.util.Vector;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
import org.eclipse.wst.common.environment.Choice;
import org.eclipse.wst.common.environment.IStatusHandler;
import org.eclipse.wst.common.environment.StatusException;

public class AccumulateStatusHandler implements IStatusHandler {
	  Vector statusList_;
	  
	  public AccumulateStatusHandler()
	  {
	    resetStatus();    
	  }
	  
	  /**
	   *  Resets the status so that it starts out empty again. 
	   *
	   */
	  public void resetStatus()
	  {
	    statusList_ = new Vector();      
	  }
	  
	  public IStatus getStatus()
	  {
	    IStatus worstStatus = Status.OK_STATUS;
	    
	    // Find the worst error status code
	    for( int index = 0; index < statusList_.size(); index++ )
	    {
	      IStatus status = (IStatus)statusList_.elementAt( index );
	      
	      if( status.getSeverity() > worstStatus.getSeverity() )
	      {
	        worstStatus = status;
	      }
	    }
	    
	    return StatusUtils.multiStatus( worstStatus.getMessage(),
	                                    (IStatus[])statusList_.toArray( new IStatus[0] ) );
	  }
	  
	  /**
	   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.env.common.Status, org.eclipse.env.common.Choice[])
	   */
	  public Choice report(IStatus status, Choice[] choices) 
	  {
	  	Choice result = null;
	  	
	  	// Always take the first choice if available.
	    if( choices != null && choices.length > 0 )
	    {
	    	result = choices[0];
	    }
	    
	    statusList_.add( status );
	    
	    return result;
	  }

	  /**
	   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.env.common.Status)
	   */
	  public void report(IStatus status) throws StatusException
	  {
	    statusList_.add( status );
	  }
	  	 
	  /**
	   * @see com.ibm.env.common.IStatusHandler#reportError(com.ibm.env.common.Status)
	   */
	  public void reportError(IStatus status)
	  {
	    statusList_.add( status );
	  }
	  
	  /**
	   * @see com.ibm.env.common.IStatusHandler#reportInfo(com.ibm.env.common.Status)
	   */
	  public void reportInfo(IStatus status)
	  {
	    statusList_.add( status );
	  }

}
