svn commit: r16685 - 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-21 11:58:38-0800
New Revision: 16685
Modified:
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java
Log:
Issue 5634 - a more complete solution to tighten things up
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=16685&r1=16684&r2=16685
==============================================================================
--- 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-21 11:58:38-0800
@@ -34,7 +34,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import javax.jmi.model.ModelPackage;
import javax.jmi.model.MofPackage;
@@ -186,7 +185,7 @@
* Set of extents and their read-only status.
*/
private Map<UmlPackage, Boolean> extents =
- new ConcurrentHashMap<UmlPackage, Boolean>(10, (float) .5, 1);
+ new HashMap<UmlPackage, Boolean>(10, (float) .5);
/**
* @return Returns the root UML Factory package for user model.
@@ -196,27 +195,32 @@
* before this will be possible.
*/
public UmlPackage getUmlPackage() {
- if (umlPackage == null) {
- LOG.debug("umlPackage is null - no current extent");
+ synchronized (extents) {
+ if (umlPackage == null) {
+ LOG.debug("umlPackage is null - no current extent");
+ }
+ return umlPackage;
}
- return umlPackage;
}
RefPackage createExtent(String name, boolean readOnly) {
- synchronized (extents) {
- try {
+ try {
+ synchronized (extents) {
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.
+ // user models.
// Delete the old extent first
if (umlPackage != null) {
- deleteExtent(umlPackage);
+ try {
+ deleteExtentUnchecked(umlPackage);
+ } catch (InvalidObjectException e) {
+ LOG.debug("User model extent already deleted");
+ }
}
umlPackage = extent;
}
@@ -227,39 +231,46 @@
+ Arrays.toString(repository.getExtentNames()));
}
return extent;
- } catch (CreationFailedException e) {
- LOG.error("Extent creation failed for " + name);
- return null;
}
+ } catch (CreationFailedException e) {
+ LOG.error("Extent creation failed for " + name);
+ return null;
}
}
void deleteExtent(UmlPackage extent) {
synchronized (extents) {
- if (extent.equals(umlPackage)) {
- umlPackage = null;
+ if (umlPackage.equals(extent)) {
+ // Make sure we always have a default extent.
+ // The old extent will get deleted as part of creating the
+ // new extent.
+ createDefaultExtent();
+ } else {
+ deleteExtentUnchecked(extent);
}
+ }
+ }
+
+ private void deleteExtentUnchecked(UmlPackage extent) {
+ synchronized (extents) {
extents.remove(extent);
- try {
- LOG.debug("Deleting extent " + extent);
- extent.refDelete();
- } catch (InvalidObjectException e) {
- LOG.debug("Attempted to delete same extent twice " + extent);
- }
+ extent.refDelete();
}
}
Collection<UmlPackage> getExtents() {
- return extents.keySet();
+ return Collections.unmodifiableSet(extents.keySet());
}
boolean isReadOnly(Object extent) {
- Boolean result = extents.get(extent);
- if (result == null) {
- LOG.warn("Unable to find extent " + extent);
- return false;
+ synchronized (extents) {
+ Boolean result = extents.get(extent);
+ if (result == null) {
+ LOG.warn("Unable to find extent " + extent);
+ return false;
+ }
+ return result.booleanValue();
}
- return result.booleanValue();
}
/**
@@ -456,7 +467,7 @@
}
- void createDefaultExtent() {
+ RefPackage createDefaultExtent() {
// Create a default extent for the user UML model. This will get
// replaced if a new model is read in from an XMI file.
synchronized (extents) {
@@ -464,12 +475,19 @@
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");
+ try {
+ UmlPackage oldPackage = umlPackage;
+ umlPackage = null;
+ deleteExtentUnchecked(oldPackage);
+ LOG.debug("MDR Init - UML extent existed - "
+ + "deleted it and all UML data");
+ } catch (InvalidObjectException e) {
+ LOG.debug("Got error deleting old default user extent");
+ }
}
umlPackage = (UmlPackage) createExtent(MODEL_EXTENT_NAME, false);
LOG.debug("Created default extent");
+ return umlPackage;
}
}
------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=1041925
To unsubscribe from this discussion, e-mail: [[email protected]].