svn commit: r19080 - trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: thn
Date: 2011-02-28 01:54:08-0800
New Revision: 19080

Modified:
   trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java

Log:
support for setting/adding multivalued tagged values

Modified: trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java?view=diff&pathrev=19080&r1=19079&r2=19080
==============================================================================
--- trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java	(original)
+++ trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/ExtensionMechanismsHelperEUMLImpl.java	2011-02-28 01:54:08-0800
@@ -99,8 +99,25 @@
         if (!(taggedValue instanceof Property)) {
             return;
         }
-        Object value = getDefaultValueFor((Property) taggedValue);
-        setTaggedValue(handle, taggedValue, value);
+        Element elem = (Element) handle;
+        Property prop = (Property) taggedValue;
+        Stereotype stereotype = (Stereotype) prop.eContainer();
+        Object value = null;
+        if (prop.isMultivalued()) {
+            value = UMLUtil.getTaggedValue(elem, stereotype.getQualifiedName(),
+                    prop.getName());
+            Collection newValue = new ArrayList();
+            if (value instanceof Collection) {
+                newValue.addAll((Collection) value);
+            } else if (value != null) {
+                newValue.add(value);
+            }
+            newValue.add(getDefaultValueFor((Property) taggedValue));
+            value = newValue;
+        } else {
+            value = getDefaultValueFor((Property) taggedValue);
+        }
+        setTaggedValue(elem, prop, value);
     }
 
     public void applyProfile(Object handle, Object profile) {
@@ -354,9 +371,18 @@
     }
 
     public void setTaggedValue(Object handle, Collection taggedValues) {
-        // TODO: Auto-generated method stub
+        // This doesn't work in UML2: both owner and property needed!
+        throw new UnsupportedOperationException(); 
     }
 
+    /*
+     * Sets the value of an element#s property (tagged value). This method
+     * makes sure that a Collection of values is set if and only if the
+     * property is multivalued (upper multiplicity value greater 1), so passing
+     * a collection is safe.
+     * 
+     * @see org.argouml.model.ExtensionMechanismsHelper#setValueOfTag(java.lang.Object, java.lang.Object, java.lang.Object)
+     */
     public void setTaggedValue(Object handle, Object property, Object value) {
         if (!(handle instanceof Element)) {
             return;
@@ -366,13 +392,43 @@
         }
         Element elem = (Element) handle;
         Property prop = (Property) property;
+        // consider the property multiplicity
+        if (prop.isMultivalued() && !(value instanceof Collection)) {
+            Collection newValue = new ArrayList();
+            newValue.add(value);
+            value = newValue;
+        } else if (!prop.isMultivalued() && value instanceof Collection) {
+            Collection col = (Collection) value;
+            if (col.isEmpty()) {
+                value = null; // or getDefaultValueFor(prop)?
+            } else {
+                // too bad, we choose to take the first value
+                value = col.iterator().next();
+            }
+        }
+        // workaround for missing ability to parse "*"
+        if (value instanceof Collection) {
+            Collection newValue = new ArrayList();
+            for (Object v : ((Collection) value)) {
+                newValue.add(postprocessPropertyValue(prop, v));
+            }
+            value = newValue;
+        } else {
+            value = postprocessPropertyValue(prop, value);
+        }
+        // ready to set the value finally
+        Stereotype stereotype = (Stereotype) prop.eContainer();
+        UMLUtil.setTaggedValue(elem, stereotype, prop.getName(), value);
+    }
+
+    private Object postprocessPropertyValue(Property prop, Object value) {
+        // workaround for missing ability to parse "*"
         if (prop.getType() != null
                 && "UnlimitedNatural".equals(prop.getType().getName())
                 && "*".equals(value)) {
             value = LiteralUnlimitedNatural.UNLIMITED;
         }
-        Stereotype stereotype = (Stereotype) prop.eContainer();
-        UMLUtil.setTaggedValue(elem, stereotype, prop.getName(), value);
+        return value;
     }
 
     public void setTagType(Object handle, String tagType) {
@@ -380,7 +436,7 @@
     }
 
     public void setType(Object handle, Object type) {
-        // TODO: Auto-generated method stub
+        // in case of a tagged value, the type shouldn't be set here
     }
 
     public void setValueOfTag(Object handle, String value) {

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

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.