/******************************************************************************* * 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.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.eclipse.bpel.validator.model.Filters; import org.eclipse.bpel.validator.model.IFilter; 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.Selector; /** * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Oct 5, 2006 * */ @SuppressWarnings("nls") public class CActivityValidator extends CValidator { protected String ncName ; protected String fSuppressJoinFailre; protected List<INode> fCorrelationSets; /** What are my parents */ static public IFilter<INode> PARENTS = Filters.ACTIVITY_CONTAINER; /** (non-Javadoc) * @see org.eclipse.bpel.validator.rules.CValidator#checkChildren() */ @Override public void checkChildren () { super.checkChildren(); checkChild ( ND_TARGETS, 0,1); checkChild ( ND_SOURCES, 0,1); } /** * Start the validation of this node. */ @Override protected void start () { super.start(); ncName = mNode.getAttribute( AT_NAME ); if (ncName == null) { ncName = "Unnamed"; } fCorrelationSets = new ArrayList<INode>(); setValue("correlation.sets", fCorrelationSets); } /** * Rule to check the name of the variable. */ @ARule( date = "10/05/2006", desc = "Check the name of the activity which must be valid NCName", author = "michal.chmielewski@oracle.com", errors="BPELC__UNSET_ATTRIBUTE,General.NCName_Bad" ) public void rule_CheckName_1 () { checkNCName(mNode, ncName, AT_NAME ); } /** * Check the supressJoinFailure attribute. It checks if it is set * and has a value of yes or no. * */ @ARule( date = "10/05/2006", desc = "Check the supressJoinFailure attribute. " + " It checks if it is set and has a value of yes or no.", author = "michal.chmielewski@oracle.com", errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" ) public void rule_CheckSuppressJoinFailure_1 () { fSuppressJoinFailre = getAttribute(mNode, AT_SUPPRESS_JOIN_FAILURE, KIND_ACTIVITY, Filters.BOOLEAN_FILTER, false); if (isEmpty(fSuppressJoinFailre)) { // ask parent INode parent = fParentNode; while (parent != null && isEmpty(fSuppressJoinFailre) ) { fSuppressJoinFailre = getValue(parent,AT_SUPPRESS_JOIN_FAILURE,null); parent = parent.parentNode(); } } setValue(AT_SUPPRESS_JOIN_FAILURE,fSuppressJoinFailre); } /** * Check the start activity, make sure it exists and is positioned correctly. * */ @SuppressWarnings("boxing") public void checkStartActivityPositioning () { // examine the parent of pick. It can only be a // <sequence>, <scope>, or <flow> // // for it to be valid start activity // IProblem problem; INode context = mNode; INode parent = context.parentNode(); boolean bSequenceChecked = false; while (parent != null) { QName pnn = parent.nodeName(); if (ND_FLOW.equals( pnn )) { // OK } else if (ND_SCOPE.equals( pnn ) ) { // OK } else if (ND_PROCESS.equals( pnn ) ) { // OK break; } else if (ND_SEQUENCE.equals (pnn)) { if (bSequenceChecked == false) { // check to see that I am the first element in the sequence List<INode> nodes = mSelector.selectNodes(parent, Selector.ALL, Filters.ACTIVITIES) ; int index = nodes.indexOf( context ) + 1; if (index != 1) { problem = createError(); problem.fill("BPELC__START_ACTIVITY", toString(mNode.nodeName()), index ); } bSequenceChecked = true; } } else { problem = createError(); problem.fill("BPELC__START_ACTIVITY", toString(mNode.nodeName()), -1 ); } context = parent; parent = context.parentNode(); } } }