| /******************************************************************************* |
| * 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 javax.xml.namespace.QName; |
| |
| import org.eclipse.bpel.validator.model.Filter; |
| 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.ValueFilter; |
| |
| |
| |
| /** |
| * @author Michal Chmielewski (michal.chmielewski@oracle.com) |
| * @date Jan 18, 2007 |
| * |
| */ |
| |
| @SuppressWarnings({"nls","boxing"}) |
| public class CatchValidator extends CatchAllValidator { |
| |
| protected String fFaultName; |
| |
| protected QName fFaultQName; |
| |
| protected QName fFaultMessageType; |
| |
| protected QName fFaultElement; |
| |
| protected String fFaultVariableName; |
| |
| protected INode fFaultVariableType; |
| |
| |
| /** |
| * @see org.eclipse.bpel.validator.model.Validator#start() |
| */ |
| @Override |
| protected void start() { |
| |
| super.start(); |
| |
| fFaultName = mNode.getAttribute(AT_FAULT_NAME); |
| fFaultVariableName = mNode.getAttribute(AT_FAULT_VARIABLE); |
| } |
| |
| |
| /** |
| * Check to see if the catch handles standard fault. |
| * |
| */ |
| |
| @ARule( |
| date = "01/10/2007", |
| author = "michal.chmielewski@oracle.com", |
| desc = "When exitOnStandardFault=yes, standard fault handlers cannot be present.", |
| sa = 3 , |
| errors="BPELC_CATCH__STANDARD_FAULT" |
| ) |
| public void rule_CheckExitStandardFaults_1 () { |
| |
| if ( fFaultName == null ) { |
| return ; |
| } |
| |
| |
| fFaultQName = mModelQuery.createQName(mNode, fFaultName); |
| |
| if (Filters.STANDARD_FAULTS.select( fFaultQName ) == false) { |
| return ; |
| } |
| |
| String value = getExitOnStandardFault ( mNode ); |
| |
| if (YES.equals( value ) == false) { |
| return ; |
| } |
| |
| // otherwise, we have a standard fault when exit standard faults is set to yes. |
| IProblem problem = createError(); |
| problem.fill ("BPELC_CATCH__STANDARD_FAULT", |
| toString(mNode.nodeName()), |
| fFaultQName ); |
| } |
| |
| |
| |
| static IFilter<QName> TYPE_DEFS = new ValueFilter<QName> ( |
| Filter.QNAME_COMPARATOR, |
| AT_FAULT_MESSAGE_TYPE, AT_FAULT_ELEMENT |
| ); |
| |
| /** |
| * Check fault variable. |
| * |
| */ |
| |
| |
| @ARule( |
| sa = 81, |
| desc = "Fault variable must have message type or element set", |
| author = "michal.chmielewski@oracle.com", |
| date = "01/25/2007", |
| errors="BPELC__AT_LEAST_ONE,BPELC__AT_MOST_ONE,BPELC__UNSET_ATTRIBUTE,BPELC__UNRESOLVED_ATTRIBUTE" |
| ) |
| |
| public void rule_CheckFaultVariable_4 () { |
| |
| IProblem problem; |
| |
| // messageType or element must be used |
| String msgType = mNode.getAttribute(AT_FAULT_MESSAGE_TYPE); |
| String elmDecl = mNode.getAttribute(AT_FAULT_ELEMENT); |
| |
| boolean bMsgTypeEmpty = isEmptyOrWhitespace(msgType); |
| boolean bElmDeclEmpty = isEmptyOrWhitespace(elmDecl); |
| |
| |
| if (isEmpty(fFaultVariableName) == false) { |
| |
| if ( bElmDeclEmpty && bMsgTypeEmpty ) { |
| |
| problem = createError(); |
| problem.fill("BPELC__AT_LEAST_ONE", |
| toString(mNode.nodeName()), |
| KIND_NODE, |
| TYPE_DEFS, |
| KIND_ATTRIBUTE |
| ); |
| // quick exit, nothing to do |
| return ; |
| } |
| |
| |
| if ( !bElmDeclEmpty && !bMsgTypeEmpty) { |
| |
| problem = createError(); |
| problem.fill("BPELC__AT_MOST_ONE", |
| toString(mNode.nodeName()), |
| KIND_NODE, |
| TYPE_DEFS, |
| KIND_ATTRIBUTE |
| ); |
| } |
| |
| |
| |
| if (!bElmDeclEmpty) { |
| // element is specified |
| fFaultVariableType = mModelQuery.lookup(mNode, |
| IModelQueryLookups.LOOKUP_NODE_XSD_ELEMENT,elmDecl); |
| |
| checkAttributeNode(mNode, fFaultVariableType, AT_FAULT_ELEMENT, KIND_NODE); |
| |
| } |
| |
| if (!bMsgTypeEmpty) { |
| // message type is specified |
| fFaultVariableType = mModelQuery.lookup(mNode, |
| IModelQueryLookups.LOOKUP_NODE_MESSAGE_TYPE,msgType); |
| |
| checkAttributeNode(mNode, fFaultVariableType, AT_FAULT_MESSAGE_TYPE, KIND_NODE); |
| } |
| |
| |
| } else { |
| |
| // the message type or element declaration must not be present |
| if (!bElmDeclEmpty || !bMsgTypeEmpty) { |
| problem = createError(); |
| problem.fill("BPELC__SPECIFY_NONE", |
| toString(mNode.nodeName()), |
| KIND_NODE, |
| TYPE_DEFS, |
| KIND_ATTRIBUTE); |
| } |
| |
| } |
| |
| |
| setValue("fault.variable", fFaultVariableName); |
| // fix Bug 323936 |
| setValue("type",fFaultVariableType); |
| |
| } |
| |
| /** |
| * Check if the catch construct already exists. |
| * |
| */ |
| |
| @ARule( |
| sa = 93, |
| desc = "Check to see if a duplicate catch has been specified", |
| author = "michal.chmielewski@oracle.com", |
| date = "01/20/2007", |
| errors="BPELC_CATCH__EXIST" |
| ) |
| public void rule_CheckDuplicateCatch_10 () { |
| |
| String key = "set.catch."; |
| if (fFaultQName != null) { |
| key += AT_FAULT_NAME + "=" + fFaultQName + ";"; |
| } |
| |
| if (fFaultElement != null) { |
| key += AT_FAULT_MESSAGE_TYPE + "=" + fFaultElement + ";" ; |
| } else if (fFaultMessageType != null) { |
| key += AT_FAULT_ELEMENT + "=" + fFaultElement + ";" ; |
| } |
| |
| |
| if (containsValueKey(fParentNode,key)) { |
| |
| IProblem problem = createError(); |
| problem.fill("BPELC_CATCH__EXIST", |
| toString(mNode.nodeName()), |
| fFaultQName, |
| (fFaultMessageType == null ? fFaultElement : fFaultMessageType) |
| ); |
| |
| return ; |
| } |
| |
| setValue(fParentNode, key, Boolean.TRUE); |
| } |
| |
| |
| } |