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