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 {
55 this.inFile = new File(fileStr);
56 // check to see if it's a Jar file in disguise.
57 if (!inFile.exists()) {
58 errormessage = "FILE NOT FOUND";
61 if (!inFile.canRead()) {
62 errormessage = "FILE CANNOT BE OPENED FOR READING";
65 if (inFile.isDirectory()) {
66 // this is really a 'complex' filetype - but we don't handle directory reads yet.
67 errormessage = "FILE IS A DIRECTORY";
71 dataIn = new BufferedReader(new FileReader(fileStr));
75 private boolean checkURLSource(String fileStr) throws IOException, MalformedURLException
77 errormessage = "URL NOT FOUND";
78 URL url = new URL(fileStr);
79 dataIn = new BufferedReader(new InputStreamReader(url.openStream()));
83 * sets the suffix string (if any) and returns remainder (if suffix was detected)
85 * @return truncated fileStr or null
87 private String extractSuffix(String fileStr) {
88 // first check that there wasn't a suffix string tagged on.
89 int sfpos = fileStr.lastIndexOf(suffixSeparator);
90 if (sfpos>-1 && sfpos<fileStr.length()-1) {
91 suffix = fileStr.substring(sfpos+1);
92 // System.err.println("DEBUG: Found Suffix:"+suffix);
93 return fileStr.substring(0,sfpos);
98 * Create a datasource for input to Jalview.
99 * See AppletFormatAdapter for the types of sources that are handled.
100 * @param fileStr - datasource locator/content
101 * @param type - protocol of source
102 * @throws MalformedURLException
103 * @throws IOException
105 public FileParse(String fileStr, String type)
106 throws MalformedURLException, IOException
111 if (type.equals(AppletFormatAdapter.FILE))
113 if (checkFileSource(fileStr)) {
114 String suffixLess = extractSuffix(fileStr);
115 if (suffixLess!=null)
117 if (checkFileSource(suffixLess))
119 throw new IOException("Problem opening "+inFile+" (also tried "+suffixLess+") : "+errormessage);
123 throw new IOException("Problem opening "+inFile+" : "+errormessage);
127 else if (type.equals(AppletFormatAdapter.URL))
130 checkURLSource(fileStr);
131 if (suffixSeparator=='#')
132 extractSuffix(fileStr); // URL lref is stored for later reference.
133 } catch (IOException e) {
134 String suffixLess = extractSuffix(fileStr);
135 if (suffixLess==null)
140 checkURLSource(suffixLess);
142 catch (IOException e2) {
143 errormessage = "BAD URL WITH OR WITHOUT SUFFIX";
144 throw(e); // just pass back original - everything was wrong.
149 else if (type.equals(AppletFormatAdapter.PASTE))
151 errormessage = "PASTE INACCESSIBLE!";
152 dataIn = new BufferedReader(new StringReader(fileStr));
154 else if (type.equals(AppletFormatAdapter.CLASSLOADER))
156 errormessage = "RESOURCE CANNOT BE LOCATED";
157 java.io.InputStream is = getClass().getResourceAsStream("/" + fileStr);
159 String suffixLess = extractSuffix(fileStr);
160 if (suffixLess!=null)
161 is = getClass().getResourceAsStream("/" + suffixLess);
165 dataIn = new BufferedReader(new java.io.InputStreamReader(is));
171 dataIn.mark(READAHEAD_LIMIT);
173 public String nextLine()
177 return dataIn.readLine();
178 throw new IOException("Invalid Source Stream:"+errormessage);
181 public boolean isValid()
186 * closes the datasource and tidies up.
187 * source will be left in an error state
189 public void close() throws IOException
191 errormessage="EXCEPTION ON CLOSE";
195 errormessage="SOURCE IS CLOSED";
198 * rewinds the datasource the beginning.
201 public void reset() throws IOException
203 if (dataIn!=null && !error) {
206 throw new IOException("Implementation Error: Reset called for invalid source.");