svn commit: r18451 - trunk/src: argouml-app/src/org/argouml/uml/ui argouml-app/tests/org/argouml/kernel argouml-app/tests/org/argouml/notation/providers/uml argouml-core-model-mdr/src/org/argouml/model/mdr argouml-core-model/src/org/argouml/model

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: mvw
Date: 2010-06-21 04:57:41-0700
New Revision: 18451

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/ui/ActionNewDiagram.java
   trunk/src/argouml-app/src/org/argouml/uml/ui/ActionStateDiagram.java
   trunk/src/argouml-app/tests/org/argouml/kernel/TestProject.java
   trunk/src/argouml-app/tests/org/argouml/notation/providers/uml/TestTransitionNotationUml.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/ActivityGraphsFactoryMDRImpl.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesFactoryMDRImpl.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java
   trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesFactory.java
   trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java

Log:
Fix for issue 4282: Statemachine should not be owned by a class.
Creating a statechart diagram or a activity diagram now correctly puts the statemachine or activitygraph in the namespace that owns the context.
This implements WFR 2 of a class for when ArgoUML has to decide on a location for a statemachine.
Added more tests to test the implemented code.
This fix includes changes to the MDR subsystem - the equivalent EUML operations are not yet implemented at all.
TODO: Not all cases are covered - such as operations on imported classes.


Modified: trunk/src/argouml-app/src/org/argouml/uml/ui/ActionNewDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/ui/ActionNewDiagram.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/ui/ActionNewDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/ui/ActionNewDiagram.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    bobtarling
+ *    mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -48,11 +49,11 @@
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
 import org.argouml.model.Model;
+import org.argouml.ui.UndoableAction;
 import org.argouml.ui.explorer.ExplorerEventAdaptor;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.argouml.uml.diagram.ArgoDiagram;
 import org.argouml.uml.diagram.DiagramSettings;
-import org.argouml.ui.UndoableAction;
 
 /**
  * Abstract action to trigger creation of a new diagram. <p>
@@ -85,7 +86,6 @@
      */
     @Override
     public void actionPerformed(ActionEvent e) {
-        super.actionPerformed(e);
 
         // TODO: Get Project or other necessary context from source??
         // e.getSource();
@@ -97,8 +97,10 @@
         Object ns = findNamespace();
         
         if (ns != null && isValidNamespace(ns)) {
-            ArgoDiagram diagram = createDiagram(ns, 
-                    p.getProjectSettings().getDefaultDiagramSettings());
+            super.actionPerformed(e);
+            DiagramSettings settings = 
+                p.getProjectSettings().getDefaultDiagramSettings();
+            ArgoDiagram diagram = createDiagram(ns, settings);
             assert (diagram != null)
             : "No diagram was returned by the concrete class";
 
@@ -115,7 +117,8 @@
     }
 
     /**
-     * Find the right namespace for the diagram.
+     * Find an alternative namespace for the diagram, only to be used 
+     * if the target is not suitable.
      *
      * @return the namespace or null
      */

Modified: trunk/src/argouml-app/src/org/argouml/uml/ui/ActionStateDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/ui/ActionStateDiagram.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/ui/ActionStateDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/ui/ActionStateDiagram.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -96,6 +97,15 @@
             machine = Model.getStateMachinesFactory().createStateMachine();
             if (Model.getFacade().isANamespace(target)) {
                 namespace = target;
+                /* Follow well-formedness rule for a Class [2].
+                 * Determine the owning namespace for the statemachine: */
+                while (Model.getFacade().isAClass(namespace)) {
+                  Object parent = Model.getFacade().getNamespace(namespace);
+                  if (parent == null) {
+                      break;
+                  }
+                  namespace = parent;
+              }
             }
             Model.getCoreHelper().setNamespace(machine, namespace);
             Model.getStateMachinesFactory()
@@ -116,9 +126,4 @@
         return true;
     }
 
-    /**
-     * The UID.
-     */
-    private static final long serialVersionUID = -5197718695001757808L;
-
 }

