svn commit: r16644 - trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java

Tom Morris <[email protected]>
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2009-01-17 20:20:07-0800
New Revision: 16644

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

Log:
RESOLVED - issue 5634: InvalidObjectException in extent management 
http://argouml.tigris.org/issues/show_bug.cgi?id=5634

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&pathrev=16644&r1=16643&r2=16644
==============================================================================
--- 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	2009-01-17 20:20:07-0800
@@ -38,6 +38,7 @@
 
 import javax.jmi.model.ModelPackage;
 import javax.jmi.model.MofPackage;
+import javax.jmi.reflect.InvalidObjectException;
 import javax.jmi.reflect.RefPackage;
 import javax.jmi.xmi.MalformedXMIException;
 
@@ -202,40 +203,50 @@
     }
 
     RefPackage createExtent(String name, boolean readOnly) {
-        try {
-            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()));
+        synchronized (extents) {
+            try {
+                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;
             }
-            return extent;
-        } catch (CreationFailedException e) {
-            LOG.error("Extent creation failed for " + name);
-            return null;
         }
     }
 
     void deleteExtent(UmlPackage extent) {
-        if (umlPackage.equals(extent)) {
-            umlPackage = null;
+        synchronized (extents) {
+            if (extent.equals(umlPackage)) {
+                umlPackage = null;
+            }
+            extents.remove(extent);
+            try {
+                LOG.debug("Deleting extent " + extent);
+                extent.refDelete();
+            } catch (InvalidObjectException e) {
+                LOG.debug("Attempted to delete same extent twice " + extent);
+            }
         }
-        extents.remove(extent);
-        extent.refDelete();
     }
     
     Collection<UmlPackage> getExtents() {
@@ -446,20 +457,20 @@
 
 
     void createDefaultExtent() {
-        // Create a default extent for the user UML model.  This will get
+        // Create a default extent for the user UML model. This will get
         // replaced if a new model is read in from an XMI file.
-        umlPackage = (UmlPackage) repository.getExtent(MODEL_EXTENT_NAME);
-        if (umlPackage != null) {
-            // NOTE: If we switch to a persistent repository like the b-tree
-            // repository we'll want to keep the old extent(s) around
-            extents.remove(umlPackage);
-            umlPackage.refDelete();
-            umlPackage = null;
-            LOG.debug("MDR Init - UML extent existed - "
-                    + "deleted it and all UML data");
+        synchronized (extents) {
+            umlPackage = (UmlPackage) repository.getExtent(MODEL_EXTENT_NAME);
+            if (umlPackage != null) {
+                // NOTE: If we switch to a persistent repository like the b-tree
+                // repository we'll want to keep the old extent(s) around
+                deleteExtent(umlPackage);
+                LOG.debug("MDR Init - UML extent existed - "
+                        + "deleted it and all UML data");
+            }
+            umlPackage = (UmlPackage) createExtent(MODEL_EXTENT_NAME, false);
+            LOG.debug("Created default extent");
         }
-        umlPackage = (UmlPackage) createExtent(MODEL_EXTENT_NAME, false);
-        LOG.debug("Created default extent");
     }
 
     /**

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

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.