1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski package com.sun.star.report.pentaho.layoutprocessor; 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski import com.sun.star.report.OfficeToken; 26*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.OfficeNamespaces; 27*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.FormattedTextElement; 28*b1cdbd2cSJim Jagielski import java.math.BigDecimal; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski import java.sql.Time; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski import java.text.SimpleDateFormat; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski import java.util.Date; 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski import org.jfree.layouting.util.AttributeMap; 37*b1cdbd2cSJim Jagielski import org.jfree.report.DataFlags; 38*b1cdbd2cSJim Jagielski import org.jfree.report.DataSourceException; 39*b1cdbd2cSJim Jagielski import org.jfree.report.data.DefaultDataFlags; 40*b1cdbd2cSJim Jagielski import org.jfree.report.expressions.FormulaExpression; 41*b1cdbd2cSJim Jagielski import org.jfree.report.flow.FlowController; 42*b1cdbd2cSJim Jagielski import org.jfree.report.flow.layoutprocessor.LayoutControllerUtil; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski import org.pentaho.reporting.libraries.formula.util.HSSFDateUtil; 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski /** 47*b1cdbd2cSJim Jagielski * Creation-Date: 06.06.2007, 17:03:30 48*b1cdbd2cSJim Jagielski * 49*b1cdbd2cSJim Jagielski * @author Thomas Morgner 50*b1cdbd2cSJim Jagielski */ 51*b1cdbd2cSJim Jagielski public class FormatValueUtility 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski private static final String BOOLEAN_VALUE = "boolean-value"; 55*b1cdbd2cSJim Jagielski private static final String STRING_VALUE = "string-value"; 56*b1cdbd2cSJim Jagielski public static final String VALUE_TYPE = "value-type"; 57*b1cdbd2cSJim Jagielski public static final String VALUE = "value"; 58*b1cdbd2cSJim Jagielski private static SimpleDateFormat dateFormat; 59*b1cdbd2cSJim Jagielski private static SimpleDateFormat timeFormat; 60*b1cdbd2cSJim Jagielski FormatValueUtility()61*b1cdbd2cSJim Jagielski private FormatValueUtility() 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski applyValueForVariable(final Object value, final AttributeMap variableSection)65*b1cdbd2cSJim Jagielski public static String applyValueForVariable(final Object value, final AttributeMap variableSection) 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski String ret = null; 68*b1cdbd2cSJim Jagielski if (value instanceof Time) 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "time"); 71*b1cdbd2cSJim Jagielski ret = formatTime((Time) value); 72*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "time-value", ret); 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski else if (value instanceof java.sql.Date) 75*b1cdbd2cSJim Jagielski { 76*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "date"); 77*b1cdbd2cSJim Jagielski ret = formatDate((Date) value); 78*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", ret); 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski else if (value instanceof Date) 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); 83*b1cdbd2cSJim Jagielski ret = HSSFDateUtil.getExcelDate((Date) value, false, 2).toString(); 84*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, ret); 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski else if (value instanceof Number) 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); 89*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski else if (value instanceof Boolean) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "boolean"); 94*b1cdbd2cSJim Jagielski if (Boolean.TRUE.equals(value)) 95*b1cdbd2cSJim Jagielski { 96*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.TRUE); 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski else 99*b1cdbd2cSJim Jagielski { 100*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.FALSE); 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski else if (value != null) 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); 106*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, String.valueOf(value)); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski else 109*b1cdbd2cSJim Jagielski { 110*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); 111*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, ""); 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski return ret; 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski applyValueForCell(final Object value, final AttributeMap variableSection, final String valueType)116*b1cdbd2cSJim Jagielski public static void applyValueForCell(final Object value, final AttributeMap variableSection, final String valueType) 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski if (value instanceof Time) 119*b1cdbd2cSJim Jagielski { 120*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "time-value", formatTime((Time) value)); 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski else if (value instanceof java.sql.Date) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski if ("float".equals(valueType))//@see http://qa.openoffice.org/issues/show_bug.cgi?id=108954 125*b1cdbd2cSJim Jagielski { 126*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, HSSFDateUtil.getExcelDate((Date) value, false, 2).toString()); 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski else 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", formatDate((Date) value)); 131*b1cdbd2cSJim Jagielski } 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski else if (value instanceof Date) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); 136*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, HSSFDateUtil.getExcelDate((Date) value, false, 2).toString()); 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski else if (value instanceof BigDecimal) 139*b1cdbd2cSJim Jagielski { 140*b1cdbd2cSJim Jagielski if ("date".equals(valueType)) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", formatDate(HSSFDateUtil.getJavaDate((BigDecimal) value, false, 0))); 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski else 145*b1cdbd2cSJim Jagielski { 146*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski else if (value instanceof Number) 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski else if (value instanceof Boolean) 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski if ("float".equals(valueType)) 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski float fvalue = Boolean.TRUE.equals(value) ? 1 : 0; 158*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(fvalue)); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski else 161*b1cdbd2cSJim Jagielski { 162*b1cdbd2cSJim Jagielski if (Boolean.TRUE.equals(value)) 163*b1cdbd2cSJim Jagielski { 164*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.TRUE); 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski else 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.FALSE); 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski } 171*b1cdbd2cSJim Jagielski } 172*b1cdbd2cSJim Jagielski else if (value != null) 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski try 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski final Float number = Float.valueOf(String.valueOf(value)); 177*b1cdbd2cSJim Jagielski applyValueForCell(number, variableSection, valueType); 178*b1cdbd2cSJim Jagielski return; 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski catch (NumberFormatException e) 181*b1cdbd2cSJim Jagielski { 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski if (!"string".equals(valueType)) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); 186*b1cdbd2cSJim Jagielski //variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, String.valueOf(value)); 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski else 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, ""); 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski formatDate(final Date date)196*b1cdbd2cSJim Jagielski private static synchronized String formatDate(final Date date) 197*b1cdbd2cSJim Jagielski { 198*b1cdbd2cSJim Jagielski if (dateFormat == null) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.'S'Z'"); 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski return dateFormat.format(date); 203*b1cdbd2cSJim Jagielski } 204*b1cdbd2cSJim Jagielski formatTime(final Date date)205*b1cdbd2cSJim Jagielski private static synchronized String formatTime(final Date date) 206*b1cdbd2cSJim Jagielski { 207*b1cdbd2cSJim Jagielski if (timeFormat == null) 208*b1cdbd2cSJim Jagielski { 209*b1cdbd2cSJim Jagielski timeFormat = new SimpleDateFormat("'PT'HH'H'mm'M'ss'S'"); 210*b1cdbd2cSJim Jagielski } 211*b1cdbd2cSJim Jagielski return timeFormat.format(date); 212*b1cdbd2cSJim Jagielski } 213*b1cdbd2cSJim Jagielski computeDataFlag(final FormattedTextElement element, final FlowController flowController)214*b1cdbd2cSJim Jagielski public static DataFlags computeDataFlag(final FormattedTextElement element, 215*b1cdbd2cSJim Jagielski final FlowController flowController) 216*b1cdbd2cSJim Jagielski throws DataSourceException 217*b1cdbd2cSJim Jagielski { 218*b1cdbd2cSJim Jagielski // here it is relatively easy. We have to evaluate the expression, convert 219*b1cdbd2cSJim Jagielski // the result into a string, and print that string. 220*b1cdbd2cSJim Jagielski final FormulaExpression formulaExpression = element.getValueExpression(); 221*b1cdbd2cSJim Jagielski final Object result = LayoutControllerUtil.evaluateExpression(flowController, element, formulaExpression); 222*b1cdbd2cSJim Jagielski if (result == null) 223*b1cdbd2cSJim Jagielski { 224*b1cdbd2cSJim Jagielski // ignore it. Ignoring it is much better than printing 'null'. 225*b1cdbd2cSJim Jagielski // LOGGER.debug("Formula '" + formulaExpression.getFormula() + "' evaluated to null."); 226*b1cdbd2cSJim Jagielski return null; 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski else if (result instanceof DataFlags) 229*b1cdbd2cSJim Jagielski { 230*b1cdbd2cSJim Jagielski return (DataFlags) result; 231*b1cdbd2cSJim Jagielski } 232*b1cdbd2cSJim Jagielski else 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski return new DefaultDataFlags(null, result, true); 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski } 238