| /******************************************************************************* |
| * 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. |
| * |
| */ |
| |
| } |