some refactoring for the variant eval output system
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3576 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
db1383d0b2
commit
3d049204ed
|
|
@ -0,0 +1,180 @@
|
|||
package org.broadinstitute.sting.playground.utils.report.templates;
|
||||
|
||||
import org.broadinstitute.sting.utils.StingException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* this class handles generating text table output
|
||||
*/
|
||||
class TextTable {
|
||||
// make a table of the number of rows
|
||||
ArrayList<ArrayList<String>> rows = new ArrayList<ArrayList<String>>();
|
||||
|
||||
// keep a complementary array of the sizes of each column
|
||||
ArrayList<Integer> minimumSizes = new ArrayList<Integer>();
|
||||
List<String> header = new ArrayList<String>();
|
||||
|
||||
// our default width
|
||||
private static final int defaultMinimumSize = 15;
|
||||
|
||||
// our seperator
|
||||
private String seperator = "";
|
||||
|
||||
// our default cell entry
|
||||
private static final String defaultCell = "";
|
||||
|
||||
private String name;
|
||||
private String description;
|
||||
|
||||
|
||||
/**
|
||||
* create a text table, with the:
|
||||
* @param name name of the table
|
||||
* @param description what the table represents
|
||||
* @param header the header fields
|
||||
*/
|
||||
TextTable(String name, String description, List<String> header) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
for (int index = 0; index < header.size(); index++)
|
||||
determineMinimumColumnWidth(header.get(index).length(),index);
|
||||
this.header.addAll(header);
|
||||
}
|
||||
|
||||
/**
|
||||
* create a text table
|
||||
*/
|
||||
TextTable() {
|
||||
}
|
||||
|
||||
/**
|
||||
* set a cell of the table
|
||||
* @param row, zero based
|
||||
* @param column zero based
|
||||
* @param entry cell to set
|
||||
*/
|
||||
public void setCell(int row, int column, String entry) {
|
||||
if (rows.size() <= row)
|
||||
createRow(row,column);
|
||||
ArrayList<String> rowData = rows.get(row);
|
||||
if (rowData.size() <= column)
|
||||
for (int x = rowData.size(); x <= column; x++)
|
||||
rowData.add("");
|
||||
rows.get(row).set(column,entry);
|
||||
determineMinimumColumnWidth(entry.length(),column);
|
||||
}
|
||||
|
||||
private void createRow(int row, int column) {
|
||||
for (int x = rows.size(); x <= row; x++) {
|
||||
ArrayList<String> blank = new ArrayList<String>();
|
||||
for (int col = 0; col <= column; col++)
|
||||
blank.add(defaultCell);
|
||||
rows.add(blank);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* write the table to the writer
|
||||
* @param writer the writer
|
||||
*/
|
||||
public void toPrintWriter(Writer writer) {
|
||||
int index = 0;
|
||||
for (String col : header)
|
||||
writeToDisk(writer, col, index++, (index == header.size() -1));
|
||||
appendEndLine(writer,"\n");
|
||||
index = 0;
|
||||
for (String col : header)
|
||||
writeToDisk(writer, col, index++, (index == header.size() -1));
|
||||
appendEndLine(writer,"\n");
|
||||
for (ArrayList<String> row : rows) {
|
||||
if (row.size() > header.size())
|
||||
throw new IllegalStateException("More row-cells in table " + name + " then header columns");
|
||||
for (int y = 0; y < header.size(); y++)
|
||||
if (row.size() >= y)
|
||||
writeToDisk(writer, "", y, (y == header.size() - 1));
|
||||
else
|
||||
writeToDisk(writer, row.get(y), y, (y == header.size() - 1));
|
||||
}
|
||||
try {
|
||||
writer.append("\n");
|
||||
} catch (IOException e) {
|
||||
throw new StingException("Unable to write to the Writer");
|
||||
}
|
||||
}
|
||||
|
||||
private void appendEndLine(Writer writer, String str) {
|
||||
try {
|
||||
writer.append(str);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* write to disk a single string
|
||||
* @param writer the writer to use
|
||||
* @param str the string to write
|
||||
* @param y an index of the string, for column width look-up
|
||||
* @param lastVal are we the last value
|
||||
*/
|
||||
void writeToDisk(Writer writer, String str, int y, boolean lastVal) {
|
||||
try {
|
||||
writer.append(String.format("%1$-" + (getMinimumSizes(y) + 3) + "s", str));
|
||||
if (y != rows.size() - 1)
|
||||
writer.append(seperator);
|
||||
} catch (IOException e) {
|
||||
throw new StingException("Unable to write to the Writer");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get the minimum size for a column
|
||||
* @param column the column index
|
||||
* @return the width
|
||||
*/
|
||||
public int getMinimumSizes(int column) {
|
||||
if (column >= minimumSizes.size())
|
||||
return defaultMinimumSize;
|
||||
return minimumSizes.get(column);
|
||||
}
|
||||
/**
|
||||
* determine the minimum column width
|
||||
* @param size the size of this string
|
||||
* @param position the position (column)
|
||||
*/
|
||||
void determineMinimumColumnWidth(int size, int position) {
|
||||
if (minimumSizes.size() <= position)
|
||||
for (int x = minimumSizes.size(); x <= position; x++)
|
||||
minimumSizes.add(x,0);
|
||||
minimumSizes.set(position,(minimumSizes.get(position) > size) ? minimumSizes.get(position) : size);
|
||||
}
|
||||
|
||||
public List<String> getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
public void setHeader(List<String> header) {
|
||||
this.header = header;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package org.broadinstitute.sting.playground.utils.report.templates;
|
||||
|
||||
import org.broadinstitute.sting.playground.utils.report.templates.TextTable;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* test out the text table
|
||||
*/
|
||||
public class TextTableUnitTest {
|
||||
@Test
|
||||
public void testBasicSetCell() {
|
||||
TextTable table = new TextTable("name","description",new ArrayList<String>());
|
||||
table.setCell(1,5,"entry");
|
||||
int entriesSeen = 0;
|
||||
ArrayList<ArrayList<String>> rows = table.rows;
|
||||
for (int x = 0; x <= 1; x++)
|
||||
for (int y = 0; y <= 5; y++)
|
||||
if (x == 1 && y == 5) {
|
||||
Assert.assertTrue(rows.get(x).get(y).equals("entry"));
|
||||
entriesSeen++;
|
||||
} else
|
||||
Assert.assertTrue(rows.get(x).get(y).equals(""));
|
||||
Assert.assertEquals("Incorrect number of entries seen",1,entriesSeen);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBasicSetTwoCells() {
|
||||
TextTable table = new TextTable("name","description",new ArrayList<String>());
|
||||
table.setCell(1,5,"entry");
|
||||
table.setCell(1,1,"entry");
|
||||
int entriesSeen = 0;
|
||||
ArrayList<ArrayList<String>> rows = table.rows;
|
||||
for (int x = 0; x <= 1; x++)
|
||||
for (int y = 0; y <= 5; y++)
|
||||
if ((x == 1 && y == 5) || (x == 1 && y == 1)) {
|
||||
Assert.assertTrue(rows.get(x).get(y).equals("entry"));
|
||||
entriesSeen++;
|
||||
}
|
||||
else
|
||||
Assert.assertTrue(rows.get(x).get(y).equals(""));
|
||||
Assert.assertEquals("Incorrect number of entries seen",2,entriesSeen);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue