Author: tfmorris
Date: 2008-05-01 15:33:00-0700
New Revision: 14576

Modified:
   trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java

Log:
Hoist common method to superclass.  Begin registration framework to allow 
dependencies to be inverted

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java?view=diff&rev=14576&p1=trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java&r1=14575&r2=14576
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java    
    (original)
+++ 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java    
    2008-05-01 15:33:00-0700
@@ -29,13 +29,21 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.swing.event.EventListenerList;
 import javax.swing.filechooser.FileFilter;
 
+import org.apache.log4j.Logger;
+import org.argouml.kernel.ProfileConfiguration;
 import org.argouml.kernel.Project;
+import org.argouml.kernel.ProjectMember;
 import org.argouml.taskmgmt.ProgressEvent;
 import org.argouml.taskmgmt.ProgressListener;
+import org.argouml.uml.ProjectMemberModel;
+import org.argouml.uml.cognitive.ProjectMemberTodoList;
+import org.argouml.uml.diagram.ProjectMemberDiagram;
 import org.argouml.util.ThreadUtils;
 
 /**
@@ -45,7 +53,41 @@
  */
 public abstract class AbstractFilePersister extends FileFilter
         implements ProjectFilePersister {
+
+    private static final Logger LOG = 
+        Logger.getLogger(AbstractFilePersister.class);
+
+    /**
+     * Map of persisters by target class
+     */
+    private static Map<Class, Class<? extends MemberFilePersister>> 
persistersByClass = 
+        new HashMap<Class, Class<? extends MemberFilePersister>>();
+
+    /**
+     * Map of persisters by tag / file extension
+     */
+    private static Map<String, Class<? extends MemberFilePersister>> 
persistersByTag = 
+        new HashMap<String, Class<? extends MemberFilePersister>>();
+
+    static {
+        registerPersister(ProjectMemberDiagram.class, "pgml",
+                DiagramMemberFilePersister.class);
+        registerPersister(ProfileConfiguration.class, "profile",
+                ProfileConfigurationFilePersister.class);
+        registerPersister(ProjectMemberTodoList.class, "todo",
+                TodoListMemberFilePersister.class);
+        registerPersister(ProjectMemberModel.class, "xmi",
+                ModelMemberFilePersister.class);
+    }
+    
     private EventListenerList listenerList = new EventListenerList();
+    
+    private static boolean registerPersister(Class target, String tag,
+            Class<? extends MemberFilePersister> persister) {
+        persistersByClass.put(target, persister);
+        persistersByTag.put(tag, persister);
+        return true;
+    }
 
     /**
      * Create a temporary copy of the existing file.
@@ -296,6 +338,63 @@
      * @return true if the persister is associated to an icon 
      */
     public abstract boolean hasAnIcon();
+
+    
+    /**
+     * Get a MemberFilePersister based on a given ProjectMember.
+     *
+     * @param pm the project member
+     * @return the persister
+     */
+    protected MemberFilePersister getMemberFilePersister(ProjectMember pm) {
+        Class<? extends MemberFilePersister> persister = null;
+        if (persistersByClass.containsKey(pm)) {
+            persister = persistersByClass.get(pm);
+        } else {
+            /*
+             * TODO: Not sure we need to do this, but just to be safe for now.
+             */       
+            for (Class clazz : persistersByClass.keySet()) {
+                if (clazz.isAssignableFrom(pm.getClass())) {
+                    persister = persistersByClass.get(clazz);
+                    break;
+                }
+            }
+        }
+        if (persister != null) {
+            return newPersister(persister);
+        }
+        return null;
+    }
+
+
+    /**
+     * Get a MemberFilePersister based on a given tag.
+     *
+     * @param tag The tag.
+     * @return the persister
+     */
+    protected MemberFilePersister getMemberFilePersister(String tag) {
+        Class<? extends MemberFilePersister> persister = 
+            persistersByTag.get(tag);
+        if (persister != null) {
+            return newPersister(persister);
+        }
+        return null;
+    }
+
+    private static MemberFilePersister newPersister(
+            Class<? extends MemberFilePersister> clazz) {
+        try {
+            return clazz.newInstance();
+        } catch (InstantiationException e) {
+            LOG.error("Exception instantiating file persister " + clazz, e);
+            return null;
+        } catch (IllegalAccessException e) {
+            LOG.error("Exception instantiating file persister " + clazz, e);
+            return null;
+        }
+    }
     
     // TODO: Document 
     class ProgressMgr implements ProgressListener {

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=14576&p1=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&r1=14575&r2=14576
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
2008-05-01 15:33:00-0700
@@ -68,9 +68,6 @@
 import org.argouml.kernel.ProjectFactory;
 import org.argouml.kernel.ProjectMember;
 import org.argouml.model.UmlException;
-import org.argouml.uml.ProjectMemberModel;
-import org.argouml.uml.cognitive.ProjectMemberTodoList;
-import org.argouml.uml.diagram.ProjectMemberDiagram;
 import org.argouml.util.ThreadUtils;
 import org.tigris.gef.ocl.ExpansionException;
 import org.tigris.gef.ocl.OCLExpander;
@@ -635,55 +632,6 @@
     }
 
     /**
-     * Get a MemberFilePersister based on a given ProjectMember.
-     *
-     * @param pm the project member
-     * @return the persister
-     */
-    protected MemberFilePersister getMemberFilePersister(ProjectMember pm) {
-        MemberFilePersister persister = null;
-        if (pm instanceof ProjectMemberDiagram) {
-            // TODO: Cyclic dependency between PersistanceManager and here
-            PersistenceManager.getInstance()
-                    .getDiagramMemberFilePersister();
-        // use the following instead
-//        persister = new DiagramMemberFilePersister();
-        } else if (pm instanceof ProjectMemberTodoList) {
-            persister = new TodoListMemberFilePersister();
-        } else if (pm instanceof ProfileConfiguration) {
-            persister = new ProfileConfigurationFilePersister();
-        } else if (pm instanceof ProjectMemberModel) {
-            persister = new ModelMemberFilePersister();
-        }
-        return persister;
-    }
-
-    /**
-     * Get a MemberFilePersister based on a given ProjectMember.
-     *
-     * @param tag The tag.
-     * @return the persister
-     */
-    protected MemberFilePersister getMemberFilePersister(String tag) {
-        MemberFilePersister persister = null;
-        if (tag.equals("pgml")) {
-            persister = 
-            // TODO: Cyclic dependency between PersistanceManager and here
-               PersistenceManager.getInstance()
-                        .getDiagramMemberFilePersister();
-            // use the following instead
-//            persister = new DiagramMemberFilePersister();
-        } else if (tag.equals("todo")) {
-            persister = new TodoListMemberFilePersister();
-        } else if (tag.equals("profile")) {
-            persister = new ProfileConfigurationFilePersister();
-        } else if (tag.equals("xmi")) {
-            persister = new ModelMemberFilePersister();
-        }
-        return persister;
-    }
-
-    /**
      * Returns true. All Argo specific files have an icon.
      * 
      * [EMAIL PROTECTED]

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java?view=diff&rev=14576&p1=trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java&r1=14575&r2=14576
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java     
2008-05-01 15:33:00-0700
@@ -43,10 +43,6 @@
 import org.argouml.kernel.ProjectManager;
 import org.argouml.kernel.ProjectMember;
 import org.argouml.model.Model;
-import org.argouml.uml.ProjectMemberModel;
-import org.argouml.uml.cognitive.ProjectMemberTodoList;
-import org.argouml.uml.diagram.ProjectMemberDiagram;
-import org.argouml.kernel.ProfileConfiguration;
 import org.xml.sax.InputSource;
 
 /**
@@ -184,31 +180,6 @@
         }
     }
 
-    /**
-     * Get a MemberFilePersister based on a given ProjectMember.
-     *
-     * @param pm the project member
-     * @return the persister
-     */
-    protected MemberFilePersister getMemberFilePersister(ProjectMember pm) {
-        MemberFilePersister persister = null;
-        if (pm instanceof ProjectMemberDiagram) {
-            persister = 
-            // TODO: Cyclic dependency between PersistanceManager and here
-                PersistenceManager.getInstance()
-                    .getDiagramMemberFilePersister();
-            // possibly use the following instead
-//            persister = new DiagramMemberFilePersister();
-        } else if (pm instanceof ProfileConfiguration) {
-            persister = new ProfileConfigurationFilePersister();
-        } else if (pm instanceof ProjectMemberTodoList) {
-            persister = new TodoListMemberFilePersister();
-        } else if (pm instanceof ProjectMemberModel) {
-            persister = new ModelMemberFilePersister();
-        }
-        return persister;
-    }
-
     /*
      * @see org.argouml.persistence.ProjectFilePersister#doLoad(java.io.File)
      */

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

Reply via email to