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 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.
*/
{
}
/**
+ * 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()) {
*/
private String extractSuffix(String fileStr) {
// first check that there wasn't a suffix string tagged on.
- int sfpos = fileStr.lastIndexOf('#');
+ int sfpos = fileStr.lastIndexOf(suffixSeparator);
if (sfpos>-1 && sfpos<fileStr.length()-1) {
suffix = fileStr.substring(sfpos+1);
// System.err.println("DEBUG: Found Suffix:"+suffix);
{
if (checkFileSource(fileStr)) {
String suffixLess = extractSuffix(fileStr);
- if (suffixLess!=null && checkFileSource(suffixLess))
+ if (suffixLess!=null)
+ {
+ if (checkFileSource(suffixLess))
+ {
+ throw new IOException("Problem opening "+inFile+" (also tried "+suffixLess+") : "+errormessage);
+ }
+ } else
{
- throw new IOException("Problem opening "+inFile+" (also tried "+fileStr+") : "+errormessage);
- }
- // returns normally.
- } else {
throw new IOException("Problem opening "+inFile+" : "+errormessage);
+ }
}
}
else if (type.equals(AppletFormatAdapter.URL))
{
try {
+ try {
checkURLSource(fileStr);
- String suffixLess = extractSuffix(fileStr); // URL lref is stored for later reference.
+ if (suffixSeparator=='#')
+ extractSuffix(fileStr); // URL lref is stored for later reference.
} catch (IOException e) {
String suffixLess = extractSuffix(fileStr);
if (suffixLess==null)
}
}
}
+ }
+ catch (Exception e)
+ {
+ errormessage = "CANNOT ACCESS DATA AT URL '"+fileStr+"' ("+e.getMessage()+")";
+ error=true;
+ }
}
else if (type.equals(AppletFormatAdapter.PASTE))
{
error = true;
}
}
+ if (dataIn==null)
+ {
+ // pass up the reason why we have no source to read from
+ throw new IOException("Failed to read data from source:\n"+errormessage);
+ }
error=false;
dataIn.mark(READAHEAD_LIMIT);
}
+ /**
+ * mark the current position in the source as start
+ * for the purposes of it being analysed by IdentifyFile().identify
+ * @throws IOException
+ */
+ public void mark() throws IOException
+ {
+ if (dataIn!=null)
+ {
+ dataIn.mark(READAHEAD_LIMIT);
+ } else {
+ throw new IOException("Unitialised Source Stream");
+ }
+ }
public String nextLine()
throws IOException
{
throw new IOException("Implementation Error: Reset called for invalid source.");
}
}
+ /**
+ *
+ * @return true if there is a warning for the user
+ */
+ public boolean hasWarningMessage() {
+ return (warningMessage!=null && warningMessage.length()>0);
+ }
+ /**
+ *
+ * @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+")";
+ }
+ }
+
+ public Reader getReader() throws IOException
+ {
+ if (dataIn!=null && dataIn.ready())
+ {
+ return dataIn;
+ }
+ return null;
+ }
}