blob: 0ad4838b78bc779fd8378d7f2247979042024d7a [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.ARule;
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.IValue;
import org.eclipse.bpel.validator.model.NodeNameFilter;
import org.eclipse.bpel.validator.model.Validator;
/**
* Validates To nodes.
*
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Oct 10, 2006
*
*/
@SuppressWarnings({"nls","boxing"})
public class ToValidator extends CValidator {
static QName [] ENDPOINT_REFRENCE = { AT_MY_ROLE , AT_PARTNER_ROLE };
/** My parents */
static public IFilter<INode> PARENTS = new NodeNameFilter( ND_COPY );
protected INode fVariableNode ;
protected INode fQueryNode;
protected INode fPartnerLinkNode;
protected INode fPropertyNode;
protected Validator fExprValidator;
protected String fPropertyName;
protected String fPartName;
protected INode fMessageTypeNode;
protected INode fPartNode;
protected String fExpressionLanguage;
/**
*
* @see org.eclipse.bpel.validator.model.Validator#start()
*/
@Override
protected void start () {
super.start();
fVariableNode = mModelQuery.lookup(mNode,
IModelQueryLookups.LOOKUP_NODE_VARIABLE,
mNode.getAttribute(AT_VARIABLE));
fPartName = mNode.getAttribute(AT_PART);
fQueryNode = mNode.getNode(ND_QUERY);
fPartnerLinkNode = mModelQuery.lookup(mNode,
IModelQueryLookups.LOOKUP_NODE_PARTNER_LINK,
mNode.getAttribute(AT_PARTNER_LINK));
fPropertyName = mNode.getAttribute(AT_PROPERTY);
fExpressionLanguage = getLanguage(mNode,AT_EXPRESSIONLANGUAGE);
}
/**
* Checks the from variant. It must be exactly one of
* the variants
*/
@SuppressWarnings("boxing")
@ARule(
author = "michal.chmielewski@oracle.com",
desc = "Checks the allowed formats of the <to> element",
date = "01/15/2007",
sa = 32 ,
errors="BPELC__UNSET_ATTRIBUTE,BPELC__UNRESOLVED_ATTRIBUTE,BPELC_TO__VARIANT",
warnings="BPELC_REF_NODE_PROBLEMS"
)
public void rule_CheckToVariant_10 () {
IProblem problem;
int variant = 0;
if (fVariableNode != null) {
variant += 1;
// if this is bad, disable all rules
if (checkValidator(mNode, fVariableNode, AT_VARIABLE, KIND_NODE) == false ||
checkAttributeNode(mNode, fVariableNode, AT_VARIABLE, KIND_NODE) == false) {
disableRules();
}
}
if (fPartnerLinkNode != null) {
variant += 1;
// if this is bad, disable all rules
if (checkValidator(mNode, fPartnerLinkNode, AT_PARTNER_LINK, KIND_NODE) == false ||
checkAttributeNode(mNode, fPartnerLinkNode, AT_PARTNER_LINK, KIND_NODE) == false) {
disableRules();
}
}
if (variant == 0) {
variant += 1;
}
//
if (variant == 0) {
problem = createError();
problem.fill("BPELC_TO__VARIANT", //$NON-NLS-1$
toString(mNode.nodeName()),
variant);
disableRules();
} else if (variant > 1) {
problem = createError();
problem.fill("BPELC_TO__VARIANT", //$NON-NLS-1$
toString(mNode.nodeName()),
variant);
disableRules();
}
}
/**
* Check the variable variant.
*/
@ARule(
desc = "Variables used in <to> must not have part set if they are schema types. "
+ " (part must not be set) ",
author = "michal.chmielewski@oracle.com",
date = "01/15/2007",
sa = 34 ,
errors="BPELC_TO__VARIABLE_PART,BPELC__PA_NO_PART"
)
public void rule_CheckVariableAndPartVariant_18 () {
IProblem problem ;
if (isUndefined(fVariableNode) || isDefined(fPropertyNode)) {
return ;
}
// The variable has a certain type. Get it from the variable validator.
INode varTypeNode = getValue(fVariableNode,"type",null);
if (isUndefined(varTypeNode)) {
return ;
}
setValue("type",varTypeNode);
// At this point, we know that the variable is defined correctly
// and so it must be either
// 1. message type
// 2. schema type or element
if ( WSDL_ND_MESSAGE.equals(varTypeNode.nodeName()) == false ) {
// then part be better null too (be unset)
if (isEmpty(fPartName) == false) {
problem = createError();
problem.fill ("BPELC_TO__VARIABLE_PART", //$NON-NLS-1$
toString(mNode.nodeName()),
AT_VARIABLE,
fVariableNode.getAttribute(AT_NAME)
);
}
} else if ( isEmpty(fPartName) == false ) {
// it is a message type, figure out the part type
INode partNode = mModelQuery.lookup(varTypeNode,
IModelQueryLookups.LOOKUP_NODE_MESSAGE_PART,fPartName);
if (isUndefined(partNode)) {
problem = createError();
problem.fill("BPELC__PA_NO_PART",
toString(mNode.nodeName()),
fPartName,
varTypeNode);
return ;
}
INode partType = mModelQuery.lookup(partNode,
IModelQueryLookups.LOOKUP_NODE_TYPE_OF_PART,fPartName);
if (isDefined(partType)) {
setValue("type",partType);
}
}
}
/**
* Check the partner link variant as the source.
*
*/
@SuppressWarnings("nls")
@ARule(
author = "michal.chmielewski@oracle.com",
desc = "<to> spec with partnerLink must have partnerRole set.",
date = "01/10/2007",
sa = 37 ,
errors="BPELC_TO__PARTNER_LINK"
)
public void rule_CheckPartnerLinkVariant_20 () {
if (isUndefined(fPartnerLinkNode)) {
return ;
}
IProblem problem;
// check for partner role
String partnerRole = fPartnerLinkNode.getAttribute(AT_PARTNER_ROLE);
//
if (isEmptyOrWhitespace(partnerRole)) {
problem = createError();
problem.fill ("BPELC_TO__PARTNER_LINK",
toString(mNode.nodeName()),
fPartnerLinkNode.getAttribute(AT_NAME),
AT_PARTNER_ROLE);
} else {
// the effective "type" of this is portType.
INode portType = getValue(fPartnerLinkNode,"role.portType." + partnerRole, null);
setValue("type", portType);
}
}
/**
* Check the expression variant.
*
*/
@ARule(
author = "michal.chmielewski@oracle.com",
desc = "Check variable reference expression as used in a <to> element.",
date = "01/10/2007",
sa = 33 ,
warnings="BPELC__NO_EXPRESSION_VALIDATOR"
)
public void rule_CheckExpressionVariant_50 () {
// not this variant.
if (fVariableNode != null ||
fPropertyNode != null ||
fPartnerLinkNode != null ||
fPartName != null ||
fQueryNode != null ) {
return ;
}
if (fExprValidator == null) {
fExprValidator = createExpressionValidator (new QName( fExpressionLanguage, mNode.nodeName().getLocalPart() ) );
if (fExprValidator == null) {
return ;
}
attach ( fExprValidator );
}
// This needs to be late binding, because it is not available
// until Expression validator is run.
setValue("type", new IValue<Object>() {
public Object get() {
return fExprValidator.getValue("expression.type");
}
}
);
}
/** End of public rule methods.
*
* Other methods are support methods for this class to perform its
* validation function.
*
*/
}