package org.cryptocoinpartners.report; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.apache.commons.lang.ArrayUtils; import org.cryptocoinpartners.schema.dao.ReportDao; import org.cryptocoinpartners.util.Visitor; import org.slf4j.Logger; /** * @author Tim Olson */ public abstract class JpaReport implements Report { @Inject protected ReportDao reportDao; public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } @Override public TableOutput runReport() { final Query query = getQuery(); final List<String[]> rowStrings = new ArrayList<>(); if (log.isTraceEnabled()) log.trace("Querying: " + query.queryStr + " / " + ArrayUtils.toString(query.params)); if (limit != 0) { Visitor<Object[]> visitor = new Visitor<Object[]>() { private int count = 0; @Override public boolean handleItem(Object[] row) { handleResult(row, rowStrings); return ++count < limit; } }; reportDao.queryEach(visitor, limit, query.queryStr, query.params); } else { Visitor<Object[]> visitor = new Visitor<Object[]>() { @Override public boolean handleItem(Object[] row) { handleResult(row, rowStrings); return true; } }; reportDao.queryEach(visitor, query.queryStr, query.params); } String[][] rowStringTable = new String[rowStrings.size()][]; rowStrings.toArray(rowStringTable); final String[] headers = query.headers; return new TableOutput(headers, rowStringTable); } protected void handleResult(Object[] row, List<String[]> rowStrings) { final String[] rowFormat = formatRow(row); rowStrings.add(rowFormat); } @SuppressWarnings("UnusedDeclaration") public static class Query { public Query(String[] headers, String queryStr, Object[] params) { this.headers = headers; this.queryStr = queryStr; this.params = params; } public Query(String[] headers, String queryStr) { this.headers = headers; this.queryStr = queryStr; this.params = new Object[] {}; } String[] headers; String queryStr; Object[] params; } protected abstract Query getQuery(); protected String[] formatRow(Object[] row) { final String[] result = new String[row.length]; for (int i = 0; i < row.length; i++) { Object item = row[i]; result[i] = formatColumn(i, item); } return result; } protected String formatColumn(@SuppressWarnings("UnusedParameters") int columnIndex, Object item) { return String.valueOf(item); } @Inject private Logger log; private int limit; }