/*******************************************************************************
 * Copyright (c) 2006 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.validator.rules;

import javax.xml.namespace.QName;

import org.eclipse.bpel.validator.model.IModelQueryLookups;
import org.eclipse.bpel.validator.model.INode;
import org.eclipse.bpel.validator.model.IProblem;



/**
 * Validates Throw activities.
 * 
 *  
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Sep 14, 2006
 *
 */


public class ThrowValidator extends CActivityValidator {
			
	String fFaultName;
	INode fFaultVariable;
	
	protected QName fFaultQName;
	
	
	/**
	 * Start the validation.
	 * 
	 */
	@Override
	protected void start () {
		super.start();
			
		fFaultVariable = mModelQuery.lookup(mNode, 
							IModelQueryLookups.LOOKUP_NODE_VARIABLE,
							mNode.getAttribute( AT_FAULT_VARIABLE ) );
	}
	/**
	 * Check the fault name being thrown.
	 *
	 */
	
	public void rule_CheckFaultName_10 () {		
		fFaultName = mNode.getAttribute(AT_FAULT_NAME);
		
		if (isEmpty(fFaultName)) {
			// problem
			return ;
		}
		
		fFaultQName = mModelQuery.createQName(mNode, fFaultName);		
	}
	
	/** 
	 * Check to make sure that the fault if specified, is valid.
	 *
	 */
	@SuppressWarnings("boxing")
	public void rule_CheckFaultVariable_12 () {
		
		if (fFaultVariable == null) {
			// DO: bugid 3282
			return;
		}
		
		IProblem problem;
		
		String varName = mNode.getAttribute( AT_FAULT_VARIABLE );
		
		if (isUndefined(fFaultVariable)) {
			problem = createError();
			problem.fill("BPELC_THROW__NO_SUCH_VARIABLE", //$NON-NLS-1$
					varName );
			return ;
		}		
		
		// see if the variable's validator has reported problems
		
		if (fFaultVariable.nodeValidator().hasProblems()) {
			
			problem = createWarning();
			problem.fill("BPELC_REF_NODE_PROBLEMS", //$NON-NLS-1$
					toString(mNode.nodeName()),
					ND_VARIABLE,
					AT_FAULT_VARIABLE,
					KIND_ACTIVITY );
		}
		
	}
	
	
	/**
	 * Check to make sure that the variable type matches the
	 * fault name or that fault names can be associated into
	 * that variable.
	 */
	
	public void rule_CheckVariableType_14 () {
		// TODO: 
	}
	
	/** End of public rule methods.
	 * 
	 * Other methods are support methods for this class to perform its
	 * validation function.
	 * 
	 */

}
