JAL-2344 FileFormats singleton for formats, FileFormatI simplified
[jalview.git] / src / jalview / io / FileFormat.java
1 package jalview.io;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.PDBEntry;
5 import jalview.ext.jmol.JmolParser;
6 import jalview.structure.StructureImportSettings;
7
8 import java.io.IOException;
9
10 public enum FileFormat implements FileFormatI
11 {
12   Fasta("Fasta", "fa, fasta, mfa, fastq", true, true)
13   {
14     @Override
15     public AlignmentFileI getReader(FileParse source) throws IOException
16     {
17       return new FastaFile(source);
18     }
19
20     @Override
21     public AlignmentFileI getWriter(AlignmentI al)
22     {
23       return new FastaFile();
24     }
25   },
26   Pfam("PFAM", "pfam", true, true)
27   {
28     @Override
29     public AlignmentFileI getReader(FileParse source) throws IOException
30     {
31       return new PfamFile(source);
32     }
33
34     @Override
35     public AlignmentFileI getWriter(AlignmentI al)
36     {
37       return new PfamFile();
38     }
39   },
40   Stockholm("Stockholm", "sto,stk", true, true)
41   {
42     @Override
43     public AlignmentFileI getReader(FileParse source) throws IOException
44     {
45       return new StockholmFile(source);
46     }
47
48     @Override
49     public AlignmentFileI getWriter(AlignmentI al)
50     {
51       return new StockholmFile(al);
52     }
53
54   },
55
56   PIR("PIR", "pir", true, true)
57   {
58     @Override
59     public AlignmentFileI getReader(FileParse source) throws IOException
60     {
61       return new PIRFile(source);
62     }
63
64     @Override
65     public AlignmentFileI getWriter(AlignmentI al)
66     {
67       return new PIRFile();
68     }
69   },
70   BLC("BLC", "BLC", true, true)
71   {
72     @Override
73     public AlignmentFileI getReader(FileParse source) throws IOException
74     {
75       return new BLCFile(source);
76     }
77
78     @Override
79     public AlignmentFileI getWriter(AlignmentI al)
80     {
81       return new BLCFile();
82     }
83   },
84   AMSA("AMSA", "amsa", true, true)
85   {
86     @Override
87     public AlignmentFileI getReader(FileParse source) throws IOException
88     {
89       return new AMSAFile(source);
90     }
91
92     @Override
93     public AlignmentFileI getWriter(AlignmentI al)
94     {
95       return new AMSAFile(al);
96     }
97   },
98   Html("HTML", "html", true, false)
99   {
100     @Override
101     public AlignmentFileI getReader(FileParse source) throws IOException
102     {
103       return new HtmlFile(source);
104     }
105
106     @Override
107     public AlignmentFileI getWriter(AlignmentI al)
108     {
109       return new HtmlFile();
110     }
111
112     @Override
113     public boolean isComplexAlignFile()
114     {
115       return true;
116     }
117
118   },
119   Rnaml("RNAML", "xml,rnaml", true, false)
120   {
121     @Override
122     public AlignmentFileI getReader(FileParse source) throws IOException
123     {
124       return new RnamlFile(source);
125     }
126
127     @Override
128     public AlignmentFileI getWriter(AlignmentI al)
129     {
130       return new RnamlFile();
131     }
132
133   },
134   Json("JSON", "json", true, true)
135   {
136     @Override
137     public AlignmentFileI getReader(FileParse source) throws IOException
138     {
139       return new JSONFile(source);
140     }
141
142     @Override
143     public AlignmentFileI getWriter(AlignmentI al)
144     {
145       return new JSONFile();
146     }
147
148     @Override
149     public boolean isComplexAlignFile()
150     {
151       return true;
152     }
153
154   },
155   Pileup("PileUp", "pileup", true, true)
156   {
157     @Override
158     public AlignmentFileI getReader(FileParse source) throws IOException
159     {
160       return new PileUpfile(source);
161     }
162
163     @Override
164     public AlignmentFileI getWriter(AlignmentI al)
165     {
166       return new PileUpfile();
167     }
168
169   },
170   MSF("MSF", "msf", true, true)
171   {
172     @Override
173     public AlignmentFileI getReader(FileParse source) throws IOException
174     {
175       return new MSFfile(source);
176     }
177
178     @Override
179     public AlignmentFileI getWriter(AlignmentI al)
180     {
181       return new MSFfile();
182     }
183
184   },
185   Clustal("Clustal", "aln", true, true)
186   {
187     @Override
188     public AlignmentFileI getReader(FileParse source) throws IOException
189     {
190       return new ClustalFile(source);
191     }
192
193     @Override
194     public AlignmentFileI getWriter(AlignmentI al)
195     {
196       return new ClustalFile();
197     }
198   },
199   Phylip("PHYLIP", "phy", true, true)
200   {
201     @Override
202     public AlignmentFileI getReader(FileParse source) throws IOException
203     {
204       return new PhylipFile(source);
205     }
206
207     @Override
208     public AlignmentFileI getWriter(AlignmentI al)
209     {
210       return new PhylipFile();
211     }
212   },
213   Jnet("JnetFile", "", false, false)
214   {
215     @Override
216     public AlignmentFileI getReader(FileParse source) throws IOException
217     {
218       JPredFile af = new JPredFile(source);
219       af.removeNonSequences();
220       return af;
221     }
222
223     @Override
224     public AlignmentFileI getWriter(AlignmentI al)
225     {
226       return null; // todo is this called?
227     }
228
229   },
230   Features("GFF or Jalview features", "gff2,gff3", true, false)
231   {
232     @Override
233     public AlignmentFileI getReader(FileParse source) throws IOException
234     {
235       return new FeaturesFile(source);
236     }
237
238     @Override
239     public AlignmentFileI getWriter(AlignmentI al)
240     {
241       return new FeaturesFile();
242     }
243   },
244   PDB("PDB", "pdb,ent", true, false)
245   {
246     @Override
247     public AlignmentFileI getReader(FileParse source) throws IOException
248     {
249       boolean isParseWithJMOL = StructureImportSettings
250               .getDefaultStructureFileFormat() != PDBEntry.Type.PDB;
251       if (isParseWithJMOL)
252       {
253         return new JmolParser(source);
254       }
255       else
256       {
257         StructureImportSettings.setShowSeqFeatures(true);
258         return new MCview.PDBfile(
259                 StructureImportSettings.isVisibleChainAnnotation(),
260                 StructureImportSettings.isProcessSecondaryStructure(),
261                 StructureImportSettings.isExternalSecondaryStructure(),
262                 source);
263       }
264     }
265
266     @Override
267     public AlignmentFileI getWriter(AlignmentI al)
268     {
269       return new JmolParser(); // todo or null?
270     }
271
272     @Override
273     public boolean isStructureFile()
274     {
275       return true;
276     }
277   },
278   MMCif("mmCIF", "cif", true, false)
279   {
280     @Override
281     public AlignmentFileI getReader(FileParse source) throws IOException
282     {
283       return new JmolParser(source);
284     }
285
286     @Override
287     public AlignmentFileI getWriter(AlignmentI al)
288     {
289       return new JmolParser(); // todo or null?
290     }
291
292     @Override
293     public boolean isStructureFile()
294     {
295       return true;
296     }
297   },
298   Jalview("Jalview", "jar,jvp", true, true)
299   {
300     @Override
301     public AlignmentFileI getReader(FileParse source) throws IOException
302     {
303       return null;
304     }
305
306     @Override
307     public AlignmentFileI getWriter(AlignmentI al)
308     {
309       return null;
310     }
311
312     @Override
313     public boolean isTextFormat()
314     {
315       return false;
316     }
317   };
318
319   private boolean writable;
320
321   private boolean readable;
322
323   private String extensions;
324
325   private String name;
326
327   @Override
328   public boolean isComplexAlignFile()
329   {
330     return false;
331   }
332
333   @Override
334   public boolean isReadable()
335   {
336     return readable;
337   }
338
339   @Override
340   public boolean isWritable()
341   {
342     return writable;
343   }
344
345   /**
346    * Constructor
347    * 
348    * @param shortName
349    * @param extensions
350    *          comma-separated list of file extensions associated with the format
351    * @param isReadable
352    * @param isWritable
353    */
354   private FileFormat(String shortName, String extensions,
355           boolean isReadable, boolean isWritable)
356   {
357     this.name = shortName;
358     this.extensions = extensions;
359     this.readable = isReadable;
360     this.writable = isWritable;
361   }
362
363   @Override
364   public String getExtensions()
365   {
366     return extensions;
367   }
368
369   /**
370    * Answers the display name of the file format (as for example shown in menu
371    * options). This name should not be locale (language) dependent.
372    */
373   @Override
374   public String getName()
375   {
376     return name;
377   }
378
379   @Override
380   public boolean isTextFormat()
381   {
382     return true;
383   }
384
385   @Override
386   public boolean isStructureFile()
387   {
388     return false;
389   }
390 }