/*******************************************************************************
 * 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 org.eclipse.bpel.validator.model.ARule;
import org.eclipse.bpel.validator.model.Filters;
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;




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

@SuppressWarnings({"nls","boxing"} )

public class ExtensionValidator extends CValidator {
			
	/** Parent nodes */
	static public IFilter<INode> PARENTS = new NodeNameFilter( ND_EXTENSIONS );
	
	
	protected String fMustUnderstand;
	private String fNamespaceURI;
	
	/** (non-Javadoc)
	 * @see org.eclipse.bpel.validator.rules.CValidator#start()
	 */
	@Override
	protected void start() {
		super.start();
	}
	
	
	/**
	 * Check must understand
	 */
	
	public void rule_CheckMustUnderstand_1 () {
		fMustUnderstand = getAttribute(mNode, AT_MUST_UNDERSTAND, KIND_NODE, Filters.BOOLEAN_FILTER	,true);
		
		if (fMustUnderstand == null) {
			fMustUnderstand = NO;
		}		
	}
		
	/**
	 * Check to make sure namespace URI is set.
	 */
	
	public void rule_CheckNamespaceURI_2 () {
		
		fNamespaceURI = getAttribute(mNode, AT_NAMESPACE, KIND_NODE, null, true);
		
	}
	
	
	/**
	 * In the case of mandatory extensions declared in the <extensions> element
	 * not supported by a WS-BPEL implementation, the process definition MUST be
	 * rejected.
	 * 
	 */

	@ARule(
		sa = 9,
		desc = "Mandatory extensions must be understood",
		date = "03/15/2007"
	)
	public void rule_CheckMustUnderstand_20 () {
		String key = "extension." + fNamespaceURI + "." + fMustUnderstand;
		
		if (containsValueKey(fParentNode,key) ) {
			return ;
		}		
		boolean bSupports = mModelQuery.hasSupport(IModelQueryLookups.SUPPORT_EXTENSION,fNamespaceURI );
		
		setValue(fParentNode,key, bSupports);
		
		IProblem problem;
		
		if ( bSupports == false && YES.equals(fMustUnderstand)) {
			problem = createError();
			
			problem.fill("BPELC_EXTENSION__NOT_SUPPORTED",
				toString(mNode.nodeName()),
				fNamespaceURI,
				fMustUnderstand);
		}
	}
	
	
	/** End of public rule methods.
	 * 
	 * Other methods are support methods for this class to perform its
	 * validation function.
	 * 
	 */

}
