/* * 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.util; import java.io.Serializable; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.apache.wicket.model.StringResourceModel; import ro.nextreports.server.domain.DataSource; import ro.nextreports.server.domain.NextContent; import ro.nextreports.server.domain.Report; import ro.nextreports.server.domain.ReportRuntime; import ro.nextreports.server.domain.ReportRuntimeParameterModel; import ro.nextreports.server.domain.SchedulerJob; import ro.nextreports.server.domain.SchedulerTime; import ro.nextreports.server.report.AbstractReportRuntimeParameterModel; import ro.nextreports.server.report.ExternalParameter; import ro.nextreports.server.report.ReportConstants; import ro.nextreports.server.report.jasper.JasperParameter; import ro.nextreports.server.report.jasper.JasperParameterSource; import ro.nextreports.server.report.jasper.JasperReportsUtil; import ro.nextreports.server.report.jasper.JasperRuntimeParameterModel; import ro.nextreports.server.report.next.NextRuntimeParameterModel; import ro.nextreports.server.report.next.NextUtil; import ro.nextreports.server.schedule.ScheduleConstants; import ro.nextreports.server.service.DataSourceService; import ro.nextreports.server.service.ReportService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.web.report.ReportRuntimeModel; import ro.nextreports.engine.queryexec.IdName; import ro.nextreports.engine.queryexec.QueryParameter; import ro.nextreports.engine.util.ParameterUtil; /** * @author Decebal Suiu */ public class SchedulerUtil { // public static final DateFormat DAY_HM_FORMAT= new SimpleDateFormat("dd/MM/yy HH:mm"); public static final DateFormat DAY_HM_FORMAT= DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); // public static final DateFormat DAY_FORMAT= new SimpleDateFormat("dd/MM/yy"); public static final DateFormat DAY_FORMAT= DateFormat.getDateInstance(DateFormat.SHORT); public static String getTooltip(SchedulerTime st) { String s = new StringResourceModel("JobPanel.type." + st.getType(), null).getString(); if (ScheduleConstants.ONCE_TYPE.equals(st.getType())) { return s + " " + new StringResourceModel("JobPanel.description.at", null).getString() + " " + SchedulerUtil.DAY_HM_FORMAT.format(st.getRunDate()); } if (st.getAdvanced()){ return s + " (" + new StringResourceModel("JobPanel.description.advanced", null).getString() + ")"; } String between = " " + new StringResourceModel("JobPanel.description.between", null).getString() + " " + SchedulerUtil.DAY_FORMAT.format(st.getStartActivationDate()) + " " + new StringResourceModel("JobPanel.description.and", null).getString() + " " + SchedulerUtil.DAY_FORMAT.format(st.getEndActivationDate()); if (ScheduleConstants.MINUTELY_TYPE.equals(st.getType())) { return s + between; } else if (ScheduleConstants.HOURLY_TYPE.equals(st.getType())) { return s + between + " " + new StringResourceModel("JobPanel.description.atMinute", null).getString() + " " + st.getMinute(); } else if (ScheduleConstants.DAILY_TYPE.equals(st.getType())) { return s + between + " " + new StringResourceModel("JobPanel.description.at", null).getString() + " " + st.getHours() + ":" + st.getMinute(); } else if (ScheduleConstants.WEEKLY_TYPE.equals(st.getType())) { return s + between + " " + new StringResourceModel("JobPanel.description.in", null).getString() + " " + st.getDaysOfWeek(); } else if (ScheduleConstants.MONTHLY_TYPE.equals(st.getType())) { return s + between + " " + new StringResourceModel("JobPanel.description.inDay", null).getString() + " " + st.getDays() + " " + new StringResourceModel("JobPanel.description.at", null).getString() + " " + st.getHours() + ":" + st.getMinute(); } else { return s; } } public static void updateSchedulerTime(SchedulerTime schedulerTime) { String type = schedulerTime.getType(); if (ScheduleConstants.ONCE_TYPE.equals(type)) { } else if (ScheduleConstants.MINUTELY_TYPE.equals(type) || ScheduleConstants.HOURLY_TYPE.equals(type)) { if (schedulerTime.getDays() == null) { schedulerTime.setDays("*"); } if (schedulerTime.getHours() == null) { schedulerTime.setHours("*"); } if (schedulerTime.getMonths() == null) { schedulerTime.setMonths("*"); } } else if (ScheduleConstants.DAILY_TYPE.equals(type)) { if (schedulerTime.getDays() == null) { schedulerTime.setDays("*"); } if (schedulerTime.getHours() == null) { schedulerTime.setHours("*"); } schedulerTime.setDaysOfWeek("*"); } else if (ScheduleConstants.WEEKLY_TYPE.equals(type)) { if (schedulerTime.getDaysOfWeek() == null) { schedulerTime.setDaysOfWeek("*"); } if (schedulerTime.getHours() == null) { schedulerTime.setHours("*"); } schedulerTime.setDays("*"); } else if (ScheduleConstants.MONTHLY_TYPE.equals(type)) { if (schedulerTime.getHours() == null) { schedulerTime.setHours("*"); } if (schedulerTime.getMonths() == null) { schedulerTime.setMonths("*"); } int monthlytype = schedulerTime.getMonthlyType(); if (ScheduleConstants.MONTHLY_GENERAL_TYPE == monthlytype) { if (schedulerTime.getDays() == null) { schedulerTime.setDays("*"); } } else { schedulerTime.setDays("?"); } if (ScheduleConstants.MONTHLY_LAST_DAY_TYPE == monthlytype) { schedulerTime.setDaysOfWeek("?"); } else if (ScheduleConstants.MONTHLY_GENERAL_TYPE == monthlytype) { if (schedulerTime.getDaysOfWeek() == null) { schedulerTime.setDaysOfWeek("*"); } } } } public static void restoreSchedulerTime(SchedulerTime schedulerTime) { if ("*".equals(schedulerTime.getHours())) { schedulerTime.setHours(null); } if ("*".equals(schedulerTime.getMonths())) { schedulerTime.setMonths(null); } if ("*".equals(schedulerTime.getDays()) || "?".equals(schedulerTime.getDays())) { schedulerTime.setDays(null); } if ("*".equals(schedulerTime.getDaysOfWeek()) || "?".equals(schedulerTime.getDaysOfWeek())) { schedulerTime.setDaysOfWeek(null); } } public static ReportRuntimeModel getStoredRuntimeModel(StorageService storageService, SchedulerJob schedulerJob, ReportService reportService, DataSourceService dataSourceService) { return getStoredRuntimeModel(storageService, schedulerJob.getReport(), schedulerJob.getReportRuntime(), reportService, dataSourceService); } public static ReportRuntimeModel getStoredRuntimeModel(StorageService storageService, Report report, ReportRuntime reportRuntime, ReportService reportService, DataSourceService dataSourceService) { ReportRuntimeModel runtimeModel = new ReportRuntimeModel(); runtimeModel.setExportLayout(reportRuntime.getLayoutType()); runtimeModel.setExportType(reportRuntime.getOutputType()); runtimeModel.setEdit(true); runtimeModel.setParameters(new HashMap<String, ReportRuntimeParameterModel>()); Map<String, Object> parameterValues = reportRuntime.getParametersValues(); // for (String key : parameterValues.keySet()) { // System.out.println(" param= " + key); // System.out.print(" val=" ); // Object val = parameterValues.get(key); // if (val instanceof Object[]) { // Object[] array = (Object[])val; // for (Object obj : array) { // System.out.println(" --> " + obj + " class="+obj.getClass()); // } // } else { // System.out.println(val + " class="+val.getClass()); // } // } // System.out.println("parameterValues = " + parameterValues); Map<String, QueryParameter> paramMap; if (ReportConstants.NEXT.equals(report.getType())) { paramMap = ParameterUtil.getUsedParametersMap(NextUtil.getNextReport(storageService.getSettings(), (NextContent) report.getContent())); for (String key : paramMap.keySet()) { QueryParameter qp = paramMap.get(key); boolean isDynamic = reportRuntime.isDynamic(key); ReportRuntimeParameterModel parameterModel = createRuntimeModel(report, parameterValues, qp, dataSourceService, isDynamic); runtimeModel.getParameters().put(key, parameterModel); } } else { Map<String, Serializable> map = null; try { map = reportService.getReportUserParameters(report, new ArrayList<ExternalParameter>()); paramMap = convertJasper(storageService, report.getDataSource(), map); for (String key : paramMap.keySet()) { QueryParameter qp = paramMap.get(key); ReportRuntimeParameterModel parameterModel = createRuntimeModel(report, parameterValues, qp, dataSourceService); runtimeModel.getParameters().put(key, parameterModel); } } catch (Exception e) { e.printStackTrace(); } } return runtimeModel; } private static ReportRuntimeParameterModel createRuntimeModel(Report report, Map<String, Object> parameterValues, QueryParameter parameter, DataSourceService dataSourceService) { return createRuntimeModel(report, parameterValues, parameter, dataSourceService, false); } private static ReportRuntimeParameterModel createRuntimeModel(Report report, Map<String, Object> parameterValues, QueryParameter parameter, DataSourceService dataSourceService, boolean isDynamic) { AbstractReportRuntimeParameterModel runtimeModel; String parameterName = parameter.getName(); ArrayList<IdName> values = new ArrayList<IdName>(); boolean isMultipleSelection = parameter.getSelection().equalsIgnoreCase(QueryParameter.MULTIPLE_SELECTION); if (ReportConstants.NEXT.equals(report.getType())) { runtimeModel = new NextRuntimeParameterModel(parameterName, getParameterName(parameter), isMultipleSelection); runtimeModel.setDynamic(isDynamic); if ((parameter.getSource() != null) && (parameter.getSource().trim().length() > 0) && !parameter.isDependent()) { try { values.addAll(dataSourceService.getParameterValues(report.getDataSource(), parameter)); } catch (Exception e) { e.printStackTrace(); } } } else { runtimeModel = new JasperRuntimeParameterModel(parameterName, getParameterName(parameter), isMultipleSelection); if ((parameter.getSource() != null) && (parameter.getSource().trim().length() > 0) && !parameter.isDependent()) { if (QueryParameter.SINGLE_SELECTION.equals(parameter.getSelection())) { ((JasperRuntimeParameterModel) runtimeModel).setCombo(true); } try { values.addAll(dataSourceService.getParameterValues(report.getDataSource(), parameter)); } catch (Exception e) { e.printStackTrace(); } } } runtimeModel.setParameterValues(values); Object parameterValue = parameterValues.get(parameterName); if (QueryParameter.MULTIPLE_SELECTION.equals(parameter.getSelection())) { if (parameterValue == null) { // if parameter is dynamic when we edit a scheduler object we must have // a non-null list in Palette, otherwise an exception is raised runtimeModel.setValueList(new ArrayList<Object>()); } else { ArrayList<Object> list = new ArrayList<Object>(); list.addAll(Arrays.asList((Object[])parameterValue)); runtimeModel.setValueList(list); } } else { runtimeModel.setRawValue(parameterValue); } runtimeModel.setMandatory(parameter.isMandatory()); return runtimeModel; } private static String getParameterName(QueryParameter parameter) { String name = parameter.getRuntimeName(); if ((name == null) || name.trim().equals("")) { name = parameter.getName(); } return name; } @SuppressWarnings("unchecked") private static Map<String, QueryParameter> convertJasper(StorageService storageService, DataSource ds, Map<String, Serializable> params) throws Exception { Map<String, QueryParameter> result = new LinkedHashMap<String, QueryParameter>(); Set s = params.entrySet(); for (Object value : s) { Map.Entry<String, Serializable> me = (Map.Entry<String, Serializable>) value; JasperParameter jp = (JasperParameter) me.getValue(); String className = JasperReportsUtil.getValueClassName(storageService, ds, jp); QueryParameter qp = new QueryParameter(jp.getName(), jp.getDescription(), className); //System.out.println(">>> Source = " + jp.getSelect()); qp.setSource(jp.getSelect()); qp.setMandatory(true); qp.setRuntimeName(jp.getShortName()); if (JasperParameterSource.LIST.equals(jp.getType())) { qp.setSelection(QueryParameter.MULTIPLE_SELECTION); qp.setManualSource(true); } else if (JasperParameterSource.COMBO.equals(jp.getType())) { qp.setSelection(QueryParameter.SINGLE_SELECTION); qp.setManualSource(true); } else { // SINGLE qp.setSelection(QueryParameter.SINGLE_SELECTION); qp.setManualSource(false); } //System.out.println("Convert qp=" + qp.getName() + " " + qp.getSelection() + " " + qp.getValueClass()); result.put(me.getKey(), qp); } return result; } }