| /******************************************************************************* |
| * 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; |
| |
| import javax.xml.namespace.QName; |
| |
| import org.eclipse.bpel.validator.model.Filters; |
| import org.eclipse.bpel.validator.model.INode; |
| import org.eclipse.bpel.validator.model.IProblem; |
| import org.eclipse.bpel.validator.model.ARule; |
| |
| |
| |
| /** |
| * Validates CompensateScope nodes. |
| * |
| * |
| * @author Michal Chmielewski (michal.chmielewski@oracle.com) |
| * @date Oct 5, 2006 |
| * |
| */ |
| |
| @SuppressWarnings({"nls","boxing"}) |
| |
| public class CompensateScopeValidator extends CActivityValidator { |
| |
| protected INode fOwnerScopeProcess = null ; |
| |
| protected String fTargetScopeNCName = null; |
| |
| protected INode fTargetScope = null; |
| |
| /** |
| * Checks to make sure that "compensate" is only placed within a |
| * fault handler (catch, catchAll), another compensation handler, |
| * or a termination handler. |
| */ |
| |
| @ARule ( |
| date = "10/5/2006", |
| author = "michal.chmielewski@oracle.com", |
| desc = "Check compensateScope placement.", |
| sa = 7 , |
| errors="BPELC_COMPENSATE__NOT_IN_HANDLER" |
| ) |
| public void rule_CheckPlacement_10 () { |
| |
| INode parent = mNode.parentNode(); |
| while (parent != null) { |
| QName nodeName = parent.nodeName(); |
| |
| if (ND_COMPENSATION_HANDLER.equals ( nodeName ) || |
| ND_TERMINATION_HANDLER.equals ( nodeName ) || |
| ND_CATCH_ALL.equals ( nodeName ) || |
| ND_CATCH.equals ( nodeName ) ) |
| { |
| |
| fOwnerScopeProcess = mSelector.selectParent(parent, Filters.SCOPE_OR_PROCESS ); |
| // found the scope or process |
| return ; |
| } |
| parent = parent.parentNode(); |
| } |
| |
| // at this point we have a problem. |
| IProblem problem = createError(); |
| problem.fill("BPELC_COMPENSATE__NOT_IN_HANDLER", //$NON-NLS-1$ |
| toString(mNode.nodeName()), |
| ncName ); |
| } |
| |
| |
| /** |
| * Check to target scope NCName |
| * |
| */ |
| |
| @ARule( |
| sa = 1004, |
| desc = "Check target scope NCName", |
| author = "michal.chmielewski@oracle.com", |
| date = "02/27/2007", |
| errors="BPELC__UNSET_ATTRIBUTE,General.NCName_Bad" |
| ) |
| |
| public void rule_CheckTargetScopeNCName_15 () { |
| fTargetScopeNCName = mNode.getAttribute( AT_TARGET ); |
| if (checkNCName(mNode, fTargetScopeNCName, AT_TARGET) == false) { |
| disableRules(); |
| } |
| } |
| |
| |
| |
| /** |
| * Check target scope |
| * |
| */ |
| |
| |
| @ARule( |
| sa = 77, |
| desc = "Make sure that the target scope exists", |
| author = "michal.chmielewski@oracle.com", |
| date = "02/27/2007", |
| tag = "pass2", |
| errors="BPELC_COMPENSATE_SCOPE__NO_TARGET" |
| ) |
| |
| public void rule_CheckTargetScope_25 () { |
| |
| if (isUndefined(fOwnerScopeProcess)) { |
| return ; |
| } |
| |
| IProblem problem; |
| |
| fTargetScope = getValue(fOwnerScopeProcess, "immediate.scope.name." + fTargetScopeNCName , null); |
| |
| if (isUndefined(fTargetScope)) { |
| problem = createError(); |
| problem.fill("BPELC_COMPENSATE_SCOPE__NO_TARGET", |
| toString(mNode.nodeName()), |
| mNode.getAttribute(AT_NAME), |
| fTargetScopeNCName |
| ); |
| |
| return ; |
| } |
| |
| QName targetNodeName = fTargetScope.nodeName(); |
| |
| if (targetNodeName.equals(ND_SCOPE) == false && targetNodeName.equals(ND_INVOKE) == false ) { |
| problem = createError(); |
| problem.fill("BPELC_COMPENSATE_SCOPE__NO_TARGET", |
| toString(mNode.nodeName()), |
| mNode.getAttribute(AT_NAME), |
| fTargetScopeNCName |
| ); |
| return ; |
| } |
| |
| // it exists, hurray ! |
| } |
| |
| |
| /** |
| * The target attribute of a <compensateScope> activity MUST refer to a |
| * scope or an invoke activity with a fault handler or compensation handler. |
| * |
| */ |
| |
| |
| @ARule( |
| sa = 78, |
| desc = "Target of compenateScope must have a fault or compensation handler", |
| author = "michal.chmielewski@oracle.com", |
| date = "02/27/2007", |
| tag = "pass2", |
| errors="BPELC_COMPENSATE_SCOPE__TARGET_NO_HANDLERS" |
| ) |
| |
| public void rule_CheckTargetScopeHandlers_27 () { |
| |
| if (isUndefined(fTargetScope)) { |
| return ; |
| } |
| |
| IProblem problem; |
| |
| int compensationHandlers = getValue(fTargetScope, ND_COMPENSATION_HANDLER + ".count", 0); |
| int faultHandlers = getValue(fTargetScope,ND_FAULT_HANDLERS + ".count",0); |
| |
| if (faultHandlers < 1 && compensationHandlers < 1) { |
| problem = createError(); |
| problem.fill("BPELC_COMPENSATE_SCOPE__TARGET_NO_HANDLERS", |
| toString(mNode.nodeName()), |
| mNode.getAttribute(AT_NAME), |
| fTargetScopeNCName, |
| toString(fTargetScope.nodeName()) |
| ); |
| } |
| } |
| |
| |
| /** End of public rule methods. |
| * |
| * Other methods are support methods for this class to perform its |
| * validation function. |
| * |
| */ |
| |
| } |