/******************************************************************************* * 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 java.util.List; 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.ARule; import org.eclipse.bpel.validator.model.NodeNameFilter; /** * Validates variable related rules. * <p> * When thinking * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Sep 14, 2006 * */ @SuppressWarnings({"nls","boxing"}) public class CorrelationValidator extends CValidator { /** Parent nodes */ static public IFilter<INode> PARENTS = new NodeNameFilter( ND_CORRELATIONS ); protected String fSetName ; protected String fInitiate; protected String fPattern; protected INode fActivityNode; protected INode fCorrelationSet; /** * Start performing variable checks. */ @Override protected void start () { super.start(); fActivityNode = fParentNode.parentNode(); } /** * Check the NCName of the correlation set. */ @ARule( sa = 0, desc = "Check the NCName of the correlation", author = "michal.chmielewski@oracle.com", date = "01/20/2007", errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" ) public void rule_CheckName_1 () { fSetName = getAttribute(mNode, AT_SET, KIND_NODE, Filters.NC_NAME, true); } /** * */ @ARule( sa = 1010, desc = "Check the initiate attribute values", author = "michal.chmielewski@oracle.com", date = "01/20/2007", errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" ) public void rule_CheckInitiate_2 () { fInitiate = getAttribute(mNode, AT_INITIATE, KIND_NODE, Filters.INITIATE_FILTER, false); if (isEmpty(fInitiate)) { fInitiate = NO; } } /** * */ @ARule( sa = 46, desc = "Check the pattern attribute values of correlation", author = "michal.chmielewski@oracle.com", date = "02/20/2007", errors="BPELC__UNSET_ATTRIBUTE,BPELC__SET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" ) public void rule_CheckPatternValues_5 () { fPattern = getAttribute(mNode, AT_PATTERN, KIND_NODE, Filters.PATTERN_FILTER, false); if (isEmpty(fPattern)) { fPattern = null; } IProblem problem; boolean is2Way = getValue(fActivityNode,"2way",false); // invoke if (ND_INVOKE.equals(fActivityNode.nodeName())) { if (is2Way && isEmpty(fPattern)) { problem = createError(); problem.fill("BPELC__UNSET_ATTRIBUTE", toString(mNode.nodeName()), AT_PATTERN, KIND_NODE ); } if (is2Way == false && isEmpty(fPattern) == false) { problem = createError(); problem.fill("BPELC__SET_ATTRIBUTE", AT_PATTERN, toString(mNode.nodeName()), KIND_NODE ); } } else { if (isEmpty(fPattern) == false) { problem = createError(); problem.fill("BPELC__SET_ATTRIBUTE", AT_PATTERN, toString(mNode.nodeName()), KIND_NODE ); } } } /** * Check if the correlation already exists. * */ @ARule( sa = 0, desc = "Check to see if the correlation is already specified", author = "michal.chmielewski@oracle.com", date = "01/20/2007", errors="BPELC_CORRELATION__EXIST" ) public void rule_CheckDuplicateCorrelation_10 () { if (fSetName == null) { return ; } String key = "set." + fSetName; // if (containsValueKey(fParentNode,key)) { IProblem problem = createError(); problem.fill("BPELC_CORRELATION__EXIST", toString(mNode.nodeName()), fSetName); return ; } setValue(fParentNode,key, Boolean.TRUE); } /** * Check the existence of the correlation set */ @ARule( sa = 0, desc = "Check to see if the correlation set exists", author = "michal.chmielewski@oracle.com", date = "01/20/2007", errors="BPELC_CORRELATION__EXIST,BPELC__UNRESOLVED_ATTRIBUTE" ) public void rule_ExistCorrelationSet_12 () { if (isEmpty(fSetName) || ND_ON_EVENT.equals(fActivityNode.nodeName() )) { return ; } fCorrelationSet = mModelQuery.lookup(mNode, IModelQueryLookups.LOOKUP_NODE_CORRELLETION_SET, fSetName); if (checkAttributeNode(mNode, fCorrelationSet, AT_SET, KIND_NODE) == false) { return ; } // otherwise, the correlationSet is available List<INode> sets = getValue(fActivityNode, "correlation.sets", null ); if (sets != null) { sets.add(fCorrelationSet); } } /** * For <onEvent>, the resolution order of the correlation set(s) referenced * by <correlation> MUST be first the associated scope and then the ancestor * scopes. */ @ARule( sa = 88, desc = "Correlation set lookup, first associated scope, then ancestor scopes", author = "michal.chmielewski@oracle.com", date = "03/15/2007", errors="BPELC__UNSET_ATTRIBUTE,BPELC__UNRESOLVED_ATTRIBUTE" ) public void rule_ExistCorrelationSet_13 () { if (isEmpty(fSetName) || ND_ON_EVENT.equals(fActivityNode.nodeName()) == false) { return ; } INode associatedScope = getValue(fActivityNode,"associated.scope",mNode); fCorrelationSet = mModelQuery.lookup(associatedScope, IModelQueryLookups.LOOKUP_NODE_CORRELLETION_SET, fSetName); markSAExecution(null); if (checkAttributeNode(mNode, fCorrelationSet, AT_SET, KIND_NODE) == false) { return ; } // otherwise, the correlationSet is available List<INode> sets = getValue(fActivityNode, "correlation.sets", null ); if (sets != null) { sets.add(fCorrelationSet); } } /** * End of public rule methods. * * Other methods are support methods for this class to perform its * validation function. * */ }