/* * Initial version copyright 2008 Lockheed Martin Corporation, except * as stated in the file entitled Licensing-Information. * * All modifications copyright 2009-2017 Data Access Technologies, Inc. * * Licensed under the Academic Free License version 3.0 * (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. */ package fUML.Semantics.Classes.Kernel; import fUML.Syntax.Classes.Kernel.*; import fUML.Syntax.CommonBehaviors.BasicBehaviors.*; public class RedefinitionBasedDispatchStrategy extends fUML.Semantics.Classes.Kernel.DispatchStrategy { public fUML.Syntax.CommonBehaviors.BasicBehaviors.Behavior getMethod( fUML.Semantics.Classes.Kernel.Object_ object, fUML.Syntax.Classes.Kernel.Operation operation) { // Find the member operation of a type of the given object that // is the same as or a redefinition of the given operation. Then // return the method of that operation, if it has one, otherwise // return a CallEventBehavior as the effective method for the // matching operation. // [If there is more than one type with a matching operation, then // the first one is arbitrarily chosen.] Behavior method = null; int i = 1; while (method == null & i <= object.types.size()) { Class_ type = object.types.getValue(i - 1); NamedElementList members = type.member; int j = 1; while (method == null & j <= members.size()) { NamedElement member = members.getValue(j - 1); if (member instanceof Operation) { Operation memberOperation = (Operation) member; if (this.operationsMatch(memberOperation, operation)) { if (memberOperation.method.size() == 0) { method = super.getMethod(object, memberOperation); } else { method = memberOperation.method.getValue(0); } } } j = j + 1; } i = i + 1; } return method; } // getMethod public boolean operationsMatch( fUML.Syntax.Classes.Kernel.Operation ownedOperation, fUML.Syntax.Classes.Kernel.Operation baseOperation) { // Check if the owned operation is equal to or a redefinition (directly // or indirectly) of the base operation. boolean matches = false; if (ownedOperation == baseOperation) { matches = true; } else { int i = 1; while (!matches & i <= ownedOperation.redefinedOperation.size()) { matches = this.operationsMatch( ownedOperation.redefinedOperation.getValue(i - 1), baseOperation); i = i + 1; } } return matches; } // operationsMatch } // RedefinitionBasedDispatchStrategy