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]
