/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.io; import java.io.*; import java.net.*; /** * implements a random access wrapper around a particular datasource, for passing to * identifyFile and AlignFile objects. */ public class FileParse { public File inFile=null; public int index = 1; // sequence counter for FileParse object created from same data source protected char suffixSeparator = '#'; /** * '#' separated string tagged on to end of filename * or url that was clipped off to resolve to valid filename */ protected String suffix=null; protected String type=null; protected BufferedReader dataIn=null; protected String errormessage="UNITIALISED SOURCE"; protected boolean error=true; protected String warningMessage=null; /** * size of readahead buffer used for when initial stream position is marked. */ final int READAHEAD_LIMIT=2048; public FileParse() { } /** * Create a new FileParse instance reading from the same datasource starting at the current position. * WARNING! Subsequent reads from either object will affect the read position of the other, but not * the error state. * * @param from */ public FileParse(FileParse from) throws IOException { if (from==null) { throw new Error("Implementation error. Null FileParse in copy constructor"); } if (from==this) return; index = ++from.index; inFile = from.inFile; suffixSeparator = from.suffixSeparator; suffix = from.suffix; errormessage = from.errormessage; // inherit potential error messages error = false; // reset any error condition. type = from.type; dataIn = from.dataIn; if (dataIn!=null) { mark(); } } /** * Attempt to open a file as a datasource. * Sets error and errormessage if fileStr was invalid. * @param fileStr * @return this.error (true if the source was invalid) */ private boolean checkFileSource(String fileStr) throws IOException { error=false; this.inFile = new File(fileStr); // check to see if it's a Jar file in disguise. if (!inFile.exists()) { errormessage = "FILE NOT FOUND"; error=true; } if (!inFile.canRead()) { errormessage = "FILE CANNOT BE OPENED FOR READING"; error=true; } if (inFile.isDirectory()) { // this is really a 'complex' filetype - but we don't handle directory reads yet. errormessage = "FILE IS A DIRECTORY"; error=true; } if (!error) { dataIn = new BufferedReader(new FileReader(fileStr)); } return error; } private boolean checkURLSource(String fileStr) throws IOException, MalformedURLException { errormessage = "URL NOT FOUND"; URL url = new URL(fileStr); dataIn = new BufferedReader(new InputStreamReader(url.openStream())); return false; } /** * sets the suffix string (if any) and returns remainder (if suffix was detected) * @param fileStr * @return truncated fileStr or null */ private String extractSuffix(String fileStr) { // first check that there wasn't a suffix string tagged on. int sfpos = fileStr.lastIndexOf(suffixSeparator); if (sfpos>-1 && sfpos0); } /** * * @return empty string or warning message about file that was just parsed. */ public String getWarningMessage() { return warningMessage; } public String getInFile() { if (inFile!=null) { return inFile.getAbsolutePath()+" ("+index+")"; } else { return "From Paste + ("+index+")"; } } }