/** * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L. * Copyright (C) 2007 Autentia Real Bussiness Solution S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.tnt.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.export.JRPdfExporter; import com.autentia.tnt.bean.reports.ReportParameterDefinition; import com.autentia.tnt.businessobject.ProjectRole; import com.autentia.tnt.businessobject.Role; import com.autentia.tnt.dao.SortCriteria; import com.autentia.tnt.dao.hibernate.RoleDAO; import com.autentia.tnt.xml.ParameterReport; import com.sun.org.apache.commons.collections.IteratorUtils; public final class ReportUtil { private static final Log log = LogFactory.getLog(ReportUtil.class); public static final String URL_PREFIX = "/report/"; public static final String REPORT_PREFIX = "com/autentia/tnt/report/"; public static final String SUBREPORT_PREFIX = "subreports/"; public static final String REPORT_SUFFIX = ".jasper"; public static final String REPORT_DEFINITION_SUFFIX = ".jrxml"; public static final String GLOBAL_HOURS_REPORT_NAME = "Informe.de.parte.de.horas.global"; public static final String GLOBAL_HOUR_REPORT_HEADER_FILE = "GlobalHoursReportHead.xml"; public static final String GLOBAL_HOUR_REPORT_FOOTER_FILE = "GlobalHoursReportFoot.xml"; public static final String GLOBAL_HOUR_REPORT_INTER_FILE = "GlobalHoursReportMed.xml"; public static final String PARTIAL_REPORT_PREFIX = "partialReports/"; /** * Generates a report as an output stream from the name of the file * * @param reportName * file with the report * @return an outputStream with the content of the report * @throws RuntimeException * if the report cannot be created */ public static InputStream getReportWithoutDatabaseConnectionAsInputStream( String reportName, Map<String, Object> parameters) { final ByteArrayOutputStream os = new ByteArrayOutputStream(); try { final InputStream is = getReportDefinitionUrl(reportName).openStream(); final JasperReport report = JasperCompileManager.compileReport(is); final JasperPrint print = JasperFillManager.fillReport(report, parameters, new JREmptyDataSource()); final JRPdfExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os); exporter.exportReport(); } catch (JRException e) { log.warn("The report '" + reportName + "' cannot be created", e); return null; } catch (IOException ioe) { log.warn("The report '" + reportName + "' cannot be recovered", ioe); return null; } return new ByteArrayInputStream(os.toByteArray()); } public static StringBuffer createRunParameters(List<ReportParameterDefinition> reportParametersDefinitions, StringBuffer parameters, StringBuffer selectMany) { parameters.append("?"); if (reportParametersDefinitions != null){ for (ReportParameterDefinition definition : reportParametersDefinitions) { if (definition.getType().equals("text")) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } else if (definition.getType().equals("year")) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } else if (definition.getType().equals("date")) { parameters.append(definition.getId() + "=" + definition.formatDate() + "&"); } else if (definition.getType().equals("timestamp")) { if ("Fecha fin".equalsIgnoreCase(definition.getId())) { definition.setDateValue(DateUtils.maxHourInDate(definition.getDateValue())); } else { definition.setDateValue(DateUtils.minHourInDate(definition.getDateValue())); } parameters.append(definition.getId() + "=" + definition.formatTimestamp() + "&"); } else if (definition.getType().equals("selectOne")) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } else if (definition.getType().equals("hidden")) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } else if (definition.getType().equals("selectMany") || definition.getType().equals("selectOne-selectMany")) { if(definition.getIsRol()) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } else { selectMany.append(definition.getId() + "=" + definition.getValueMany() + "&"); } } else if (definition.getType().equals("checkbox")) { parameters.append(definition.getId() + "=" + definition.getValue() + "&"); } } } return replaceSpecialCharactersWithUrlEncode (parameters); } private static StringBuffer replaceSpecialCharactersWithUrlEncode (StringBuffer a) { return new StringBuffer(a.toString().replaceAll("\"", "%22")); } public static void createReportParameterDefinition(List<ParameterReport> parameters, ArrayList<ReportParameterDefinition> reportParametersDefinitions, Map<String, List<SelectItem>> dataPanel) { String name; String desc; String def; ReportParameterDefinition pdef; boolean showRol = false; if (parameters != null) { for (ParameterReport parameter : parameters){ name = parameter.getName(); desc = parameter.getDescription(); def = parameter.getDefaultValue(); if (desc != null){ desc = desc.toUpperCase(); if (desc.equals("DATE")) { pdef = new ReportParameterDefinition(name, "date", name, new Date()); } else if (desc.equals("YEAR")) { pdef = new ReportParameterDefinition(name, "year", name, dataPanel.get("years")); } else if (desc.equals("USER")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("users")); } else if (desc.equals("ROL")) { showRol = true; pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("roles")); } else if (desc.equals("MODEL")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("models")); } else if (desc.equals("TRADEMARK")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("trademarks")); } else if (desc.equals("PROVIDER")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("providers")); } else if (desc.equals("TYPE")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("types")); } else if (desc.equals("ORGANIZATION")) { pdef = new ReportParameterDefinition(name, "selectMany", name, dataPanel.get("orgs")); } else if (desc.equals("PROJECTS")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("projects")); } else if (desc.equals("PROJECT")) { pdef = new ReportParameterDefinition(name, "selectOne-selectMany", name, dataPanel.get("orgs"), dataPanel.get("projects")); } else if (desc.equals("PROJECT_OUR_COMPANY")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("projects")); } else if (desc.equals("SUBREPORT")) { pdef = new ReportParameterDefinition(name, "hidden", name, def.replace('"', ' ').trim()); } else if (desc.equals("DESCRIPTION")) { pdef = new ReportParameterDefinition(name, "info", name, def.replace('"', ' ')); } else if (desc.equals("TIMESTAMP")) { pdef = new ReportParameterDefinition(name, "timestamp", name, new Date()); } else if (desc.equals("ACCOUNT")) { pdef = new ReportParameterDefinition(name, "selectOne", name, dataPanel.get("accounts")); } else if (desc.equals("BILLABLE")) { pdef = new ReportParameterDefinition(name, "checkbox", name, new Boolean(false)); } else { continue; } reportParametersDefinitions.add(pdef); } } } if(showRol) { for (ReportParameterDefinition rp : reportParametersDefinitions ) { if(rp.getId().equalsIgnoreCase("Proyecto")) { rp.setIsRol(true); } } } } public static ArrayList<SelectItem> getRoles(ArrayList<SelectItem> projs){ final RoleDAO roleDAO = new RoleDAO(); ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); List<Role> roles = roleDAO.search(new SortCriteria("name")); for (Role role : roles) { ret.add(new SelectItem(role.getId().toString(), role.getName())); } return ret; } /** * Obtiene un report de la aplicaciĆ³n. segun el parametro canBeOverrided el * report se toamra del classpath, o bien se puede sobreescribir de la ruta * externa de usuario * * @param reportName * nombre del report, sin extension (document/ficha.de.pedido); * (billing/Informe.de.facturas.recibidas) * @param canBeOverrided * si se puede sobreescribir el informe o bien se toma siempre * del classpath * @return */ public static URL getReportStream(String reportName, String postfix, boolean canBeOverrided) { URL reportUrl = null; if (canBeOverrided) { String overridePath = ConfigurationUtil.getDefault().getReportPath() + "/override/" + reportName; try { final File file = new File(overridePath + postfix); if (file.exists()) { reportUrl = file.toURI().toURL(); } } catch (MalformedURLException e) { log.info("report: " + reportName + " is not override. i'll try to find in classpath"); } } // aun no hemos encontrado el report if (reportUrl == null) { reportUrl = Thread.currentThread().getContextClassLoader().getResource(REPORT_PREFIX + reportName + postfix); } return reportUrl; } /** * Obtiene un report de la aplicaciĆ³n, si esta sobreescrito, o bien el de * por defecto del classpth.<br/> * <br/> * NO PONER EL .jrxml DEL FINAL DEL FICHERO!!! * * @param reportName * nombre del report, sin extension (document/ficha.de.pedido); * (billing/Informe.de.facturas.recibidas) * @return */ public static URL getReportDefinitionUrl(String reportName) { return getReportStream(reportName, ReportUtil.REPORT_DEFINITION_SUFFIX, true); } public static URL getReportCompiledUrl(String reportName) { return getReportStream(reportName, ReportUtil.REPORT_SUFFIX, true); } public static List<SelectItem> removeDuplicates (List<SelectItem> list) { List<SelectItem> aux = new ArrayList<SelectItem>(); for (SelectItem si : list) { if (!contains(aux,si)) { aux.add(si); } } return aux; } private static boolean itemEqualIfLabelEqual (SelectItem si1, SelectItem si2) { return si1.getLabel().equals(si2.getLabel()); } private static boolean contains (List<SelectItem> list, SelectItem si) { boolean flag = false; for (SelectItem iterator : list) { if (itemEqualIfLabelEqual(iterator, si)) { flag = true; break; } } return flag; } }