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]
