/*
* Sistema de Ouvidoria: um canal através do qual os usuários
* podem encaminhar suas reclamações, elogios e sugestões.
*
* Copyright (C) 2011 SERPRO
*
* Este programa é software livre; você pode redistribuí-lo e/ou
* modificá-lo sob os termos da Licença Pública Geral GNU, conforme
* publicada pela Free Software Foundation; tanto a versão 2 da
* Licença como (a seu critério) qualquer versão mais nova.
*
* Este programa é distribuído na expectativa de ser útil, mas SEM
* QUALQUER GARANTIA; sem mesmo a garantia implícita de
* COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM
* PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais
* detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral GNU,
* sob o título "LICENCA.txt", junto com esse programa. Se não,
* acesse o Portal do Software Público Brasileiro no endereço
* http://www.softwarepublico.gov.br/ ou escreva para a Fundação do
* Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
* MA 02111-1301, USA.
*
* Contatos através do seguinte endereço internet:
* http://www.serpro.gov.br/sistemaouvidoria/
*/
package br.gov.serpro.ouvidoria.util.freechart.data;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import org.jfree.chart.labels.CategoryLabelGenerator;
import org.jfree.data.jdbc.JDBCCategoryDataset;
/**
* Classe utilizada para geração de gráficos com jFreechart
*
* @author SERPRO
* @version $Revision: 1.1.2.1 $, $Date: 2011/10/21 18:47:37 $
*
*/
public class JDBCFlatCategoryDataset extends JDBCCategoryDataset {
private static final long serialVersionUID = 1L;
public static final Double DOUBLE_ZERO = new Double(0.0D);
protected Connection connection;
private JDBCColumnHelper columnHelper;
private boolean appendMode;
private boolean useFilter;
private CategoryDatasetFilterListener filter;
private CategoryLabelGenerator labelGenerator;
private double maxVal;
private double grandTotal;
public JDBCFlatCategoryDataset(Connection connection) {
super(connection);
this.connection = connection;
init();
}
public JDBCFlatCategoryDataset(Connection connection, String query)
throws SQLException {
this(connection);
executeQuery(query, true);
}
private void init() {
columnHelper = JDBCColumnHelper.getInstance(this);
}
public final JDBCColumnHelper getColumnHelper() {
return columnHelper;
}
public final void setTranspose(boolean transpose) {
super.setTranspose(transpose);
columnHelper.setTranspose(transpose);
}
public final double getMaxVal() {
return maxVal;
}
public final double getGrandTotal() {
return grandTotal;
}
public final boolean isAppendMode() {
return appendMode;
}
public final void setAppendMode(boolean appendMode) {
this.appendMode = appendMode;
}
public final CategoryLabelGenerator getLabelGenerator() {
return labelGenerator;
}
public final void setLabelGenerator(CategoryLabelGenerator labelGenerator) {
this.labelGenerator = labelGenerator;
}
public final CategoryDatasetFilterListener getFilter() {
return filter;
}
public final void setFilter(CategoryDatasetFilterListener filter) {
this.filter = filter;
useFilter = filter != null;
}
public final boolean isUseFilter() {
return useFilter;
}
public final void setUseFilter(boolean useFilter) {
if (useFilter && filter == null) {
throw new IllegalArgumentException("No filter set.");
} else {
this.useFilter = useFilter;
return;
}
}
public void executeQuery(String query) throws SQLException {
executeQuery(query, false);
}
public void executeQuery(String query, boolean closeCon)
throws SQLException {
try {
super.executeQuery(query);
} finally {
if (closeCon)
close();
}
return;
}
public void executeQuery(Connection con, String query) throws SQLException {
Statement statement = null;
ResultSet resultSet = null;
try {
statement = con.createStatement();
resultSet = statement.executeQuery(query);
loadFrom(resultSet);
} finally {
JDBCColumnHelper.closeQuietly(resultSet);
JDBCColumnHelper.closeQuietly(statement);
}
return;
}
public void loadFrom(ResultSet resultSet) throws SQLException {
Comparable rowKey = null;
Comparable columnKey = null;
int indexes[] = new int[3];
Comparable keys[] = new Comparable[2];
ResultSetMetaData metaData = resultSet.getMetaData();
try {
columnHelper.computeIndexes(metaData.getColumnCount(), indexes,
keys);
} catch (IllegalArgumentException iae) {
throw new SQLException(iae.getMessage());
}
int rowIndex = indexes[0];
int columnIndex = indexes[1];
int valueIndex = indexes[2];
rowKey = keys[0];
columnKey = keys[1];
if (!appendMode) {
for (int i = getRowCount() - 1; i > 0; i--)
removeRow(i);
maxVal = 4.9406564584124654E-324D;
grandTotal = 0.0D;
}
int columnType = metaData.getColumnType(valueIndex);
Number value;
while (resultSet.next())
if ((value = JDBCColumnHelper.asNumber(
resultSet.getObject(valueIndex), columnType)) != null) {
if (rowIndex > 0)
rowKey = resultSet.getString(rowIndex);
if (columnIndex > 0)
columnKey = resultSet.getString(columnIndex);
if (useFilter)
value = filter.filterValue(value, rowKey, columnKey,
resultSet);
double doubleVal = value.doubleValue();
if (doubleVal > maxVal)
maxVal = doubleVal;
grandTotal += doubleVal;
setValue(value, rowKey, columnKey);
}
fireDatasetChanged();
}
public final void normalizeOnPercent() {
normalize(100D);
}
public final void normalizeOnGrandTotalPercent() {
normalize((100D * maxVal) / grandTotal);
}
public final void normalize(double topVal) {
double factor = topVal / maxVal;
for (int column = getColumnCount() - 1; column >= 0; column--) {
Comparable columnKey = getColumnKey(column);
for (int row = getRowCount() - 1; row >= 0; row--) {
Number value = getValue(row, column);
if (value != null)
setValue(value.doubleValue() * factor, getRowKey(row),
columnKey);
}
}
}
public void fillGaps() {
int rowCount = getRowCount();
int colCount = getColumnCount();
for (int rowIndex = rowCount - 1; rowIndex >= 0; rowIndex--) {
Comparable rowKey = getRowKey(rowIndex);
for (int colIndex = colCount - 1; colIndex >= 0; colIndex--) {
Comparable colKey = getColumnKey(colIndex);
if (getValue(rowKey, colKey) == null)
setValue(DOUBLE_ZERO, rowKey, colKey);
}
}
}
public void close() {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}