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