/******************************************************************************* | |
* 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; | |
/** | |
* Dependency on the BPEL validation model only in here ... | |
*/ | |
import java.util.ArrayList; | |
import java.util.Collections; | |
import java.util.LinkedList; | |
import java.util.List; | |
import org.eclipse.bpel.model.Import; | |
import org.eclipse.bpel.model.Process; | |
import org.eclipse.bpel.validator.model.ARule; | |
import org.eclipse.bpel.validator.model.Filters; | |
import org.eclipse.bpel.validator.model.IConstants; | |
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.NodeAttributeValueFilter; | |
/** | |
* Validates Process nodes. | |
* | |
* | |
* @author Michal Chmielewski (michal.chmielewski@oracle.com) | |
* @date Sep 14, 2006 | |
* | |
*/ | |
@SuppressWarnings({"nls","boxing"}) | |
public class ProcessValidator extends CValidator { | |
String ncName ; | |
protected String fExitStandardFault; | |
protected String fSupressJoinFailure; | |
protected List<INode> fStartActivities ; | |
/** | |
* Start the validation pass. | |
* | |
* | |
* @see org.eclipse.bpel.validator.model.Validator#start() | |
*/ | |
@Override | |
protected void start () { | |
super.start(); | |
this.ncName = this.mNode.getAttribute( AT_NAME ); | |
this.fTypeToCheckList = new LinkedList<INode>(); | |
this.fStartActivities = new ArrayList<INode>(); | |
setValue ("types.to.check",this.fTypeToCheckList); | |
setValue ("start.activities", this.fStartActivities); | |
} | |
/** | |
* Rule to check the name of the process. | |
*/ | |
@ARule( | |
date = "9/14/2006", | |
desc = "Rule to check the name of the process", | |
author = "michal.chmielewski@oracle.com", | |
errors="BPELC__UNSET_ATTRIBUTE,General.NCName_Bad" | |
) | |
public void rule_CheckName_1 () { | |
checkNCName(this.mNode, this.ncName, AT_NAME ); | |
} | |
/** | |
* Check if the expression language is acceptable by the model. | |
*/ | |
@ARule( | |
author = "michal.chmielewski@oracle.com", | |
desc = "Checks the expression language for support in the BPEL model", | |
date = "9/14/2006", | |
sa = 4 , | |
errors="BPELC__UNSUPPORTED_XML_LANG" | |
) | |
public void rule_CheckExpressionLanguage_3 () { | |
String value = this.mNode.getAttribute( AT_EXPRESSIONLANGUAGE ); | |
IProblem problem; | |
if ( isEmpty(value) ) { | |
value = IConstants.XMLNS_XPATH_EXPRESSION_LANGUAGE ; | |
} | |
setValue(AT_EXPRESSIONLANGUAGE, value); | |
// Expression language not supported. | |
if (this.mModelQuery.hasSupport(IModelQueryLookups.SUPPORT_EXPRESSION_LANGUAGE, value) == false) { | |
problem = createError(); | |
problem.fill( "BPELC__UNSUPPORTED_XML_LANG", //$NON-NLS-1$ | |
AT_EXPRESSIONLANGUAGE,value); | |
} | |
setValue (AT_EXPRESSIONLANGUAGE,value); | |
} | |
/** | |
* Check if the query language is supported by the BPEL model. | |
* | |
*/ | |
@ARule( | |
author = "michal.chmielewski@oracle.com", | |
desc = "Checks the query language for support in the BPEL model", | |
date = "9/14/2006", | |
sa = 4 , | |
errors="BPELC__UNSUPPORTED_XML_LANG" | |
) | |
public void rule_CheckQueryLanguage_4 () { | |
String value = this.mNode.getAttribute( AT_QUERYLANGUAGE ); | |
if ( isEmpty(value) ) { | |
value = IConstants.XMLNS_XPATH_EXPRESSION_LANGUAGE; | |
} | |
setValue (AT_QUERYLANGUAGE, value); | |
IProblem problem; | |
// Expression language not supported. | |
if (this.mModelQuery.hasSupport(IModelQueryLookups.SUPPORT_QUERY_LANGUAGE, value) == false) { | |
problem = createError(); | |
problem.fill( "BPELC__UNSUPPORTED_XML_LANG", //$NON-NLS-1$ | |
AT_QUERYLANGUAGE,value); | |
} | |
} | |
/** | |
* Check exit on standard fault | |
* | |
*/ | |
@ARule( | |
sa = 0, | |
desc = "Check exitOnStandardFault attribute setting", | |
author = "michal.chmielewski@oracle.com", | |
date = "01/10/2007", | |
errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" | |
) | |
public void rule_CheckExitOnStandardFault_10 () { | |
this.fExitStandardFault = getAttribute(this.mNode, | |
AT_EXIT_ON_STANDARD_FAULT, | |
KIND_NODE, | |
Filters.BOOLEAN_FILTER, | |
false); | |
if (isEmpty(this.fExitStandardFault)) { | |
this.fExitStandardFault = NO; | |
} | |
setValue(AT_EXIT_ON_STANDARD_FAULT,this.fExitStandardFault); | |
} | |
/** | |
* | |
*/ | |
@ARule( | |
sa = 0, | |
desc = "Check supressJoinFailure attribute setting", | |
author = "michal.chmielewski@oracle.com", | |
date = "01/10/2007", | |
errors="BPELC__UNSET_ATTRIBUTE,BPELC__INVALID_ATTRIBUTE_VALUE" | |
) | |
public void rule_CheckSuppressJoinFailre_11 () { | |
this.fSupressJoinFailure = getAttribute(this.mNode, | |
AT_SUPPRESS_JOIN_FAILURE, | |
KIND_NODE, | |
Filters.BOOLEAN_FILTER, | |
false); | |
if (isEmpty(this.fSupressJoinFailure)) { | |
this.fSupressJoinFailure = NO; | |
} | |
setValue (AT_SUPPRESS_JOIN_FAILURE,this.fSupressJoinFailure); | |
} | |
/** | |
* Check if process has start activity. | |
*/ | |
@ARule( | |
sa = 15, | |
desc = "Verifies that a start activity has been found in the process", | |
author = "michal.chmielewski@oracle.com", | |
date = "02/01/2007", | |
tag = "pass2", | |
order = 1000 , | |
errors="BPELC_PROCESS__NO_START" | |
) | |
public void CheckIfProcessHasStartActivity () { | |
if (this.fStartActivities.size() > 0) { | |
return ; | |
} | |
IProblem problem = createError(); | |
problem.fill("BPELC_PROCESS__NO_START", | |
toString(this.mNode.nodeName()), | |
this.mNode.getAttribute(AT_NAME) | |
); | |
} | |
/** | |
* | |
*/ | |
@ARule( | |
sa = 57, | |
desc = "Check common correlation sets on all the start activities", | |
author = "michal.chmielewski@oracle.com", | |
date = "03/10/2007", | |
tag = "pass2", | |
order = 2000 , | |
errors="BPELC_CORRELATION__COMMON,BPELC_CORRELATION__JOIN" | |
) | |
public void CheckCorrelationSetsOnStartActivities () { | |
// if 0 or 1, then it does not matter ... | |
if (this.fStartActivities.size() < 2) { | |
return ; | |
} | |
/** Compute the common correlation sets (intersection) */ | |
List<INode> commonSets = null; | |
for(INode n : this.fStartActivities) { | |
// The correlation validator sets these. | |
List<INode> correlationSets = Collections.emptyList(); | |
if (containsValueKey(n,"correlation.sets")) { | |
correlationSets = getValue(n,"correlation.sets",null); | |
} | |
// First time through the loop ? | |
if (commonSets == null) { | |
commonSets = new ArrayList<INode>( correlationSets ); | |
continue ; | |
} | |
if (commonSets.size() > 0) { | |
List<INode> intersection = new ArrayList<INode>(); | |
for(INode i1 : commonSets ) { | |
for(INode i2 : correlationSets) { | |
if (i1.equals(i2)) { | |
intersection.add(i2); | |
} | |
} | |
} | |
commonSets.clear(); | |
commonSets.addAll(intersection); | |
} | |
} | |
/** all start activities do *not* specify a correlation */ | |
if (commonSets == null) { | |
return ; | |
} | |
IProblem problem; | |
for(INode s : this.fStartActivities) { | |
INode correlationsNode = mSelector.selectNode(s, ND_CORRELATIONS); | |
if (commonSets.size () == 0 ) { | |
problem = createError(s); | |
problem.fill("BPELC_CORRELATION__COMMON", | |
s.nodeName(), | |
this.fStartActivities.size() | |
); | |
} else { | |
for ( INode correlationSet : commonSets ) { | |
String name = correlationSet.getAttribute(AT_NAME); | |
if (name == null) { | |
continue; | |
} | |
INode correlationNode = mSelector.selectNode(correlationsNode, | |
ND_CORRELATION, | |
new NodeAttributeValueFilter(AT_SET,name) ); | |
if ( isUndefined( correlationNode ) ) { | |
continue; | |
} | |
if (JOIN.equals(correlationNode.getAttribute(AT_INITIATE)) == false) { | |
problem = createError( correlationNode ); | |
problem.fill("BPELC_CORRELATION__JOIN", | |
correlationNode.nodeName(), | |
AT_INITIATE, | |
JOIN ); | |
} | |
} | |
} | |
} | |
} | |
/** | |
* Check the references types against the imports that we have. | |
* | |
*/ | |
@ARule( | |
sa = 14, | |
desc = "Check if used types/elements/messages have conflicting definitions", | |
author = "michal.chmielewski@oracle.com", | |
date = "02/10/2007", | |
tag = "pass2", | |
order = 300 , | |
errors="BPELC_XSD__CONFLICTING_DEFINITION" | |
) | |
// https://issues.jboss.org/browse/JBIDE-8088 | |
// implemented missing code | |
public void rule_CheckReferencedTypes () { | |
IProblem problem; | |
Process process = this.mModelQuery.lookupProcess(this.mNode); | |
for(INode node : this.fTypeToCheckList) { | |
List<Import> conflicts = this.mModelQuery.findConflictingXSD(process, node); | |
if (conflicts!=null) { | |
String conflicting = null; | |
for (int i=1; i<conflicts.size(); ++i) { | |
if (conflicting == null) | |
conflicting = conflicts.get(i).getLocation(); | |
else | |
conflicting += ", " + conflicts.get(i).getLocation(); | |
} | |
problem = createError(node); | |
problem.fill("BPELC_XSD__CONFLICTING_DEFINITION", | |
node.getAttribute(AT_NAME), | |
conflicts.get(0).getLocation(), | |
conflicting | |
); | |
} | |
} | |
} | |
/** End of public rule methods. | |
* | |
* Other methods are support methods for this class to perform its | |
* validation function. | |
* | |
*/ | |
} |