svn commit: r14576 - trunk/src/argouml-app/src/org/argouml/persistence

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
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.
      * 
      * {@inheritDoc}

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)
      */
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.