Author: tfmorris
Date: 2008-04-29 15:49:07-0700
New Revision: 14521

Modified:
   trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java
   trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java
   trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java

Log:
issue 4946 - Bob's patches to make sure profile info gets written before XMI 
file

Modified: trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java?view=diff&rev=14521&p1=trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java&p2=trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java&r1=14520&r2=14521
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java        
(original)
+++ trunk/src/argouml-app/src/org/argouml/kernel/MemberList.java        
2008-04-29 15:49:07-0700
@@ -39,19 +39,25 @@
 /**
  * List of ProjectMembers. <p>
  * 
- * The project members are grouped into 4 categories: 
+ * <p>The project members are grouped into 4 categories: 
  * model, diagrams, the todo item list and the profile configuration. <p>
  *
- * The purpose of these categories is to make sure that members are read 
- * and written in the correct order. The model must be read before diagrams, 
- * diagrams must be read before todo items. (Dixit Bob in issue 2979.)
- * The profile configuration is written last. <p>
+ * <p>The purpose of these categories is to make sure that members are read 
+ * and written in the correct order. 
+ * 
+ * <p>When reading the todo items it will fail if the diagrams elements or 
model
+ * elements have not yet been read that they refer to. When reading diagrams
+ * that will fail if the model elements don't yet exist that they refer to.
+ * When loading the model that may fail if the correct profile has not been
+ * loaded.
+ * 
+ * <p>Hence, the save (and therefore load) order is profile, model, diagrams,
+ * todo items.
  *
- * This implementation supports only 1 model member, 
- * multiple diagram members, one todo list member, 
- * and one profile configuration. <p>
+ * <p>This implementation supports only one profile configuration, one model
+ * member, multiple diagram members, one todo list member.
  * 
- * Comments by mvw: <p>
+ * <p>Comments by mvw: <p>
  * This class should be reworked to be independent 
  * of the org.argouml.uml package. That can be done by extending the 
  * ProjectMember interface with functions returning the sorting order, 
@@ -131,20 +137,27 @@
     }
 
     public synchronized Iterator<ProjectMember> iterator() {
-        return buildTempList().iterator();
+        return buildOrderedMemberList().iterator();
     }
 
     public synchronized ListIterator<ProjectMember> listIterator() {
-        return buildTempList().listIterator();
+        return buildOrderedMemberList().listIterator();
     }
 
     public synchronized ListIterator<ProjectMember> listIterator(int arg0) {
-        return buildTempList().listIterator(arg0);
+        return buildOrderedMemberList().listIterator(arg0);
     }
 
-    private List<ProjectMember> buildTempList() {
+    /**
+     * @return the list of members in the order that they need to be written 
+     *         out in.
+     */
+    private List<ProjectMember> buildOrderedMemberList() {
         List<ProjectMember> temp = 
             new ArrayList<ProjectMember>(size());
+        if (profileConfiguration != null) {
+            temp.add(profileConfiguration);
+        }
         if (model != null) {
             temp.add(model);
         }
@@ -152,9 +165,6 @@
         if (todoList != null) {
             temp.add(todoList);
         }
-        if (profileConfiguration != null) {
-            temp.add(profileConfiguration);
-        }
         return temp;
     }
     

Modified: trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java?view=diff&rev=14521&p1=trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java&r1=14520&r2=14521
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java   
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/ArgoParser.java   
2008-04-29 15:49:07-0700
@@ -51,7 +51,7 @@
 
     private ArgoTokenTable tokens = new ArgoTokenTable();
 
-    private List memberList = new ArrayList();
+    private List<String> memberList = new ArrayList<String>();
 
     /**
      * The constructor.
@@ -326,14 +326,7 @@
             throw new SAXException("XML element is null");
         }
         String type = e.getAttribute("type");
-        // The members list dictates the order in which the
-        // members are loaded. So make sure that XMI is at the top
-        // and others below.
-        if (type.equals("xmi")) {
-            memberList.add(0, type);
-        } else {
-            memberList.add(type);
-        }
+        memberList.add(type);
     }
 
     /**
@@ -478,7 +471,7 @@
      * Get the number of diagram members read.
      * @return the number of diagram members read.
      */
-    public List getMemberList() {
+    public List<String> getMemberList() {
         return memberList;
     }
 }

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java?view=diff&rev=14521&p1=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&r1=14520&r2=14521
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
2008-04-29 15:49:07-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -261,48 +261,23 @@
             }
             writer.flush();
 
-            // Write out XMI section first
-            int size = project.getMembers().size();
-            for (int i = 0; i < size; i++) {
-                ProjectMember projectMember = project.getMembers().get(i);
-                if (projectMember.getType().equalsIgnoreCase("xmi")) {
-                    if (LOG.isInfoEnabled()) {
-                        LOG.info("Saving member of type: "
-                              + project.getMembers().get(i).getType());
-                    }
-                    MemberFilePersister persister
-                        = getMemberFilePersister(projectMember);
-                    filteredStream.startEntry();
-                    persister.save(projectMember, filteredStream);
-                    try {
-                        filteredStream.flush();
-                    } catch (IOException e) {
-                        throw new SaveException(e);
-                    }
-                }
-            }
-
             if (progressMgr != null) {
                 progressMgr.nextPhase();
             }
 
-            // Write out all non-XMI sections
-            for (int i = 0; i < size; i++) {
-                ProjectMember projectMember = project.getMembers().get(i);
-                if (!projectMember.getType().equalsIgnoreCase("xmi")) {
-                    if (LOG.isInfoEnabled()) {
-                        LOG.info("Saving member of type: "
-                              + project.getMembers().get(i).getType());
-                    }
-                    MemberFilePersister persister
-                        = getMemberFilePersister(projectMember);
-                    filteredStream.startEntry();
-                    persister.save(projectMember, filteredStream);
-                    try {
-                        filteredStream.flush();
-                    } catch (IOException e) {
-                        throw new SaveException(e);
-                    }
+            // Note we assume members are ordered correctly already
+            for (ProjectMember projectMember : project.getMembers()) {
+                if (LOG.isInfoEnabled()) {
+                    LOG.info("Saving member : " + projectMember);
+                }
+                MemberFilePersister persister
+                    = getMemberFilePersister(projectMember);
+                filteredStream.startEntry();
+                persister.save(projectMember, filteredStream);
+                try {
+                    filteredStream.flush();
+                } catch (IOException e) {
+                    throw new SaveException(e);
                 }
             }
 

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java?view=diff&rev=14521&p1=trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java&r1=14520&r2=14521
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java   
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java   
2008-04-29 15:49:07-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -326,6 +326,8 @@
             
             progressMgr.nextPhase();
             
+            copyMember(file, "profile", encoding, writer);
+            
             copyXmi(file, encoding, writer);
 
             copyDiagrams(file, encoding, writer);
@@ -335,8 +337,6 @@
             // will exist before creating critics.
             copyMember(file, "todo", encoding, writer);
             
-            copyMember(file, "profile", encoding, writer);
-            
             progressMgr.nextPhase();
             
             writer.println("</uml>");
@@ -400,7 +400,7 @@
                     writer.println("<member type='todo' name='.todo' />");
                 }
                 if (containsProfile) {
-               String type = ProfileConfiguration.EXTENSION;
+                    String type = ProfileConfiguration.EXTENSION;
                     writer.println("<member type='" + type + "' name='."
                             + type + "' />");
                 }

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

Reply via email to