/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.server.report.util; import org.jcrom.JcrFile; import ro.nextreports.server.distribution.DistributionContext; import ro.nextreports.server.domain.Chart; import ro.nextreports.server.domain.DataSource; import ro.nextreports.server.domain.Entity; import ro.nextreports.server.domain.ParameterValue; import ro.nextreports.server.domain.Report; import ro.nextreports.server.domain.SchedulerBatchDefinition; import ro.nextreports.server.domain.SchedulerJob; import ro.nextreports.server.domain.Settings; import ro.nextreports.server.report.ReportConstants; import ro.nextreports.server.report.next.NextUtil; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.util.ConnectionUtil; import ro.nextreports.server.util.FileUtil; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.io.File; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.Serializable; import ro.nextreports.engine.queryexec.IdName; import ro.nextreports.engine.queryexec.Query; import ro.nextreports.engine.queryexec.QueryExecutor; import ro.nextreports.engine.queryexec.QueryParameter; import ro.nextreports.engine.queryexec.QueryResult; import ro.nextreports.engine.util.ParameterUtil; /** * User: mihai.panaitescu * Date: 08-Dec-2009 * Time: 12:00:57 */ public class ReportUtil { public static final String FILE_SEPARATOR = "/"; public static final String EXTENSION_SEPARATOR = "."; public static final String IMAGE_DELIM = "___"; public static void copyTemplate(String directoryName, JcrFile template) throws Exception { if (template != null) { List<JcrFile> files = new ArrayList<JcrFile>(); files.add(template); copyImages(directoryName, files); } } public static void copyImages(String directoryName, List<JcrFile> images) throws Exception { if ((images == null) || (images.size() == 0)) { return; } File folder = new File(directoryName); folder.mkdir(); for (JcrFile image : images) { String name = image.getName(); byte[] xml = image.getDataProvider().getBytes(); String fileName = directoryName + File.separator + name; File f = new File(fileName); if (f.exists()) { continue; } f.createNewFile(); ByteArrayInputStream bais = new ByteArrayInputStream(xml); FileOutputStream fos = new FileOutputStream(f); try { int n = 0; byte[] b = new byte[1024]; while ((n = bais.read(b)) >= 0) { fos.write(b, 0, n); } } finally { fos.close(); bais.close(); } } } public static List<String> getHtmlImages(File htmlFile) throws Exception { HtmlParser parser = new HtmlParser(new String(FileUtil.getBytes(htmlFile))); return parser.getImages(); } public static String getDebugParameters(Map<String, Object> parametersValues) { return getDebugParameters(parametersValues, null); } public static String getDebugParameters(Map<String, Object> parametersValues, Map<String, String> displayNames) { SimpleDateFormat timeFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); SimpleDateFormat dayFormat = new SimpleDateFormat("dd/MM/yyyy"); if (parametersValues == null) { return ""; } StringBuilder sb = new StringBuilder(); for (String key : parametersValues.keySet()) { Object value = parametersValues.get(key); String left = (displayNames == null) ? key : displayNames.get(key); sb.append(" ").append(left).append(" = "); if (value == null) { sb.append("null\r\n"); continue; } if (value instanceof Object[]) { Object[] values = (Object[]) value; sb.append("["); for (int i = 0, size = values.length; i < size; i++) { Object obj = values[i]; if (obj instanceof IdName) { sb.append(((IdName) obj).getId()); } else if (obj instanceof Date) { sb.append(dayFormat.format((Date)obj)); } else if (obj instanceof Timestamp) { Date date = new Date(((Timestamp)obj).getTime()); sb.append(timeFormat.format(date)); } else { sb.append(obj); } if (i < size - 1) { sb.append(";"); } } sb.append("]"); } else if (value instanceof IdName) { sb.append(((IdName) value).getId()); } else if (value instanceof Date) { sb.append(dayFormat.format((Date)value)); } else if (value instanceof Timestamp) { Date date = new Date(((Timestamp)value).getTime()); sb.append(timeFormat.format(date)); } else { sb.append(value); } sb.append("\r\n"); } return sb.toString(); } public static String getParameterValueAsString(ParameterValue pv) { return getParameterValueAsString(pv.getValue()); } public static String getParameterValueAsString(Object value) { StringBuilder buffer = new StringBuilder(); if (value instanceof Object[]) { buffer.append("["); for (Object obj : (Object[]) value) { if (obj instanceof IdName) { buffer.append(((IdName) obj).getId()); } else { buffer.append(obj); } buffer.append(";"); } if (buffer.toString().endsWith(";")) { buffer.deleteCharAt(buffer.length() - 1); } buffer.append("]"); } else if (value instanceof IdName) { buffer.append(((IdName) value).getId()); } else { buffer.append(value); } return buffer.toString(); } public static String getDisplayParameterValueAsString(Object value) { StringBuilder buffer = new StringBuilder(); if (value instanceof Object[]) { buffer.append("["); for (Object obj : (Object[]) value) { if (obj instanceof IdName) { buffer.append(((IdName) obj).getName()); } else { buffer.append(obj); } buffer.append(";"); } if (buffer.toString().endsWith(";")) { buffer.deleteCharAt(buffer.length() - 1); } buffer.append("]"); } else if (value instanceof IdName) { buffer.append(((IdName) value).getName()); } else { buffer.append(value); } return buffer.toString(); } public static void addUrlQueryParameters(Settings settings, Entity entity, Map<String, Object> allParameters, Map<String, Object> urlQueryParameters) throws Exception { if ((urlQueryParameters == null) || (urlQueryParameters.size() == 0)) { return; } ro.nextreports.engine.Report nextReport; if (entity instanceof Chart) { Chart chart = (Chart) entity; nextReport = NextUtil.getNextReport(settings, chart); } else { Report report = (Report) entity; nextReport = NextUtil.getNextReport(settings, report); } Map<String, QueryParameter> parameters = ParameterUtil.getUsedParametersMap(nextReport); for (String key : urlQueryParameters.keySet()) { Object value = urlQueryParameters.get(key); QueryParameter parameter = parameters.get(key); if (parameter == null) { // mispelled inside embeddd code continue; } String className = parameter.getValueClassName(); Object convertedValue; // on Server Locale can be en_US, fr_FR or ro_RO (from internationalization) // we must use a hardcoded one and this must be used when we pass Date parameters inside url SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy hh:mm", Locale.US); if (value instanceof String) { convertedValue = ParameterUtil.getParameterValueFromString(className, (String) value, sdf); } else { // multiple values String[] values = (String[]) value; Object[] convertedValues = new Object[values.length]; for (int i = 0, size = values.length; i < size; i++) { convertedValues[i] = ParameterUtil.getParameterValueFromString(className, values[i], sdf); } convertedValue = convertedValues; } allParameters.put(key, convertedValue); } } /** * Test if a report has two parameters with names start_date and end_date, of type date and with single selection * * @param settings settings * @param report report * @return true if a report has two parameters with names start_date and end_date, of type date and with single selection */ public static boolean hasIntervalParameters(Settings settings, Report report) { if (!ReportConstants.NEXT.equals(report.getType())) { return false; } ro.nextreports.engine.Report nextReport = NextUtil.getNextReport(settings, report); Map<String, QueryParameter> parameters = ParameterUtil.getUsedParametersMap(nextReport); boolean hasStart = false; boolean hasEnd = false; for (QueryParameter qp : parameters.values()) { if (QueryParameter.INTERVAL_START_DATE_NAME.equals(qp.getName())) { if (!ParameterUtil.isDateTime(qp)) { return false; } if (!qp.getSelection().equals(QueryParameter.SINGLE_SELECTION)) { return false; } hasStart = true; } else if (QueryParameter.INTERVAL_END_DATE_NAME.equals(qp.getName())) { if (!ParameterUtil.isDateTime(qp)) { return false; } if (!qp.getSelection().equals(QueryParameter.SINGLE_SELECTION)) { return false; } hasEnd = true; } } return (hasStart && hasEnd); } public static QueryParameter getBatchQueryParameter(SchedulerJob schedulerJob, Settings settings) { SchedulerBatchDefinition batchDef = schedulerJob.getBatchDefinition(); QueryParameter parameter = null; if ((batchDef != null) && (batchDef.getParameter() != null)) { ro.nextreports.engine.Report nextReport = NextUtil.getNextReport(settings, schedulerJob.getReport()); Map<String, QueryParameter> parameters = ParameterUtil.getUsedParametersMap(nextReport); for (String p : parameters.keySet()) { if (p.equals(batchDef.getParameter())) { parameter = parameters.get(p); break; } } } return parameter; } // select <batch_parameter>, mail from <table> public static Map<Serializable, String> getBatchMailMap(String batchDataQuery, StorageService storageservice, DataSource dataSource) throws Exception { Map<Serializable, String> result = new HashMap<Serializable, String>(); if (batchDataQuery == null) { return result; } Connection connection = null; QueryResult queryResult = null; try { connection = ConnectionUtil.createConnection(storageservice, dataSource); Query query = new Query(batchDataQuery); QueryExecutor executor = new QueryExecutor(query, connection); executor.setMaxRows(0); executor.setTimeout(storageservice.getSettings().getQueryTimeout()); queryResult = executor.execute(); ResultSet rs = queryResult.getResultSet(); while(rs.next()) { Serializable batchValue = (Serializable)rs.getObject(1); String mail = rs.getString(2); result.put(batchValue, mail); } } finally { ConnectionUtil.closeConnection(connection); } return result; } }