2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 * implements a random access wrapper around a particular datasource, for passing to
25 * identifyFile and AlignFile objects.
27 public class FileParse
29 public File inFile=null;
30 protected char suffixSeparator = '#';
32 * '#' separated string tagged on to end of filename
33 * or url that was clipped off to resolve to valid filename
35 protected String suffix=null;
36 protected String type=null;
37 protected BufferedReader dataIn=null;
38 protected String errormessage="UNITIALISED SOURCE";
39 protected boolean error=true;
41 * size of readahead buffer used for when initial stream position is marked.
43 final int READAHEAD_LIMIT=2048;
48 * Attempt to open a file as a datasource.
49 * Sets error and errormessage if fileStr was invalid.
51 * @return this.error (true if the source was invalid)
53 private boolean checkFileSource(String fileStr) throws IOException {
54 this.inFile = new File(fileStr);
55 // check to see if it's a Jar file in disguise.
56 if (!inFile.exists()) {
57 errormessage = "FILE NOT FOUND";
60 if (!inFile.canRead()) {
61 errormessage = "FILE CANNOT BE OPENED FOR READING";
64 if (inFile.isDirectory()) {
65 // this is really a 'complex' filetype - but we don't handle directory reads yet.
66 errormessage = "FILE IS A DIRECTORY";
70 dataIn = new BufferedReader(new FileReader(fileStr));
74 private boolean checkURLSource(String fileStr) throws IOException, MalformedURLException
76 errormessage = "URL NOT FOUND";
77 URL url = new URL(fileStr);
78 dataIn = new BufferedReader(new InputStreamReader(url.openStream()));
82 * sets the suffix string (if any) and returns remainder (if suffix was detected)
84 * @return truncated fileStr or null
86 private String extractSuffix(String fileStr) {
87 // first check that there wasn't a suffix string tagged on.
88 int sfpos = fileStr.lastIndexOf(suffixSeparator);
89 if (sfpos>-1 && sfpos<fileStr.length()-1) {
90 suffix = fileStr.substring(sfpos+1);
91 // System.err.println("DEBUG: Found Suffix:"+suffix);
92 return fileStr.substring(0,sfpos);
97 * Create a datasource for input to Jalview.
98 * See AppletFormatAdapter for the types of sources that are handled.
99 * @param fileStr - datasource locator/content
100 * @param type - protocol of source
101 * @throws MalformedURLException
102 * @throws IOException
104 public FileParse(String fileStr, String type)
105 throws MalformedURLException, IOException
110 if (type.equals(AppletFormatAdapter.FILE))
112 if (checkFileSource(fileStr)) {
113 String suffixLess = extractSuffix(fileStr);
114 if (suffixLess!=null && checkFileSource(suffixLess))
116 throw new IOException("Problem opening "+inFile+" (also tried "+fileStr+") : "+errormessage);
118 throw new IOException("Problem opening "+inFile+" : "+errormessage);
121 else if (type.equals(AppletFormatAdapter.URL))
124 checkURLSource(fileStr);
125 if (suffixSeparator=='#')
126 extractSuffix(fileStr); // URL lref is stored for later reference.
127 } catch (IOException e) {
128 String suffixLess = extractSuffix(fileStr);
129 if (suffixLess==null)
134 checkURLSource(suffixLess);
136 catch (IOException e2) {
137 errormessage = "BAD URL WITH OR WITHOUT SUFFIX";
138 throw(e); // just pass back original - everything was wrong.
143 else if (type.equals(AppletFormatAdapter.PASTE))
145 errormessage = "PASTE INACCESSIBLE!";
146 dataIn = new BufferedReader(new StringReader(fileStr));
148 else if (type.equals(AppletFormatAdapter.CLASSLOADER))
150 errormessage = "RESOURCE CANNOT BE LOCATED";
151 java.io.InputStream is = getClass().getResourceAsStream("/" + fileStr);
153 String suffixLess = extractSuffix(fileStr);
154 if (suffixLess!=null)
155 is = getClass().getResourceAsStream("/" + suffixLess);
159 dataIn = new BufferedReader(new java.io.InputStreamReader(is));
165 dataIn.mark(READAHEAD_LIMIT);
167 public String nextLine()
171 return dataIn.readLine();
172 throw new IOException("Invalid Source Stream:"+errormessage);
175 public boolean isValid()
180 * closes the datasource and tidies up.
181 * source will be left in an error state
183 public void close() throws IOException
185 errormessage="EXCEPTION ON CLOSE";
189 errormessage="SOURCE IS CLOSED";
192 * rewinds the datasource the beginning.
195 public void reset() throws IOException
197 if (dataIn!=null && !error) {
200 throw new IOException("Implementation Error: Reset called for invalid source.");