output now takes alignment, not just sequences
[jalview.git] / src / jalview / io / AppletFormatAdapter.java
1     /*\r
2     * Jalview - A Sequence Alignment Editor and Viewer\r
3     * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4     *\r
5     * This program is free software; you can redistribute it and/or\r
6     * modify it under the terms of the GNU General Public License\r
7     * as published by the Free Software Foundation; either version 2\r
8     * of the License, or (at your option) any later version.\r
9     *\r
10     * This program is distributed in the hope that it will be useful,\r
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13     * GNU General Public License for more details.\r
14     *\r
15     * You should have received a copy of the GNU General Public License\r
16     * along with this program; if not, write to the Free Software\r
17     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18     */\r
19     package jalview.io;\r
20 \r
21     import jalview.datamodel.*;\r
22 \r
23     import java.util.Vector;\r
24 \r
25 \r
26     /**\r
27      * DOCUMENT ME!\r
28      *\r
29      * @author $author$\r
30      * @version $Revision$\r
31      */\r
32     public class AppletFormatAdapter\r
33     {\r
34         /** DOCUMENT ME!! */\r
35         public static final String [] READABLE_FORMATS = new String[]\r
36         {\r
37             "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH", "PDB"\r
38         };\r
39 \r
40         public static final String [] WRITEABLE_FORMATS = new String[]\r
41             {\r
42             "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM"  //, "AMSA"\r
43         };\r
44 \r
45 \r
46         public static String INVALID_CHARACTERS = "Contains invalid characters";\r
47 \r
48         public static String SUPPORTED_FORMATS = "Formats currently supported are\n" +\r
49                                                  "Fasta, MSF, Clustal, BLC, PIR, MSP, and PFAM";\r
50 \r
51 \r
52         public static String FILE = "File";\r
53         public static String URL = "URL";\r
54         public static String PASTE = "Paste";\r
55         public static String CLASSLOADER = "ClassLoader";\r
56 \r
57 \r
58         AlignFile afile = null;\r
59         String inFile;\r
60 \r
61         public static final boolean isValidFormat(String format)\r
62         {\r
63           boolean valid = false;\r
64           for(int i=0; i<READABLE_FORMATS.length; i++)\r
65             if(READABLE_FORMATS[i].equalsIgnoreCase(format))\r
66               return true;\r
67 \r
68           return valid;\r
69         }\r
70 \r
71         /**\r
72          * DOCUMENT ME!\r
73          *\r
74          * @param inFile DOCUMENT ME!\r
75          * @param type DOCUMENT ME!\r
76          * @param format DOCUMENT ME!\r
77          *\r
78          * @return DOCUMENT ME!\r
79          */\r
80         public Alignment readFile(String inFile, String type, String format)\r
81             throws java.io.IOException\r
82         {\r
83             this.inFile = inFile;\r
84             try\r
85             {\r
86               if (format.equals("FASTA"))\r
87               {\r
88                 afile = new FastaFile(inFile, type);\r
89               }\r
90               else if (format.equals("MSF"))\r
91               {\r
92                 afile = new MSFfile(inFile, type);\r
93               }\r
94               else if (format.equals("PileUp"))\r
95               {\r
96                 afile = new PileUpfile(inFile, type);\r
97               }\r
98               else if (format.equals("CLUSTAL"))\r
99               {\r
100                 afile = new ClustalFile(inFile, type);\r
101               }\r
102               else if (format.equals("BLC"))\r
103               {\r
104                 afile = new BLCFile(inFile, type);\r
105               }\r
106               else if (format.equals("PIR"))\r
107               {\r
108                 afile = new PIRFile(inFile, type);\r
109               }\r
110               else if (format.equals("PFAM"))\r
111               {\r
112                 afile = new PfamFile(inFile, type);\r
113               }\r
114               else if (format.equals("JnetFile"))\r
115               {\r
116                 afile = new JPredFile(inFile, type);\r
117                 ( (JPredFile) afile).removeNonSequences();\r
118               }\r
119               else if (format.equals("PDB"))\r
120               {\r
121                 afile = new MCview.PDBfile(inFile, type);\r
122               }\r
123               else if (format.equals("STH"))\r
124               {\r
125                 afile = new StockholmFile(inFile, type);\r
126               }\r
127 \r
128               Alignment al = new Alignment(afile.getSeqsAsArray());\r
129 \r
130               afile.addAnnotations(al);\r
131 \r
132               return al;\r
133             }\r
134             catch (Exception e)\r
135             {\r
136               e.printStackTrace();\r
137               System.err.println("Failed to read alignment using the '" + format +\r
138                                  "' reader.\n"+e);\r
139 \r
140               if(e.getMessage()!=null && e.getMessage().startsWith(INVALID_CHARACTERS))\r
141                 throw new java.io.IOException(e.getMessage());\r
142 \r
143               // Finally test if the user has pasted just the sequence, no id\r
144               if(type.equalsIgnoreCase("Paste"))\r
145               {\r
146                 try{\r
147                   // Possible sequence is just residues with no label\r
148                   afile = new FastaFile(">UNKNOWN\n" + inFile, "Paste");\r
149                   Alignment al = new Alignment(afile.getSeqsAsArray());\r
150                   afile.addAnnotations(al);\r
151                   return al;\r
152 \r
153                 }\r
154                 catch(Exception ex)\r
155                 {\r
156                   if(ex.toString().startsWith(INVALID_CHARACTERS))\r
157                     throw new java.io.IOException(e.getMessage());\r
158 \r
159                   ex.printStackTrace();\r
160                 }\r
161               }\r
162 \r
163               // If we get to this stage, the format was not supported\r
164               throw new java.io.IOException(SUPPORTED_FORMATS);\r
165             }\r
166         }\r
167 \r
168 \r
169         /**\r
170          * DOCUMENT ME!\r
171          *\r
172          * @param format DOCUMENT ME!\r
173          * @param seqs DOCUMENT ME!\r
174          *\r
175          * @return DOCUMENT ME!\r
176          */\r
177         public String formatSequences(String format,\r
178                                       AlignmentI alignment,\r
179                                       boolean jvsuffix)\r
180         {\r
181             try\r
182             {\r
183                 AlignFile afile = null;\r
184 \r
185                 if (format.equalsIgnoreCase("FASTA"))\r
186                 {\r
187                     afile = new FastaFile();\r
188                 }\r
189                 else if (format.equalsIgnoreCase("MSF"))\r
190                 {\r
191                     afile = new MSFfile();\r
192                 }\r
193                 else if (format.equalsIgnoreCase("PileUp"))\r
194                 {\r
195                     afile = new PileUpfile();\r
196                 }\r
197                 else if (format.equalsIgnoreCase("CLUSTAL"))\r
198                 {\r
199                     afile = new ClustalFile();\r
200                 }\r
201                 else if (format.equalsIgnoreCase("BLC"))\r
202                 {\r
203                     afile = new BLCFile();\r
204                 }\r
205                 else if (format.equalsIgnoreCase("PIR"))\r
206                 {\r
207                     afile = new PIRFile();\r
208                 }\r
209                 else if (format.equalsIgnoreCase("PFAM"))\r
210                 {\r
211                     afile = new PfamFile();\r
212                 }\r
213                 else if (format.equalsIgnoreCase("STH"))\r
214                 {\r
215                   afile = new StockholmFile();\r
216                 }\r
217                 else if (format.equals("AMSA"))\r
218                 {\r
219                   afile = new AMSAFile(alignment);\r
220                 }\r
221 \r
222                 afile.addJVSuffix(jvsuffix);\r
223 \r
224                 afile.setSeqs( alignment.getSequencesArray() );\r
225 \r
226                 return afile.print();\r
227             }\r
228             catch (Exception e)\r
229             {\r
230                 System.err.println("Failed to write alignment as a '" + format +\r
231                     "' file\n");\r
232                 e.printStackTrace();\r
233             }\r
234 \r
235             return null;\r
236         }\r
237     }\r