/*
* 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;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import br.gov.serpro.ouvidoria.util.collection.ListArrayTable;
import br.gov.serpro.ouvidoria.util.date.DateKit;
import br.gov.serpro.ouvidoria.util.freechart.data.DBUtilsKit;
import br.gov.serpro.ouvidoria.util.freechart.data.EnhancedJDBCPieDataset;
import br.gov.serpro.ouvidoria.util.freechart.data.JDBCFlatCategoryDataset;
import br.gov.serpro.ouvidoria.util.freechart.data.QueryKit;
import br.gov.serpro.ouvidoria.util.freechart.data.StringKit;
/**
*
* @author SERPRO
* @version $Revision: 1.1.2.6 $, $Date: 2011/11/07 12:42:44 $
* @version 0.1, Date: 2005/01/28
*/
public final class ReportKit {
static final Log log = LogFactory.getLog(ReportKit.class);
static final String CHART_COLORS = "chart.colors";
static final String TABLE_LIST = "ii.table.names";
static final String II_COMBO_QUERY = "ii.combo_query.";
static final String SEL_TABELA = "sel_tabela";
static final String II_FROM_TABLES = "ii.from_tables.";
static final String II_WHERE_TABLES = "ii.where_tables.";
static final String II_COD_INSTIT_TABLES = "ii.cod_instit_tables";
private static Configuration config;
private ReportKit() {
// DO NOTHING
}
static Configuration getConfig() {
if (config != null) {
log.info("----------- > CONFIG no reportKit:" + config);
return config;
}
try {
log.info("------------>>CONFIG no reportKit, dentro do try:"
+ config);
config = getSingleConfiguration("report-config.properties");
log.info("Config : " + config);
DBUtilsKit.init(config);
} catch (ConfigurationException e) {
e.printStackTrace();
}
return config;
}
private static Configuration getSingleConfiguration(String configStr)
throws ConfigurationException {
//URL configURL = ReportHelperInt.class.getResource(configStr);
String configPath = "/" + configStr;
URL configURL = Thread.currentThread().getContextClassLoader().getResource(configPath);
log.info("configURL: " + configURL);
if (configURL == null) {
throw new ConfigurationException(
"Não foi possível achar o recurso '" + configStr + "'.");
}
PropertiesConfiguration config = new PropertiesConfiguration(configURL);
log.debug("Config loaded: " + config);
return config;
}
public static String[] getColorList() {
return getConfig().getStringArray(ReportKit.CHART_COLORS);
}
static String getDateCrit(String txt_periodo_i, String txt_periodo_f) {
boolean isNullI = txt_periodo_i == null || txt_periodo_i.length() < 1;
boolean isNullF = txt_periodo_f == null || txt_periodo_f.length() < 1;
if (isNullI && isNullF)
return "";
if (!(isNullI || isNullF))
return " AND a.DAT_ACNMNT BETWEEN '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_i, "/", "-")
+ "' AND '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_f, "/", "-")
+ " 23:59:59'";
if (isNullI)
return " AND a.DAT_ACNMNT <= '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_f, "/", "-")
+ " 23:59:59'";
return " AND a.DAT_ACNMNT >= '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_i, "/", "-")
+ "'";
}
static String getDateCritUnion(String txt_periodo_i, String txt_periodo_f) {
boolean isNullI = txt_periodo_i == null || txt_periodo_i.length() < 1;
boolean isNullF = txt_periodo_f == null || txt_periodo_f.length() < 1;
if (isNullI && isNullF)
return "";
if (!(isNullI || isNullF))
return " atend.DAT_ATEND BETWEEN '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_i, "/", "-")
+ "' AND '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_f, "/", "-")
+ " 23:59:59'";
if (isNullI)
return " atend.DAT_ATEND <= '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_f, "/", "-")
+ " 23:59:59'";
return " atend.DAT_ATEND >= '"
+ DateKit.convertPtBr2ISO8601Date(txt_periodo_i, "/", "-")
+ "'";
}
static String getLocationCrit(String locais_ocorrencia) {
return getLocationCrit(locais_ocorrencia == null ? null
: locais_ocorrencia.split(","));
}
/**
* @return
*/
static String getLocationCrit(String[] locais_ocorrencia) {
return locais_ocorrencia == null || locais_ocorrencia.length < 1 ? ""
: " AND a.COD_LOCAL_OCORR IN ("
+ StringKit.join(locais_ocorrencia, ",") + ")";
}
public static String getLocationCaption(String id) throws SQLException {
String query = "select DSC_LOCAL_OCORR from localidadeocorrencia where COD_LOCAL_OCORR = "
+ id;
return DBUtilsKit.selectAsArray(query)[0].toString();
}
public static ListArrayTable getLocationNames(String ids)
throws SQLException {
String query = "select COD_LOCAL_OCORR, DSC_LOCAL_OCORR from localidadeocorrencia where COD_LOCAL_OCORR in ("
+ ids + ") order by COD_LOCAL_OCORR";
Comparator comparator = new Comparator() {
public final int compare(Object pO1, Object pO2) {
Object o1 = ((Object[]) pO1)[0];
Object o2 = ((Object[]) pO2)[0];
if (o1 instanceof String)
o1 = new Integer(o1.toString());
if (o2 instanceof String)
o2 = new Integer(o2.toString());
return ((Comparable) o1).compareTo(o2);
}
};
return DBUtilsKit.selectAsListArrayTable(query, comparator);
}
public static String getLocationCaptions(String ids) throws SQLException {
String query = "select i.DSC_INSTIT, l.DSC_LOCAL_OCORR from localidadeocorrencia l join instituicao i on i.cod_instit = l.cod_instit where l.COD_LOCAL_OCORR in ("
+ ids + ") order by i.DSC_INSTIT, l.DSC_LOCAL_OCORR";
StringBuffer sb = new StringBuffer(1024);
List list = DBUtilsKit.selectAsListArray(query);
Object[] el;
String lastInst = null;
for (Iterator iter = list.iterator(); iter.hasNext();) {
el = (Object[]) iter.next();
if (!el[0].equals(lastInst)) {
sb.append("<br/>").append(lastInst = (String) el[0])
.append(": ");
}
sb.append(el[1]).append(", ");
}
sb.setLength(sb.length() - 2);
return sb.toString();
}
/**
* @param chart_type
* @param transpose
* @param query
* @param normalizeOnGrandTotalPercent
* @return
* @throws SQLException
*/
static Object getDataSet(String chart_type, boolean transpose,
String query, boolean normalizeOnGrandTotalPercent)
throws SQLException {
Connection con = DBUtilsKit.getDataSource().getConnection();
try {
if (chart_type.indexOf("pie") >= 0) {
EnhancedJDBCPieDataset epds = new EnhancedJDBCPieDataset(con);
if (query != null)
epds.executeQuery(query);
return epds;
}
JDBCFlatCategoryDataset flatCategoryDataset = new JDBCFlatCategoryDataset(
con);
flatCategoryDataset.getColumnHelper().setDefaultRowKey("Total");
flatCategoryDataset.getColumnHelper().setDefaultColumnKey("Total");
flatCategoryDataset.setTranspose(transpose);
if (query != null) {
flatCategoryDataset.executeQuery(query, true);
if (normalizeOnGrandTotalPercent) {
flatCategoryDataset.normalizeOnGrandTotalPercent();
}
flatCategoryDataset.fillGaps();
}
return flatCategoryDataset;
} finally {
if (con != null && query != null)
try {
con.close();
} catch (Exception e) {
// DO NOTHING
}
}
}
static int getCountFromList(List list) {
return getCountFromList(list, "count");
}
static int getCountFromList(List list, String column) {
int result = 0;
for (Iterator iter = list.iterator(); iter.hasNext();) {
Map element = (Map) iter.next();
if (element == null)
continue;
Number n = (Number) element.get(column);
if (n == null)
continue;
result += n.intValue();
}
return result;
}
public static boolean getExistsFromQuery(String query) throws SQLException {
if (query == null)
return false;
String existsQuery = QueryKit.asExistsQuery(query);
try {
return "1".equals(DBUtilsKit.selectAsArray(existsQuery)[0]
.toString());
} catch (NumberFormatException e) {
SQLException sqle = new SQLException();
sqle.initCause(e);
throw sqle;
}
}
/**
* @param list
* @param sb
*/
static void toJSArray(Iterator iter, StringBuffer sb) {
// [ [1, 'Avaliação boa'], [2, 'Avaliação ruim'] ]
String idKey = "id";
String descKey = "descricao";
sb.append("[ ");
ReportKit.mapList2String(iter, idKey, descKey, sb);
sb.append(" ]");
}
/**
* @param iter
* @param idKey
* @param descKey
* @param sb
*/
static void mapList2String(Iterator iter, String idKey, String descKey,
StringBuffer sb) {
while (iter.hasNext()) {
Map el = (Map) iter.next();
if (!el.get(idKey).equals("")) {
Object elID = el.get(idKey);
sb.append("[");
if (elID instanceof String)
sb.append("'").append(elID).append("'");
else
sb.append(elID);
sb.append(",'").append(el.get(descKey)).append("'],");
}
}
sb.setLength(sb.length() - 1);
}
}