2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import java.util.Locale;
25 import java.util.ArrayList;
26 import java.util.HashSet;
27 import java.util.LinkedHashMap;
28 import java.util.List;
32 import jalview.bin.ApplicationSingletonProvider;
33 import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
36 * A singleton registry of alignment file formats known to Jalview. On startup,
37 * the 'built-in' formats are added (from the FileFormat enum). Additional
38 * formats can be registered (or formats deregistered) programmatically, for
39 * example with a Groovy script.
44 public class FileFormats implements ApplicationSingletonI
46 public static FileFormats getInstance()
48 return ApplicationSingletonProvider.getInstance(FileFormats.class);
52 * Private constructor registers Jalview's built-in file formats
60 * A lookup map of file formats by upper-cased name
62 private Map<String, FileFormatI> formats;
65 * Formats in this set are capable of being identified by IdentifyFile
67 private Set<FileFormatI> identifiable;
71 * Reset to just the built-in file formats packaged with Jalview. These are
72 * added (and will be shown in menus) in the order of their declaration in the
75 public synchronized void reset()
77 formats = new LinkedHashMap<String, FileFormatI>();
78 identifiable = new HashSet<FileFormatI>();
79 for (FileFormat format : FileFormat.values())
81 registerFileFormat(format, format.isIdentifiable());
86 * Answers true if the format is one that can be identified by IdentifyFile.
87 * Answers false for a null value.
89 public boolean isIdentifiable(FileFormatI f)
91 return identifiable.contains(f);
95 * Registers a file format for case-insensitive lookup by name
99 public void registerFileFormat(FileFormatI format)
101 boolean isIdentifiable = format instanceof FileFormat
102 && ((FileFormat) format).isIdentifiable();
103 registerFileFormat(format, isIdentifiable);
106 protected void registerFileFormat(FileFormatI format,
107 boolean isIdentifiable)
109 String name = format.getName().toUpperCase(Locale.ROOT);
110 if (formats.containsKey(name))
112 System.err.println("Overwriting file format: " + format.getName());
114 formats.put(name, format);
117 identifiable.add(format);
122 * Deregisters a file format so it is no longer shown in menus
126 public void deregisterFileFormat(String name)
128 FileFormatI ff = formats.remove(name.toUpperCase(Locale.ROOT));
129 identifiable.remove(ff);
133 * Answers a list of writeable file formats (as strings, corresponding to the
134 * getName() and forName() methods)
137 * if true, only text (not binary) formats are included
140 public List<String> getWritableFormats(boolean textOnly)
142 List<String> l = new ArrayList<String>();
143 for (FileFormatI ff : formats.values())
145 if (ff.isWritable() && (!textOnly || ff.isTextFormat()))
154 * Answers a list of readable file formats (as strings, corresponding to the
155 * getName() and forName() methods)
159 public List<String> getReadableFormats()
161 List<String> l = new ArrayList<String>();
162 for (FileFormatI ff : formats.values())
173 * Returns the file format with the given name, or null if format is null or
174 * invalid. This is not case-sensitive.
179 public FileFormatI forName(String format)
181 return format == null ? null
182 : formats.get(format.toUpperCase(Locale.ROOT));
186 * Returns an iterable collection of registered file formats (in the order in
187 * which they were registered)
191 public Iterable<FileFormatI> getFormats()
193 return formats.values();