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);
         }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to