| /******************************************************************************* |
| * 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 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 ToPartValidator extends CValidator { |
| |
| /** Nodes which can be our parents */ |
| static public IFilter<INode> PARENTS = new NodeNameFilter( ND_TO_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; |
| |
| |
| /** |
| * @see org.eclipse.bpel.validator.rules.CValidator#start() |
| */ |
| |
| @Override |
| protected void start () { |
| |
| super.start(); |
| |
| /** This is presumably invoke or reply */ |
| fActivityNode = fParentNode.parentNode(); |
| |
| } |
| |
| /** |
| * Check the toVariable on the toPart |
| */ |
| |
| @ARule( |
| desc = "Check the 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_FROM_VARIABLE, KIND_NODE, Filters.NC_NAME, true); |
| } |
| |
| |
| /** |
| * Check the part= toVariable= is a duplicate entry. |
| */ |
| |
| @ARule( |
| sa = 0, |
| desc = "Check to see if part='' fromVariable='' is a duplicate entry.", |
| author = "michal.chmielewski@oracle.com", |
| date = "01/20/2007", |
| errors="BPELC_PART__DUPLICATE" |
| ) |
| |
| public void rule_CheckDuplicatePartFromVariable_1 () { |
| |
| if (fPartName == null) { |
| return ; |
| } |
| |
| String key = "part." + fPartName ; |
| |
| // Parent node is toParts |
| |
| 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 fromVariable 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 (fVariableName == null) { |
| return ; |
| } |
| |
| fVariableNode = mModelQuery.lookup(mNode, |
| IModelQueryLookups.LOOKUP_NODE_VARIABLE, fVariableName); |
| |
| if (checkAttributeNode (mNode, fVariableNode, AT_FROM_VARIABLE, KIND_NODE ) == false) { |
| // variable is not accessible (either undefined or whatever). |
| fVariableNode = null; |
| } |
| |
| if (checkValidator(mNode,fVariableNode,AT_FROM_VARIABLE,KIND_NODE) == false) { |
| fVariableNode = null; |
| return ; |
| } |
| } |
| |
| |
| /** |
| * Check the message part |
| */ |
| @ARule( |
| sa = 54, |
| desc = "Check to see if the fromVariable type matches the part name specified", |
| author = "michal.chmielewski@oracle.com", |
| date = "01/20/2007", |
| errors="BPELC__PA_NO_PART" |
| ) |
| |
| public void rule_CheckMessageParts_5 () { |
| |
| if (fPartName == null) { |
| return ; |
| } |
| |
| |
| // Grab the input message. This is computed by the activity validator. |
| INode inputMessageType = getValue(fActivityNode,"input.message.type",null); |
| if (isUndefined(inputMessageType)) { |
| return; |
| } |
| |
| IProblem problem; |
| |
| fPartNode = mSelector.selectNode(inputMessageType,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, |
| inputMessageType |
| ); |
| |
| return ; |
| } |
| } |
| |
| |
| /** |
| * |
| */ |
| |
| @ARule( |
| sa = 0, |
| desc = "Check toPart and variable type compatibility", |
| author = "michal.chmielewski@oracle.com", |
| date = "03/10/2007", |
| errors="BPELC_XSD__INCOMPATIBLE_TYPE" |
| ) |
| |
| public void rule_CheckToPartTypeCompatibility_20 () { |
| |
| if (isUndefined(fPartNode) || isUndefined(fVariableNode)) { |
| return ; |
| } |
| |
| // Grab the type of the variable, this is already computed by the |
| // variable validator: |
| |
| INode varTypeNode = getValue(fVariableNode,"type",null); |
| if (isUndefined(varTypeNode)) { |
| // something screwy with the variable. |
| return ; |
| } |
| |
| |
| INode partTypeNode = mModelQuery.lookup(fPartNode, |
| IModelQueryLookups.LOOKUP_NODE_TYPE_OF_PART, fPartName); |
| |
| if (isUndefined(partTypeNode)) { |
| // no such part |
| return ; |
| } |
| |
| IProblem problem; |
| |
| |
| if (mModelQuery.check(IModelQueryLookups.TEST_COMPATIBLE_TYPE, partTypeNode, varTypeNode) == false) { |
| problem = createError(); |
| problem.fill("BPELC_XSD__INCOMPATIBLE_TYPE", |
| toString(mNode.nodeName()), |
| "text.term.variable", |
| fVariableName, |
| varTypeNode, |
| "text.term.messagePart", |
| fPartName, |
| partTypeNode |
| ); |
| } |
| |
| } |
| } |