blob: d69f736818b7c2e56f22a2c6de40b88dedd130a4 [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;
/**
* Dependency on the BPEL validation model only in here ...
*/
import java.util.List;
import org.eclipse.bpel.validator.model.Filters;
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;
/**
* Validate the receive activity.
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Sep 25, 2006
*
*/
@SuppressWarnings({"nls","boxing"})
public class ReceiveValidator extends CPartnerActivityValidator {
protected INode fMyRoleNode;
protected INode fVariable;
protected INode fPortTypeFromRole;
protected String fCreateInstance;
protected int fFromPartsCount;
protected String fVariableName;
/** (non-Javadoc)
* @see org.eclipse.bpel.validator.rules.CValidator#checkChildren()
*/
@Override
public void checkChildren () {
super.checkChildren();
fFromPartsCount = checkChild(ND_FROM_PARTS,0,1);
}
/**
*
* @see org.eclipse.bpel.validator.model.Validator#start()
*/
@Override
protected void start () {
super.start();
}
/**
* Lookup variable
*/
@ARule(
desc = "Check variable on receive activity",
author = "michal.chmielewski@oracle.com",
date = "01/10/2007",
errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE"
)
public void rule_LookupVariable_1 () {
fVariableName = getAttribute(mNode, AT_VARIABLE, KIND_ACTIVITY, Filters.NC_NAME, false);
if (isEmpty(fVariableName) == false) {
fVariable = mModelQuery.lookup(mNode,
IModelQueryLookups.LOOKUP_NODE_VARIABLE,
fVariableName );
}
fPartnerLinkType = null;
fMyRoleNode = null;
}
/**
* Checks to see if the createInstance attribute is set to either yes/no
*
*/
@ARule(
desc = "Check createInstance attribute on receive activity.",
author = "michal.chmielewski@oracle.com",
date = "01/10/2007",
errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE"
)
public void rule_CheckCreateInstanceSetting_2 () {
fCreateInstance = getAttribute(mNode,
AT_CREATE_INSTANCE,
KIND_ACTIVITY,
Filters.BOOLEAN_FILTER,
false);
if (isEmpty(fCreateInstance)) {
fCreateInstance = NO;
}
}
/**
* Check if this is a valid start activity.
*
*/
@ARule(
sa = 56,
desc = "Check if this 'start' <receive> activity is positioned correctly",
author = "michal.chmielewski@oracle.com",
date = "01/10/2007",
errors="BPELC__START_ACTIVITY"
)
public void rule_CheckIfStartActivity_3 () {
if (NO.equals(fCreateInstance)) {
return ;
}
checkStartActivityPositioning();
// mark in the process that we are a start activity.
List<INode> starts = getValue ( mNode.rootNode(), "start.activities" , null );
starts.add( mNode );
}
/**
* Check to see if the variable in the receive is set and is resolvable.
*
*/
@ARule(
sa = 2003,
desc = "Check if inputVariable is set and exists and is defined correctly.",
author="michal.chmielewski@oracle.com",
date = "01/20/2007",
errors="BPELC__UNSET_ATTRIBUTE,BPELC__UNRESOLVED_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE",
warnings="BPELC_REF_NODE_PROBLEMS"
)
public void rule_CheckVariable_3 () {
fVariable = verifyVariable( fVariable, AT_VARIABLE );
}
/**
* Check if the partner role is defined on this partner link.
*/
@ARule(
author = "michal.chmielewski@oracle.com",
date = "9/25/2006",
desc = "Checks if partner role is defined in receive activity.",
errors = "BPELC_MISSING_ROLE"
)
public void rule_CheckIfMyRoleIsDefined_5 () {
fMyRoleNode = lookupRoleNode ( fPartnerLinkNode , AT_MY_ROLE );
}
/**
* Check if the partnerLinkType derived port type and the port type present
* on the receive are one and the same.
*/
@ARule(
author = "michal.chmielewski@oracle.com",
date = "9/25/2006",
desc = "Checks portType and derived portType values on receive activity.",
sa = 5 ,
errors="BPELC_MISMATCH_ROLE_PORT_TYPE"
)
public void rule_CheckRolePortTypeWithReceivePortType_10 () {
fPortTypeFromRole = verifyPortTypeFromRole ( fMyRoleNode, AT_MY_ROLE, fPortType ) ;
}
/**
* 1) Receive needs myRole set.
* 2) myRole -> portType
* 3) portType (has operations) -> operation
* 4) operation -> "input" message must be set.
*/
INode fInputMessage ;
/**
* Checks the Input Message for the receive. This just makes
* sure that input message is defined in the WSDL.
*
*/
@ARule(
author = "michal.chmielewski@oracle.com",
date = "9/25/2006",
desc = "Checks if input messages is defined for receive activity.",
errors="BPELC_PA__NO_MESSAGE,BPELC_PA__MSG_TYPE"
)
public void rule_CheckInputMessage_12 () {
fInputMessage = findMessageType (fPortTypeFromRole, fOperation,WSDL_ND_INPUT, true );
setValue("input.message.type", fInputMessage);
}
/**
* Check variable and message structure compatibility.
*
*/
@ARule(
sa = 58,
desc = "Check message type compatability on receive",
author = "michal.chmielewski@oracle.com",
date = "02/22/2007",
errors="BPELC_PA__MESSAGE_TYPE_MISMATCH"
)
public void rule_CheckVariableAndMessageStructureCompatibility_20 ()
{
IProblem problem;
if (isUndefined(fInputMessage) || isUndefined( fVariable )) {
return ;
}
// the variable validator will have the type of variable.
INode varType = getValue(fVariable,"type", null );
if (isUndefined(varType)) {
return ;
}
// source -> destination
if (mModelQuery.check( IModelQueryLookups.TEST_COMPATIBLE_PARTNER_ACTIVITY_MESSAGE, varType, fInputMessage ) == false) {
problem = createError( );
problem.fill( "BPELC_PA__MESSAGE_TYPE_MISMATCH", //$NON-NLS-1$
toString(mNode.nodeName()),
AT_VARIABLE,
fVariable.getAttribute( AT_NAME ),
fInputMessage,
varType
);
}
}
/**
* Check the presence of fromParts.
*/
@ARule(
sa = 55,
desc = "Check to see if fromPart is specified; if so then " +
" variable must not be used on the receive.",
author = "michal.chmielewski@oracle.com",
date = "01/20/2007",
errors="BPELC__PA_PARTS"
)
public void rule_checkFromPartsPresence_50 () {
List<INode> fFromParts;
fFromParts = mSelector.selectNodes(mNode, ND_FROM_PARTS, ND_FROM_PART );
IProblem problem;
if (fFromParts.size() > 0 && isEmptyOrWhitespace(mNode.getAttribute(AT_VARIABLE)) == false) {
problem = createError();
problem.fill("BPELC__PA_PARTS",
toString(mNode.nodeName()),
toString (ND_FROM_PART) ,
AT_VARIABLE,
KIND_ACTIVITY);
}
}
}