blob: 31c3291b618eb48fa0d82cb3581f2a10da9b011d [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 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
);
}
}
}