/*******************************************************************************
 * 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.ARule;
import org.eclipse.bpel.validator.model.IFilter;
import org.eclipse.bpel.validator.model.IModelQueryLookups;
import org.eclipse.bpel.validator.model.INode;
import org.eclipse.bpel.validator.model.IProblem;
import org.eclipse.bpel.validator.model.NodeNameFilter;
import org.eclipse.bpel.validator.model.Validator;


/**
 * Validates Exit nodes.
 * 
 *  
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Oct 5, 2006
 *
 */

@SuppressWarnings("nls")
public class ConditionValidator extends CValidator {
			
	/** list of my parents */	
	static public final IFilter<INode> PARENTS = new NodeNameFilter ( 	
		ND_WHILE,
		ND_IF,
		ND_ELSEIF,
		ND_WHILE,
		ND_REPEAT_UNTIL
	);

	
	Validator fExprValidator;
		
	
	protected String fExpressionLanguage;
	
	/**
	 * @see org.eclipse.bpel.validator.model.Validator#start()
	 */
	
	@Override
	protected void start () {
		super.start();
		
	}
	
	
	/**
	 * Checks the expression language attribute for support in the model.
	 */
	
	
	@ARule(
		author = "michal.chmielewski@oracle.com",
		desc = "Checks the expression language for support in the BPEL model",		
		date = "10/2/2006",
		sa = 4
	)
	public void rule_CheckExpressionLanguageSupport_20 () {
		
		fExpressionLanguage = getLanguage(mNode,AT_EXPRESSIONLANGUAGE);
		
		IProblem problem;
		
		if ( mModelQuery.hasSupport(IModelQueryLookups.SUPPORT_EXPRESSION_LANGUAGE, 
				fExpressionLanguage) == false ) {
			
			problem = createError();
			problem.fill( 
					"BPELC__UNSUPPORTED_XML_LANG",
					AT_EXPRESSIONLANGUAGE,
					fExpressionLanguage);
			
			disableRules( 20,1000 );
			
			return ;
		}
		
	}
	
	
	/**
	 * Check the condition expression. This expression
	 * must be a boolean expression.
	 */
	
	@ARule(
		author = "michal.chmielewski@oracle.com",
		desc = "Checks the actual expression using the expression language validator.",		
		date = "10/2/2006",
		sa = 0,
		order = 100
	)		
	public void CheckExpression () {
		
		if (fExprValidator == null) {
			
			fExprValidator = createExpressionValidator ( new QName( fExpressionLanguage, mNode.nodeName().getLocalPart() ) );
			if (fExprValidator == null) {
				return ;
			}
			
			attach ( fExprValidator );
		}
		
	}
		
	


}
