svn commit: r15680 - trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2008-09-06 08:31:09-0700
New Revision: 15680

Modified:
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java

Log:
RESOLVED - task 5367: Refactor extent management to eliminate windows for bookkeeping errors 
http://argouml.tigris.org/issues/show_bug.cgi?id=5367

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java?view=diff&rev=15680&p1=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java&p2=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java&r1=15679&r2=15680
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java	2008-09-06 08:31:09-0700
@@ -29,6 +29,7 @@
 import java.io.Writer;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -183,8 +184,7 @@
     
     
     /**
-     * Set of extents which are readonly.  For now we assume that the set is 
-     * small and keep it in a simple list that we do a linear search of.
+     * Set of extents and their read-only status. 
      */
     private Map<UmlPackage, Boolean> extents = 
         new ConcurrentHashMap<UmlPackage, Boolean>(10, (float).5, 1);
@@ -202,53 +202,42 @@
         }
         return umlPackage;
     }
-    
-
-    /**
-     * Set the current user model extent.
-     * 
-     * @param uPackage extent/UmlPackage containing latest user model loaded
-     */
-    private void setUmlPackage(UmlPackage uPackage) {
-        // TODO: This will need to change when we support multiple user models.
-        // Currently too much code depends on having a single model to change at
-        // the last minute.
-        
-        // Delete the old extent first
-        if (umlPackage != null) {
-            extents.remove(umlPackage);
-            umlPackage.refDelete();
-        }
-        
-        umlPackage = uPackage;
-        extents.put(umlPackage, Boolean.FALSE);
-        LOG.debug("Registered new extent " + umlPackage);
-        LOG.debug("All registered extents = " + repository.getExtentNames());
-    }
-
 
-    void addExtent(UmlPackage extent, boolean readOnly) {
-        if (readOnly) {
-            extents.put(extent, Boolean.TRUE);
-        } else {
-            setUmlPackage(extent);
-        }
-    }
-    
-    RefPackage createExtent(String name) {
+    RefPackage createExtent(String name, boolean readOnly) {
         try {
-            return getRepository().createExtent(name, getMofPackage());
+            UmlPackage extent = (UmlPackage) getRepository().createExtent(name,
+                    getMofPackage());
+            extents.put(extent, Boolean.valueOf(readOnly));
+            
+            if (!readOnly) {
+                // TODO: This will need to change when we support multiple user
+                // models.
+                
+                // Delete the old extent first
+                if (umlPackage != null) {
+                    deleteExtent(umlPackage);
+                }                
+                umlPackage = extent;
+            }
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Created new " + (readOnly ? "readonly " : "")
+                        + "extent " + umlPackage);
+                LOG.debug("All registered extents = "
+                        + Arrays.toString(repository.getExtentNames()));
+            }
+            return extent;
         } catch (CreationFailedException e) {
             LOG.error("Extent creation failed for " + name);
             return null;
         }
     }
 
-    void removeExtent(UmlPackage extent) {
+    void deleteExtent(UmlPackage extent) {
         if (umlPackage.equals(extent)) {
             umlPackage = null;
         }
         extents.remove(extent);
+        extent.refDelete();
     }
     
     Collection<UmlPackage> getExtents() {
@@ -437,8 +426,7 @@
             LOG.debug("MDR Init - UML extent existed - "
                     + "deleted it and all UML data");
         }
-        umlPackage = (UmlPackage) createExtent(MODEL_EXTENT_NAME);
-        extents.put(umlPackage, Boolean.FALSE);
+        umlPackage = (UmlPackage) createExtent(MODEL_EXTENT_NAME, false);
         LOG.debug("Created default extent");
     }
 

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java?view=diff&rev=15680&p1=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java&p2=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java&r1=15679&r2=15680
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UmlFactoryMDRImpl.java	2008-09-06 08:31:09-0700
@@ -1268,8 +1268,7 @@
                 (org.omg.uml.UmlPackage) ((RefObject) element)
                     .refOutermostPackage();
             LOG.debug("Removing extent " + extent);
-            modelImpl.removeExtent(extent);
-            extent.refDelete();
+            modelImpl.deleteExtent(extent);
         } catch (InvalidObjectException e) {
             throw new InvalidElementException(e);
         }

Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java?view=diff&rev=15680&p1=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java&p2=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java&r1=15679&r2=15680
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java	(original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java	2008-09-06 08:31:09-0700
@@ -167,11 +167,10 @@
                     extentName);
         }
 
-        extent = (UmlPackage) modelImpl.createExtent(extentName);
+        extent = (UmlPackage) modelImpl.createExtent(extentName, readOnly);
         if (extent == null) {
             LOG.error("Failed to create extent " + extentName);
         }
-        modelImpl.addExtent(extent, readOnly);
         
         try {
             LOG.info("Loading to extent '" + extentName + "'");
@@ -270,7 +269,7 @@
             }
 
             if (unknownElement) {
-                modelImpl.removeExtent(extent);
+                modelImpl.deleteExtent(extent);
                 throw new XmiException("Unknown element in XMI file : "
                         + unknownElementName);
             }
@@ -305,10 +304,10 @@
                     throw new XmiException(se.getMessage(), se);
                 }
             }
-            modelImpl.removeExtent(extent);
+            modelImpl.deleteExtent(extent);
             throw new XmiException(e);
         } catch (IOException e) {
-            modelImpl.removeExtent(extent);
+            modelImpl.deleteExtent(extent);
             throw new XmiException(e);
         }
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.