blob: cf7e92f67ec18e2ad62ee260ff53dd045a6cc9e0 [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 javax.xml.namespace.QName;
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.NodeAttributeValueFilter;
import org.eclipse.bpel.validator.model.NodeNameFilter;
/**
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Dec 7, 2006
*
*/
@SuppressWarnings("nls")
public class FromPartValidator extends CValidator {
/** Nodes which can be our parents */
static public IFilter<INode> PARENTS = new NodeNameFilter( ND_FROM_PARTS );
/** Part name */
protected String fPartName;
/** Variable name */
protected String fVariableName;
/** Variable node */
protected INode fVariableNode;
/** Part node */
private INode fPartNode;
/** Which activity from part do I belong to */
protected INode fActivityNode;
/** Message type used by the PLT */
private INode fMessageType;
@Override
protected void start () {
super.start();
fPartName = mNode.getAttribute(AT_PART);
fVariableName = mNode.getAttribute(AT_TO_VARIABLE);
fActivityNode = fParentNode.parentNode();
QName activityName = fActivityNode.nodeName();
if (ND_INVOKE.equals(activityName) ) {
fMessageType = getValue(fActivityNode,"output.message.type",null);
} else {
fMessageType = getValue(fActivityNode,"input.message.type",null);
}
}
/**
* Check the toVariable on the toPart
*/
@ARule(
desc = "Check toVariable on the toPart.",
author = "michal.chmielewski@oracle.com",
date = "03/15/2007",
errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE"
)
public void rule_CheckVariable_1 () {
fPartName = getAttribute(mNode, AT_PART, KIND_NODE, Filters.NC_NAME, true);
fVariableName = getAttribute(mNode, AT_TO_VARIABLE, KIND_ACTIVITY, Filters.NC_NAME, true);
}
/**
* Check the part= toVariable= is a duplicate entry.
*/
@ARule(
sa = 0,
desc = "Check to see if part='' toVariable='' is a duplicate entry.",
author = "michal.chmielewski@oracle.com",
date = "01/20/2007",
errors="BPELC_PART__DUPLICATE"
)
public void rule_CheckDuplicatePartToVariable_1 () {
if (fPartName == null) {
return ;
}
String key = "part." + fPartName;
// Instance data that fromParts holds
if (containsValueKey(fParentNode,key)) {
IProblem problem = createError();
problem.fill("BPELC_PART__DUPLICATE",
toString(mNode.nodeName()),
fPartName,
fVariableName );
return ;
}
setValue(fParentNode, key, Boolean.TRUE);
}
/**
* Checks to see if the variable is defined.
*
*/
@ARule(
sa = 0,
desc = "Checks to see if the toVariable is defined.",
author = "michal.chmielewski@oracle.com",
date = "01/20/2007",
errors="BPELC__UNSET_ATTRIBUTE,BPELC__UNRESOLVED_ATTRIBUTE",
warnings="BPELC_REF_NODE_PROBLEMS"
)
public void rule_CheckVariableDefined_4 () {
if (ND_ON_EVENT.equals(fActivityNode.nodeName())) {
return ;
}
if (fVariableName == null) {
return ;
}
fVariableNode = mModelQuery.lookup(mNode, IModelQueryLookups.LOOKUP_NODE_VARIABLE, fVariableName);
if (checkAttributeNode (mNode, fVariableNode, AT_TO_VARIABLE, KIND_NODE ) == false) {
// variable is not accessible (either undefined or whatever).
fVariableNode = null;
}
if (checkValidator(mNode,fVariableNode,AT_TO_VARIABLE,KIND_NODE) == false) {
fVariableNode = null;
return ;
}
}
/**
* Check the message part
*/
@ARule(
sa = 53,
desc = "Check to see if the toVariable matches the type of the partName",
author = "michal.chmielewski@oracle.com",
date = "01/20/2007",
errors="BPELC_PART__DUPLICATE"
)
public void rule_CheckMessagePart_5 () {
if (fPartName == null || isUndefined(fMessageType) ) {
return ;
}
IProblem problem;
fPartNode = mSelector.selectNode(fMessageType,WSDL_ND_PART,
new NodeAttributeValueFilter(AT_NAME,fPartName) );
if (isUndefined(fPartNode)) {
// no such part
problem = createError();
problem.fill("BPELC__PA_NO_PART",
toString(mNode.nodeName()),
fPartName,
fMessageType.getAttribute(AT_NAME)
);
return ;
}
}
/**
* For <onEvent>, variables referenced by the variable attribute of
* <fromPart> elements or the variable attribute of an <onEvent> element are
* implicitly declared in the associated scope of the event handler.
* Variables of the same names MUST NOT be explicitly declared in the
* associated scope..
*/
@ARule(
sa = 86,
desc = "Variables defined in fromPart are implicitly declared in the associated scope",
author = "michal.chmielewski@oracle.com",
date = "03/15/2007"
)
public void rule_ImplicitOnEventVariable_10 () {
if (ND_ON_EVENT.equals( fActivityNode.nodeName()) == false) {
return ;
}
// the partNode defines the type
}
}