Changes to allow the primary key of a table to be hidden. Formatting changes to account for when that column is hidden.

git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@4947 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
kiran 2011-01-06 15:26:38 +00:00
parent fdc514ded3
commit 307c41c128
1 changed files with 70 additions and 7 deletions

View File

@ -1,8 +1,13 @@
package org.broadinstitute.sting.gatk.report;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* A data structure that allows data to be collected over the course of a walker's computation, then have that data
@ -92,8 +97,22 @@ public class GATKReportTable {
private String primaryKeyName;
private TreeSet<Object> primaryKeyColumn;
private boolean primaryKeyDisplay;
private HashMap<String, GATKReportColumn> columns;
private LinkedHashMap<String, GATKReportColumn> columns;
/**
* Verifies that a table or column name has only alphanumeric characters - no spaces or special characters allowed
*
* @param name the name of the table or column
* @return true if the name is valid, false if otherwise
*/
private boolean isValidName(String name) {
Pattern p = Pattern.compile("[^a-zA-Z0-9_]");
Matcher m = p.matcher(name);
return !m.find();
}
/**
* Construct a new GATK report table with the specified name and description
@ -102,10 +121,14 @@ public class GATKReportTable {
* @param tableDescription the description of the table
*/
public GATKReportTable(String tableName, String tableDescription) {
if (!isValidName(tableName)) {
throw new ReviewedStingException("Attempted to set a GATKReportTable name of '" + tableName + "'. GATKReportTable names must be purely alphanumeric - no spaces or special characters are allowed.");
}
this.tableName = tableName;
this.tableDescription = tableDescription;
columns = new HashMap<String, GATKReportColumn>();
columns = new LinkedHashMap<String, GATKReportColumn>();
}
/**
@ -114,9 +137,30 @@ public class GATKReportTable {
* @param primaryKeyName the name of the primary key column
*/
public void addPrimaryKey(String primaryKeyName) {
if (!isValidName(primaryKeyName)) {
throw new ReviewedStingException("Attempted to set a GATKReportTable primary key name of '" + primaryKeyName + "'. GATKReportTable primary key names must be purely alphanumeric - no spaces or special characters are allowed.");
}
this.primaryKeyName = primaryKeyName;
primaryKeyColumn = new TreeSet<Object>();
primaryKeyDisplay = true;
}
/**
* Add an optionally visible primary key column. This becomes the unique identifier for every column in the table, and will always be printed as the first column.
*
* @param primaryKeyName the name of the primary key column
*/
public void addPrimaryKey(String primaryKeyName, boolean display) {
if (!isValidName(primaryKeyName)) {
throw new ReviewedStingException("Attempted to set a GATKReportTable primary key name of '" + primaryKeyName + "'. GATKReportTable primary key names must be purely alphanumeric - no spaces or special characters are allowed.");
}
this.primaryKeyName = primaryKeyName;
primaryKeyColumn = new TreeSet<Object>();
primaryKeyDisplay = display;
}
/**
@ -126,6 +170,10 @@ public class GATKReportTable {
* @param defaultValue the default value for the column
*/
public void addColumn(String columnName, Object defaultValue) {
if (!isValidName(columnName)) {
throw new ReviewedStingException("Attempted to set a GATKReportTable column name of '" + columnName + "'. GATKReportTable column names must be purely alphanumeric - no spaces or special characters are allowed.");
}
addColumn(columnName, defaultValue, true);
}
@ -467,12 +515,19 @@ public class GATKReportTable {
// Emit the table definition
out.printf("##:GATKReport.v0.1 %s : %s%n", tableName, tableDescription);
// Emit the table header
out.printf(primaryKeyFormat, primaryKeyName);
// Emit the table header, taking into account the padding requirement if the primary key is a hidden column
boolean needsPadding = false;
if (primaryKeyDisplay) {
out.printf(primaryKeyFormat, primaryKeyName);
needsPadding = true;
}
for (String columnName : columns.keySet()) {
if (columns.get(columnName).isDisplayable()) {
out.printf(" " + columnWidths.get(columnName), columnName);
if (needsPadding) { out.printf(" "); }
out.printf(columnWidths.get(columnName), columnName);
needsPadding = true;
}
}
@ -480,12 +535,20 @@ public class GATKReportTable {
// Emit the table body
for (Object primaryKey : primaryKeyColumn) {
out.printf(primaryKeyFormat, primaryKey);
needsPadding = false;
if (primaryKeyDisplay) {
out.printf(primaryKeyFormat, primaryKey);
needsPadding = true;
}
for (String columnName : columns.keySet()) {
if (columns.get(columnName).isDisplayable()) {
Object obj = columns.get(columnName).getWithoutSideEffects(primaryKey);
out.printf(" " + columnWidths.get(columnName), obj.toString());
if (needsPadding) { out.printf(" "); }
out.printf(columnWidths.get(columnName), obj.toString());
needsPadding = true;
}
}