Modified: trunk/src/argouml-app/tests/org/argouml/kernel/TestProject.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/tests/org/argouml/kernel/TestProject.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-app/tests/org/argouml/kernel/TestProject.java	(original)
+++ trunk/src/argouml-app/tests/org/argouml/kernel/TestProject.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+  *   mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -238,7 +239,12 @@
 
     /**
      * Test deleting a class that contains a Statechart diagram.
-     * The diagram should be deleted, too.
+     * According WFR 2 for a class: 
+     * a class should not contain a statemachine.
+     * Hence, we are testing an abnormal situation.
+     * But anyhow, deleting a class should cause deletion 
+     * of everything in its namespace.
+     * Since the statemachine is deleted, the diagram should be deleted, too.
      */
     public void testDeleteClassWithStateDiagram() {
         Project p = ProjectManager.getManager().getOpenProjects().get(0);
@@ -256,6 +262,8 @@
         // try with Statediagram
         Object machine =
             Model.getStateMachinesFactory().buildStateMachine(aClass);
+        /* Put the statemachine in the namespace of the class: */
+        Model.getCoreHelper().setNamespace(machine, aClass);
         UMLStateDiagram d =
             new UMLStateDiagram(
                     Model.getFacade().getNamespace(machine),

Modified: trunk/src/argouml-app/tests/org/argouml/notation/providers/uml/TestTransitionNotationUml.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/tests/org/argouml/notation/providers/uml/TestTransitionNotationUml.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-app/tests/org/argouml/notation/providers/uml/TestTransitionNotationUml.java	(original)
+++ trunk/src/argouml-app/tests/org/argouml/notation/providers/uml/TestTransitionNotationUml.java	2010-06-21 04:57:41-0700
@@ -58,9 +58,12 @@
  * @author MVW
  */
 public class TestTransitionNotationUml extends TestCase {
+    private Object model;
     private Object aClass;
+    private Object returnType;
     private Object aStateMachine;
     private Object aState;
+    private Object aOper;
 
     /**
      * The constructor.
@@ -79,11 +82,11 @@
         assertTrue("Model subsystem init failed.", Model.isInitiated());
         new InitProfileSubsystem().init();
         Project p = ProjectManager.getManager().getCurrentProject();
-        Object model =
-            Model.getModelManagementFactory().createModel();
-        aClass = Model.getCoreFactory().buildClass(model);
-        Object returnType = p.getDefaultReturnType();
-        Model.getCoreFactory().buildOperation2(aClass, returnType, "myOper");
+        returnType = p.getDefaultReturnType();
+
+        model = Model.getModelManagementFactory().createModel();
+        aClass = Model.getCoreFactory().buildClass("A", model);
+        aOper = Model.getCoreFactory().buildOperation2(aClass, returnType, "myOper");
         aStateMachine =
             Model.getStateMachinesFactory().buildStateMachine(aClass);
         Object top = Model.getFacade().getTop(aStateMachine);
@@ -399,20 +402,140 @@
     /**
      * Test for the parseTrigger() method:
      * linking of an Operation for a CallEvent.
+     * The operation resides on the class that is the context of the 
+     * statemachine:
+     */
+    public void testParseTriggerCallEventOperation1() {
+        checkLinkingOfOperationToCallEvent("myOper()", aOper);
+    }
+
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * With the operation residing on another class within the same 
+     * namespace:
      */
-    public void testParseTriggerCallEventOperation() {
+    public void testParseTriggerCallEventOperation2() {
+        Object bClass = Model.getCoreFactory().buildClass("B", model);
+        Object bOper = Model.getCoreFactory().buildOperation2(bClass, 
+                returnType, "bOper");
+        checkLinkingOfOperationToCallEvent("bOper()", bOper);
+    }
+
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * When the context is a behavioral feature and 
+     * the operation = context:
+     */
+    public void testParseTriggerCallEventOperation3() {
+        Model.getStateMachinesHelper().setContext(aStateMachine, aOper);
+        checkLinkingOfOperationToCallEvent("myOper()", aOper);
+    }
+
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * When the context is a behavioral feature and the operation differs 
+     * from the context:
+     */
+    public void testParseTriggerCallEventOperation4() {
+        Model.getStateMachinesHelper().setContext(aStateMachine, aOper);
+        Object bClass = Model.getCoreFactory().buildClass("B", model);
+        Model.getCoreFactory().buildOperation2(bClass, returnType, "cOper");
+        Object dOper = Model.getCoreFactory().buildOperation2(bClass, 
+                returnType, "dOper");
+        checkLinkingOfOperationToCallEvent("dOper()", dOper);
+    }
+    
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * When the context is a package and the operation is on a class 
+     * within that package:
+     */
+    public void testParseTriggerCallEventOperation5() {
+        Object aPack = Model.getModelManagementFactory().buildPackage("pack1");
+        Model.getCoreHelper().setNamespace(aPack, model);
+        aClass = Model.getCoreFactory().buildClass("A", aPack);
+        aOper = Model.getCoreFactory().buildOperation2(aClass, returnType, "myOper");
+        aStateMachine =
+            Model.getActivityGraphsFactory().buildActivityGraph(aPack);
+       
+        Object top = Model.getFacade().getTop(aStateMachine);
+        aState = Model.getStateMachinesFactory().buildCompositeState(top);
+        
+        Object bClass = Model.getCoreFactory().buildClass("B", aPack);
+        Model.getCoreFactory().buildOperation2(bClass, returnType, "cOper");
+        Object dOper = Model.getCoreFactory().buildOperation2(bClass, 
+                returnType, "dOper");
+        checkLinkingOfOperationToCallEvent("dOper()", dOper);
+    }
+    
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * When the context is a nested class and the operation is on a class 
+     * within the containing package:
+     */
+    public void testParseTriggerCallEventOperation6() {
+        Object aPack = Model.getModelManagementFactory().buildPackage("pack1");
+        Model.getCoreHelper().setNamespace(aPack, model);
+        aClass = Model.getCoreFactory().buildClass("A", aPack);
+        // nested class:
+        Object bClass = Model.getCoreFactory().buildClass("B", aClass);
+        Object cClass = Model.getCoreFactory().buildClass("C", bClass);
+        
+        aStateMachine =
+            Model.getActivityGraphsFactory().buildActivityGraph(cClass);
+        Object top = Model.getFacade().getTop(aStateMachine);
+        aState = Model.getStateMachinesFactory().buildCompositeState(top);
+        
+        Model.getCoreFactory().buildOperation2(cClass, returnType, "cOper");
+        Object dOper = Model.getCoreFactory().buildOperation2(aClass, 
+                returnType, "dOper");
+        checkLinkingOfOperationToCallEvent("dOper()", dOper);
+    }
+    
+    /**
+     * Test for the parseTrigger() method:
+     * linking of an Operation for a CallEvent.
+     * When the context is a nested class and the operation is on the same 
+     * nested class:
+     */
+    public void testParseTriggerCallEventOperation7() {
+        Object aPack = Model.getModelManagementFactory().buildPackage("pack1");
+        Model.getCoreHelper().setNamespace(aPack, model);
+        aClass = Model.getCoreFactory().buildClass("A", aPack);
+        // nested class:
+        Object bClass = Model.getCoreFactory().buildClass("B", aClass);
+        Object cClass = Model.getCoreFactory().buildClass("C", bClass);
+        
+        aStateMachine =
+            Model.getActivityGraphsFactory().buildActivityGraph(cClass);
+        Object top = Model.getFacade().getTop(aStateMachine);
+        aState = Model.getStateMachinesFactory().buildCompositeState(top);
+        
+        Model.getCoreFactory().buildOperation2(cClass, returnType, "cOper");
+        Object dOper = Model.getCoreFactory().buildOperation2(cClass, 
+                returnType, "dOper");
+        checkLinkingOfOperationToCallEvent("dOper()", dOper);
+    }
+    
+    /**
+     * This method only uses the "aState" variable.
+     */
+    private void checkLinkingOfOperationToCallEvent(String text, Object operation) {
         Object trans;
         Object trig;
-        String text;
         Object myOp;
-
-        text = "myOper()"; // this is an existing operation of the class!
         trans = checkGenerated(aState, text, true, false, false, false);
         trig = Model.getFacade().getTrigger(trans);
         assertTrue("Unexpected triggertype found instead of CallEvent for "
                 + text, Model.getFacade().isACallEvent(trig));
         myOp = Model.getFacade().getOperation(trig);
         assertTrue("Operation of CallEvent not linked", myOp != null);
+        assertTrue("Wrong operation linked to callevent", myOp == operation);
     }
 
     /**

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/ActivityGraphsFactoryMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/ActivityGraphsFactoryMDRImpl.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/ActivityGraphsFactoryMDRImpl.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/ActivityGraphsFactoryMDRImpl.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -54,6 +55,7 @@
 import org.omg.uml.foundation.core.Classifier;
 import org.omg.uml.foundation.core.ModelElement;
 import org.omg.uml.foundation.core.Namespace;
+import org.omg.uml.foundation.core.UmlClass;
 
 /**
  * Factory to create UML classes for the UML BehaviorialElements::ActivityGraphs
@@ -145,12 +147,23 @@
     public ActivityGraph buildActivityGraph(Object theContext) {
         if (theContext instanceof ModelElement) {
             ActivityGraph myActivityGraph = createActivityGraph();
-            myActivityGraph.setContext((ModelElement) theContext);
-            if (theContext instanceof Namespace) {
-                myActivityGraph.setNamespace((Namespace) theContext);
-            } else if (theContext instanceof BehavioralFeature) {
-                myActivityGraph.setNamespace(((BehavioralFeature) theContext).
-                        getOwner());
+            ModelElement modelelement = (ModelElement) theContext;
+            myActivityGraph.setContext(modelelement);
+            
+            if (modelelement instanceof BehavioralFeature) {
+                modelelement = ((BehavioralFeature) modelelement).getOwner();
+            }
+            if (modelelement instanceof Namespace) {
+                Namespace namespace = (Namespace) modelelement;
+                /* Follow well-formedness rule for a Class [2].
+                 * See issue 4282. Do not use a class 
+                 * as the namespace for an activityGraph: */
+                while (namespace instanceof UmlClass) {
+                    Namespace pns = namespace.getNamespace();
+                    if (pns == null) break;
+                    namespace = pns;
+                }
+                myActivityGraph.setNamespace(namespace);
             }
             State top =
                     (CompositeState) modelImpl.getStateMachinesFactory()

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesFactoryMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesFactoryMDRImpl.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesFactoryMDRImpl.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesFactoryMDRImpl.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -61,10 +62,10 @@
 import org.omg.uml.behavioralelements.statemachines.TimeEvent;
 import org.omg.uml.behavioralelements.statemachines.Transition;
 import org.omg.uml.foundation.core.BehavioralFeature;
-import org.omg.uml.foundation.core.Classifier;
 import org.omg.uml.foundation.core.ModelElement;
 import org.omg.uml.foundation.core.Namespace;
 import org.omg.uml.foundation.core.Operation;
+import org.omg.uml.foundation.core.UmlClass;
 import org.omg.uml.foundation.datatypes.BooleanExpression;
 import org.omg.uml.foundation.datatypes.PseudostateKindEnum;
 import org.omg.uml.foundation.datatypes.TimeExpression;
@@ -234,14 +235,25 @@
                         isAddingStatemachineAllowed(oContext))) {
             
             StateMachine machine = createStateMachine();
-            ModelElement context = (ModelElement) oContext;
-            machine.setContext(context);
-            if (context instanceof Classifier) {
-                machine.setNamespace((Classifier) context);
-            } else if (context instanceof BehavioralFeature) {
-                BehavioralFeature feature = (BehavioralFeature) context;
-                machine.setNamespace(feature.getOwner());
+            ModelElement modelelement = (ModelElement) oContext;
+            machine.setContext(modelelement);
+            
+            if (modelelement instanceof BehavioralFeature) {
+                modelelement = ((BehavioralFeature) modelelement).getOwner();
+            }
+            if (modelelement instanceof Namespace) {
+                Namespace namespace = (Namespace) modelelement;
+                /* Follow well-formedness rule for a Class [2].
+                 * See issue 4282. Do not use a class 
+                 * as the namespace for a statemachine: */
+                while (namespace instanceof UmlClass) {
+                    Namespace pns = namespace.getNamespace();
+                    if (pns == null) break;
+                    namespace = pns;
+                }
+                machine.setNamespace(namespace);
             }
+
             State top = buildCompositeStateOnStateMachine(machine);
             assert top.equals(machine.getTop());
             return machine;

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    mvw
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -41,6 +42,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.jmi.reflect.InvalidObjectException;
 
@@ -63,11 +65,14 @@
 import org.omg.uml.behavioralelements.statemachines.Transition;
 import org.omg.uml.foundation.core.BehavioralFeature;
 import org.omg.uml.foundation.core.Classifier;
+import org.omg.uml.foundation.core.Feature;
 import org.omg.uml.foundation.core.ModelElement;
+import org.omg.uml.foundation.core.Namespace;
 import org.omg.uml.foundation.core.Operation;
 import org.omg.uml.foundation.datatypes.BooleanExpression;
 import org.omg.uml.foundation.datatypes.Expression;
 import org.omg.uml.foundation.datatypes.TimeExpression;
+import org.omg.uml.modelmanagement.UmlPackage;
 
 /**
  * The State Machines Helper Implementation for MDR.
@@ -262,14 +267,58 @@
         }
         try {
             Object sm = getStateMachine(trans);
-            Object ns = Model.getFacade().getNamespace(sm);
-            if (ns instanceof Classifier) {
-                Collection<Operation> operations = 
-                    Model.getFacade().getOperations(ns);
-                for (Operation op : operations) {
-                    String on = ((ModelElement) op).getName();
-                    if (on.equals(opname)) {
-                        return op;
+            Object context = Model.getFacade().getContext(sm);
+            Classifier classifier = null;
+            if (context instanceof Classifier) {
+                classifier = (Classifier) context;
+            }
+            if (context instanceof BehavioralFeature) {
+                classifier = ((BehavioralFeature) context).getOwner();
+            }
+            if (classifier != null) {
+                List<Feature> features = classifier.getFeature();
+                for (Feature f : features) {
+                    if (f instanceof Operation) {
+                        String on = f.getName();
+                        if (on.equals(opname)) {
+                            return f;
+                        }   
+                    }
+                }
+            }
+            Namespace pack = null;
+            if (context instanceof UmlPackage) {
+                /* according WFR: in case of ActivityGraph only. */
+                pack = (Namespace) context;
+            } else {
+                if (classifier != null) {
+                    Namespace parent = null;
+                    parent = classifier.getNamespace();
+                    while (parent instanceof Classifier) {
+                        if (parent.getNamespace() == null) {
+                            break;
+                        }
+                        parent = parent.getNamespace();
+                    }
+                    if (parent != null) {
+                        pack = parent;
+                    }
+                }
+            }
+            if (pack != null) {
+                Collection<ModelElement> mes = pack.getOwnedElement();
+                for (ModelElement me : mes) {
+                    if (me instanceof Classifier) {
+                        Classifier classifier2 = (Classifier) me;
+                        List<Feature> features = classifier2.getFeature();
+                        for (Feature f : features) {
+                            if (f instanceof Operation) {
+                                String on = f.getName();
+                                if (on.equals(opname)) {
+                                    return f;
+                                }   
+                            }
+                        }
                     }
                 }
             }

Modified: trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesFactory.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesFactory.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesFactory.java	(original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesFactory.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *******************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -153,7 +153,8 @@
     Object buildCompositeStateOnStateMachine(Object statemachine);
 
     /**
-     * Builds a state machine owned by the given context.
+     * Builds a state machine with the given context, in the namespace 
+     * containing the context.
      *
      * @param oContext the given context
      * @return MStateMachine the newly build statemachine

Modified: trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java?view=diff&pathrev=18451&r1=18450&r2=18451
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java	(original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java	2010-06-21 04:57:41-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *******************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
  * 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
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    mvw
  *******************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -167,14 +168,23 @@
     Collection getOutgoingStates(Object ostatevertex);
 
     /**
-     * Finds the operation to which a CallEvent refers.
+     * Finds the operation to which a CallEvent refers, based on the given 
+     * transition. This function determines the context of the statemachine 
+     * that contains the given transition. If the context is a Classifier, then 
+     * all operations of this classifier are candidates. If the context is a 
+     * BehavioralFeature, then all operations of the owner Classifier are 
+     * candidates. The first operation of which the name matches is the result.
+     * For Activity diagrams: If the context is a Package, then
+     * all Operations of all Classifiers in the package are candidates.
      * TODO: This function works for the most normal cases,
      * but needs some testing for rare cases, e.g. internal transitions,...
+     * TODO: The Parameters of the candidates are ignored. Maybe this 
+     * method should return a set of matching operations.
      *
      * @author MVW
-     * @param trans Object of type MTransition
+     * @param trans Object of type Transition
      * @param opname the name of the operation sought
-     * @return Object The operation with the given name, or null.
+     * @return Object the operation with the given name, or null
      */
     Object findOperationByName(Object trans, String opname);

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2624201

To unsubscribe from this discussion, e-mail: [[email protected]].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.