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.