/*******************************************************************************
 * Copyright (c) 2005, 2007 Intel 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:
 * Intel Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.managedbuilder.macros;

import org.eclipse.cdt.core.cdtvariables.CdtVariableException;
import org.eclipse.core.runtime.IStatus;

/**
 * This exception is thrown in the case of some build macros-related operation failure
 * The exception typically contains one or more IBuildMacroStatus statuses 
 * 
 * @since 3.0
 */
public class BuildMacroException extends CdtVariableException {
	/**
	 * All serializable objects should have a stable serialVersionUID
	 */
	private static final long serialVersionUID = 3976741380246681395L;

	/**
	 * Creates a new exception with the given status object.  
	 *
	 * @param status the status object to be associated with this exception. 
	 * Typically this is either the IBuildMacroStatus or the MultiStatus that holds
	 * the list of the IBuildMacroStatus statuses
	 */
	public BuildMacroException(IStatus status) {
		super(status);
	}

	/**
	 * Creates an exception containing a single IBuildMacroStatus status with the IStatus.ERROR severity
	 * 
	 * @param code one of the IBuildMacroStatus.TYPE_xxx statusses
	 * @param message message, can be null. In this case the default message will
	 *  be generated base upon the other status info
	 * @param exception a low-level exception, or <code>null</code> if not
	 *    applicable 
	 * @param macroName the name of the build macro whose resolution caused this status creation or null if none
	 * @param expression the string whose resolutinon caused caused this status creation or null if none
	 * @param referencedName the macro name referenced in the resolution string that caused this this status creation or null if none
	 * @param contextType the context type used in the operation
	 * @param contextData the context data used in the operation
	 */
//	public BuildMacroException(int code, 
//			String message, 
//			Throwable exception, 
//			String macroName, 
//			String expression, 
//			String referencedName,
//			int contextType,
//			Object contextData) {
//		super(new BuildMacroStatus(code, message, exception, macroName, expression, referencedName, contextType, contextData));
//	}

	/**
	 * Creates an exception containing a single IBuildMacroStatus status with the IStatus.ERROR severity and with the default message
	 * 
	 * @param code one of the IBuildMacroStatus.TYPE_xxx statusses
	 * @param exception a low-level exception, or <code>null</code> if not
	 *    applicable 
	 * @param macroName the name of the build macro whose resolution caused this status creation or null if none
	 * @param expression the string whose resolutinon caused caused this status creation or null if none
	 * @param referencedName the macro name referenced in the resolution string that caused this this status creation or null if none
	 * @param contextType the context type used in the operation
	 * @param contextData the context data used in the operation
	 */
//	public BuildMacroException(int code, 
//			String macroName, 
//			String expression, 
//			String referencedName,
//			int contextType,
//			Object contextData) {
//		super(new BuildMacroStatus(code, macroName, expression, referencedName, contextType, contextData));
//	}
	
	public BuildMacroException(CdtVariableException e){
		super(e.getStatus());
	}
	
	/**
	 * Returns an array of the IBuildMacroStatus statuses this exception holds
	 * 
	 * @return IBuildMacroStatus[]
	 */
	public IBuildMacroStatus[] getMacroStatuses(){
		IStatus status = getStatus();
		if(status instanceof IBuildMacroStatus)
			return new IBuildMacroStatus[]{(IBuildMacroStatus)status};
		else if(status.isMultiStatus()){
			IStatus children[] = status.getChildren();
			IBuildMacroStatus result[] = new IBuildMacroStatus[children.length];
			int num = 0;
			for(int i = 0; i < children.length; i++){
				if(children[i] instanceof IBuildMacroStatus)
					result[num++]=(IBuildMacroStatus)children[i];
			}
			if(num != children.length){
				IBuildMacroStatus tmp[] = new IBuildMacroStatus[num];
				for(int i = 0; i < num; i++)
					tmp[i] = result[i];
				result = tmp;
			}
			return result;
		}
		return new IBuildMacroStatus[0];
	}

}
