blob: 54911169b19b084f15ca023a7a5517bb5c368699 [file] [log] [blame]
/*******************************************************************************
* 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.validator.rules;
import java.util.Map;
import java.util.Set;
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 variable related rules.
* <p>
* When thinking
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Sep 14, 2006
*
*/
@SuppressWarnings("nls")
public class LinkValidator extends CValidator {
/** Parent nodes */
static public IFilter<INode> PARENTS = new NodeNameFilter( ND_LINKS );
String ncName ;
protected INode fFlowNode;
protected Set<String> fSet;
protected Map<String,INode> fSourceMap;
protected Map<String,INode> fTargetMap;
protected INode fSourceNode;
protected INode fTargetNode;
/**
* Start performing link checks.
*/
@Override
protected void start () {
super.start();
ncName = mNode.getAttribute( AT_NAME );
fFlowNode = mSelector.selectParent(mNode, Filters.FLOW);
}
/**
* Rule to check the name of the link.
*/
@ARule(
sa = 0,
desc = "Check the NCName of the link",
author = "michal.chmielewski@oracle.com",
date = "02/15/2007",
errors="BPELC__UNSET_ATTRIBUTE,General.NCName_Bad"
)
public void rule_CheckName_1 () {
// Must be a valid NCName ...
if (checkNCName(mNode, ncName, AT_NAME ) == false) {
disableRules();
}
fSet = getValue (fFlowNode, FlowValidator.LINKS_SET , null);
if (fSet != null) {
fSet.add ( ncName );
}
}
/**
* Checks the link connections to source and target.
*
*/
@ARule(
sa = 66,
desc = "Every link must have exactly one activity as source and one as target",
author = "michal.chmielewski@oracle.com",
date = "02/17/2007",
tag = "pass2",
order = 10 ,
errors="BPELC_LINK__NO_SOURCE,BPELC_LINK__NO_TARGET"
)
public void rule_CheckLinkConnections_10 () {
IProblem problem;
fSourceMap = getValue(fFlowNode,FlowValidator.SOURCE_MAP,null);
if (fSourceMap != null) {
if (fSourceMap.containsKey(ncName) == false) {
problem = createError();
problem.fill("BPELC_LINK__NO_SOURCE",
toString(mNode.nodeName()),
ncName);
}
fSourceNode = fSourceMap.get(ncName);
}
fTargetMap = getValue (fFlowNode,FlowValidator.TARGET_MAP,null);
if (fTargetMap != null) {
if (fTargetMap.containsKey(ncName) == false) {
problem = createError();
problem.fill("BPELC_LINK__NO_TARGET",
toString(mNode.nodeName()),
ncName);
}
fTargetNode = fTargetMap.get(ncName);
}
}
/**
* Checks the link connections to source and target.
*
*/
@ARule(
sa = 67,
desc = "Two different links MUST NOT share the same source *and* target activities; "
+ " that is, at most one link may be used to connect two activities.",
author = "michal.chmielewski@oracle.com",
date = "02/17/2007",
tag = "pass2",
order = 12 ,
errors="BPELC_LINK__NOT_UNIQUE"
)
public void rule_CheckDistinctLinks_12 () {
IProblem problem;
if (fSourceMap == null || fTargetMap == null || fSourceNode == null || fTargetNode == null ) {
return ;
}
for(String linkName : fSet) {
// skip ourselves.
if (linkName.equals(ncName)) {
continue;
}
INode linkTarget = fTargetMap.get(linkName);
INode linkSource = fSourceMap.get(linkName);
if (mModelQuery.check(IModelQueryLookups.TEST_EQUAL, linkTarget, fTargetNode) &&
mModelQuery.check(IModelQueryLookups.TEST_EQUAL, linkSource, fSourceNode)) {
problem = createError();
problem.fill("BPELC_LINK__NOT_UNIQUE",
toString(mNode.nodeName()),
ncName,
linkName);
}
}
}
/**
* Check for target before the source ...
*/
@ARule(
sa = 72,
desc = "A <link> declared in a <flow> MUST NOT create a control cycle, "
+ " that is, the source activity must not "
+ " have the target activity as a logically preceding activity.",
author = "michal.chmielewski@oracle.com",
date = "02/17/2007",
tag = "pass2",
order = 14 ,
errors="BPELC_LINK__CYCLE"
)
public void rule_ControlCycle_14 () {
IProblem problem;
if (fSourceNode == null || fTargetNode == null ) {
return ;
}
// check if we can get from target to source node ...
INode linkTarget = null;
INode linkSource = null;
if (mModelQuery.check(IModelQueryLookups.TEST_EQUAL, linkTarget, fTargetNode) &&
mModelQuery.check(IModelQueryLookups.TEST_EQUAL, linkSource, fSourceNode)) {
problem = createError();
problem.fill("BPELC_LINK__CYCLE",
toString(mNode.nodeName()),
ncName,
fSourceNode.nodeName(),
fTargetNode.nodeName()
);
}
}
/**
* End of public rule methods.
*
* Other methods are support methods for this class to perform its
* validation function.
*
*/
}