diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java index ff0c39f41..551d9eff8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java @@ -28,10 +28,7 @@ import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.PrintStream; +import java.io.*; import java.util.Collection; import java.util.TreeMap; @@ -85,36 +82,32 @@ public class GATKReport { * @param file the file to load */ private void loadReport(File file) { + BufferedReader reader; + String reportHeader; try { - BufferedReader reader = new BufferedReader(new FileReader(file)); - - String reportHeader = reader.readLine(); - - // Read the first line for the version and number of tables. - version = GATKReportVersion.fromHeader(reportHeader); - if (version.equals(GATKReportVersion.V0_1) || - version.equals(GATKReportVersion.V0_2)) - throw new UserException("The GATK no longer supports reading legacy GATK Reports. Please use v1.0 or newer."); - - int nTables = Integer.parseInt(reportHeader.split(":")[2]); - - // Read each tables according ot the number of tables - for (int i = 0; i < nTables; i++) { - addTable(new GATKReportTable(reader, version)); - - /* - if ( !blankLine.equals("") ) { - throw new StingException("The GATK Report File is corrupted or not formatted correctly"); - } - */ - } + reader = new BufferedReader(new FileReader(file)); + reportHeader = reader.readLine(); + } catch (FileNotFoundException e) { + throw new ReviewedStingException("Could not open file : " + file); + } catch (IOException e) { + throw new ReviewedStingException("Could not read file : " + file); + } - } catch (Exception e) { - // todo - improve exception handling - //throw new StingException("Cannot read GATKReport: " + e); - e.printStackTrace(); + // Read the first line for the version and number of tables. + version = GATKReportVersion.fromHeader(reportHeader); + if (version.equals(GATKReportVersion.V0_1) || + version.equals(GATKReportVersion.V0_2)) + throw new UserException("The GATK no longer supports reading legacy GATK Reports. Please use v1.0 or newer."); + + int nTables = Integer.parseInt(reportHeader.split(":")[2]); + + // Read each tables according ot the number of tables + for (int i = 0; i < nTables; i++) { + addTable(new GATKReportTable(reader, version)); } + + } /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java index 81d7d7710..e45ffc486 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java @@ -29,6 +29,7 @@ import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.text.TextFormattingUtils; import java.io.BufferedReader; +import java.io.IOException; import java.io.PrintStream; import java.util.*; import java.util.regex.Matcher; @@ -54,85 +55,107 @@ public class GATKReportTable { private GATKReportColumns columns; + private static final String COULD_NOT_READ_HEADER = "Could not read the header of this file -- "; + private static final String COULD_NOT_READ_COLUMN_NAMES = "Could not read the column names of this file -- "; + private static final String COULD_NOT_READ_DATA_LINE = "Could not read a data line of this table -- "; + private static final String COULD_NOT_READ_EMPTY_LINE = "Could not read the last empty line of this table -- "; + private static final String OLD_GATK_TABLE_VERSION = "We no longer support older versions of the GATK Tables"; + public GATKReportTable(BufferedReader reader, GATKReportVersion version) { - try { + int counter = 0; - int counter = 0; - - switch (version) { - case V1_0: - int nHeaders = 2; - String[] tableHeaders = new String[nHeaders]; - - // Read in the headers - for (int i = 0; i < nHeaders; i++) { + switch (version) { + case V1_0: + int nHeaders = 2; + String[] tableHeaders = new String[nHeaders]; + + // Read in the headers + for (int i = 0; i < nHeaders; i++) { + try { tableHeaders[i] = reader.readLine(); + } catch (IOException e) { + throw new ReviewedStingException(COULD_NOT_READ_HEADER + e.getMessage()); } - String[] tableData = tableHeaders[0].split(":"); - String[] userData = tableHeaders[1].split(":"); - - // Fill in the fields - tableName = userData[2]; - tableDescription = userData[3]; - primaryKeyDisplay = Boolean.parseBoolean(tableData[2]); - columns = new GATKReportColumns(); - - int nColumns = Integer.parseInt(tableData[3]); - int nRows = Integer.parseInt(tableData[4]); - - - // Read column names - String columnLine = reader.readLine(); - - List columnStarts = TextFormattingUtils.getWordStarts(columnLine); - String[] columnNames = TextFormattingUtils.splitFixedWidth(columnLine, columnStarts); - - if (primaryKeyDisplay) { - addPrimaryKey(columnNames[0]); - - } else { - sortByPrimaryKey = true; - addPrimaryKey("id", false); - counter = 1; + } + String[] tableData = tableHeaders[0].split(":"); + String[] userData = tableHeaders[1].split(":"); + + // Fill in the fields + tableName = userData[2]; + tableDescription = (userData.length <= 3) ? "" : userData[3]; // table may have no description! (and that's okay) + primaryKeyDisplay = Boolean.parseBoolean(tableData[2]); + columns = new GATKReportColumns(); + + int nColumns = Integer.parseInt(tableData[3]); + int nRows = Integer.parseInt(tableData[4]); + + + // Read column names + String columnLine; + try { + columnLine = reader.readLine(); + } catch (IOException e) { + throw new ReviewedStingException(COULD_NOT_READ_COLUMN_NAMES); + } + + List columnStarts = TextFormattingUtils.getWordStarts(columnLine); + String[] columnNames = TextFormattingUtils.splitFixedWidth(columnLine, columnStarts); + + if (primaryKeyDisplay) { + addPrimaryKey(columnNames[0]); + + } else { + sortByPrimaryKey = true; + addPrimaryKey("id", false); + counter = 1; + } + // Put in columns using the format string from the header + for (int i = 0; i < nColumns; i++) { + String format = tableData[5 + i]; + if (primaryKeyDisplay) + addColumn(columnNames[i + 1], true, format); + else + addColumn(columnNames[i], true, format); + } + + for (int i = 0; i < nRows; i++) { + // read line + String dataLine; + try { + dataLine = reader.readLine(); + } catch (IOException e) { + throw new ReviewedStingException(COULD_NOT_READ_DATA_LINE + e.getMessage()); } - // Put in columns using the format string from the header - for (int i = 0; i < nColumns; i++) { - String format = tableData[5 + i]; - if (primaryKeyDisplay) - addColumn(columnNames[i + 1], true, format); - else - addColumn(columnNames[i], true, format); - } - - for (int i = 0; i < nRows; i++) { - // read line - List lineSplits = Arrays.asList(TextFormattingUtils.splitFixedWidth(reader.readLine(), columnStarts)); - - for (int columnIndex = 0; columnIndex < nColumns; columnIndex++) { - - //Input all the remaining values - GATKReportDataType type = getColumns().getByIndex(columnIndex).getDataType(); - - if (primaryKeyDisplay) { - String columnName = columnNames[columnIndex + 1]; - String primaryKey = lineSplits.get(0); - set(primaryKey, columnName, type.Parse(lineSplits.get(columnIndex + 1))); - } else { - String columnName = columnNames[columnIndex]; - set(counter, columnName, type.Parse(lineSplits.get(columnIndex))); - } - + List lineSplits = Arrays.asList(TextFormattingUtils.splitFixedWidth(dataLine, columnStarts)); + + for (int columnIndex = 0; columnIndex < nColumns; columnIndex++) { + + //Input all the remaining values + GATKReportDataType type = getColumns().getByIndex(columnIndex).getDataType(); + + if (primaryKeyDisplay) { + String columnName = columnNames[columnIndex + 1]; + String primaryKey = lineSplits.get(0); + set(primaryKey, columnName, type.Parse(lineSplits.get(columnIndex + 1))); + } else { + String columnName = columnNames[columnIndex]; + set(counter, columnName, type.Parse(lineSplits.get(columnIndex))); } - counter++; + } - - + counter++; + } + + + try { reader.readLine(); - // When you see empty line or null, quit out - } - } catch (Exception e) { - //throw new StingException("Cannot read GATKReport: " + e); - e.printStackTrace(); + } catch (IOException e) { + throw new ReviewedStingException(COULD_NOT_READ_EMPTY_LINE + e.getMessage()); + } + break; + + default: + throw new ReviewedStingException(OLD_GATK_TABLE_VERSION); } } @@ -418,12 +441,11 @@ public class GATKReportTable { if (newValue != null) value = newValue; - if (column.getDataType().equals(GATKReportDataType.fromObject(value)) || - column.getDataType().equals(GATKReportDataType.Unknown) ) + // todo -- Types have to be more flexible. For example, %d should accept Integers, Shorts and Bytes. + if (column.getDataType().equals(GATKReportDataType.fromObject(value)) || column.getDataType().equals(GATKReportDataType.Unknown) ) columns.get(columnName).put(primaryKey, value); else - throw new ReviewedStingException(String.format("Tried to add an object of type: %s to a column of type: %s", - GATKReportDataType.fromObject(value).name(), column.getDataType().name())); + throw new ReviewedStingException(String.format("Tried to add an object of type: %s to a column of type: %s", GATKReportDataType.fromObject(value).name(), column.getDataType().name())); } /**