/************************************************************** * * 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 com.sun.star.report.pentaho.layoutprocessor; import com.sun.star.report.OfficeToken; import com.sun.star.report.pentaho.OfficeNamespaces; import com.sun.star.report.pentaho.model.FormattedTextElement; import java.math.BigDecimal; import java.sql.Time; import java.text.SimpleDateFormat; import java.util.Date; import org.jfree.layouting.util.AttributeMap; import org.jfree.report.DataFlags; import org.jfree.report.DataSourceException; import org.jfree.report.data.DefaultDataFlags; import org.jfree.report.expressions.FormulaExpression; import org.jfree.report.flow.FlowController; import org.jfree.report.flow.layoutprocessor.LayoutControllerUtil; import org.pentaho.reporting.libraries.formula.util.HSSFDateUtil; /** * Creation-Date: 06.06.2007, 17:03:30 * * @author Thomas Morgner */ public class FormatValueUtility { private static final String BOOLEAN_VALUE = "boolean-value"; private static final String STRING_VALUE = "string-value"; public static final String VALUE_TYPE = "value-type"; public static final String VALUE = "value"; private static SimpleDateFormat dateFormat; private static SimpleDateFormat timeFormat; private FormatValueUtility() { } public static String applyValueForVariable(final Object value, final AttributeMap variableSection) { String ret = null; if (value instanceof Time) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "time"); ret = formatTime((Time) value); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "time-value", ret); } else if (value instanceof java.sql.Date) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "date"); ret = formatDate((Date) value); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", ret); } else if (value instanceof Date) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); ret = HSSFDateUtil.getExcelDate((Date) value, false, 2).toString(); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, ret); } else if (value instanceof Number) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); } else if (value instanceof Boolean) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "boolean"); if (Boolean.TRUE.equals(value)) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.TRUE); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.FALSE); } } else if (value != null) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, String.valueOf(value)); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, ""); } return ret; } public static void applyValueForCell(final Object value, final AttributeMap variableSection, final String valueType) { if (value instanceof Time) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "time-value", formatTime((Time) value)); } else if (value instanceof java.sql.Date) { if ("float".equals(valueType))//@see http://qa.openoffice.org/issues/show_bug.cgi?id=108954 { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, HSSFDateUtil.getExcelDate((Date) value, false, 2).toString()); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", formatDate((Date) value)); } } else if (value instanceof Date) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "float"); variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, HSSFDateUtil.getExcelDate((Date) value, false, 2).toString()); } else if (value instanceof BigDecimal) { if ("date".equals(valueType)) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, "date-value", formatDate(HSSFDateUtil.getJavaDate((BigDecimal) value, false, 0))); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); } } else if (value instanceof Number) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); } else if (value instanceof Boolean) { if ("float".equals(valueType)) { float fvalue = Boolean.TRUE.equals(value) ? 1 : 0; variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(fvalue)); } else { if (Boolean.TRUE.equals(value)) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.TRUE); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, BOOLEAN_VALUE, OfficeToken.FALSE); } } } else if (value != null) { try { final Float number = Float.valueOf(String.valueOf(value)); applyValueForCell(number, variableSection, valueType); return; } catch (NumberFormatException e) { } if (!"string".equals(valueType)) { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE_TYPE, "string"); //variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, VALUE, String.valueOf(value)); } variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, String.valueOf(value)); } else { variableSection.setAttribute(OfficeNamespaces.OFFICE_NS, STRING_VALUE, ""); } } private static synchronized String formatDate(final Date date) { if (dateFormat == null) { dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.'S'Z'"); } return dateFormat.format(date); } private static synchronized String formatTime(final Date date) { if (timeFormat == null) { timeFormat = new SimpleDateFormat("'PT'HH'H'mm'M'ss'S'"); } return timeFormat.format(date); } public static DataFlags computeDataFlag(final FormattedTextElement element, final FlowController flowController) throws DataSourceException { // here it is relatively easy. We have to evaluate the expression, convert // the result into a string, and print that string. final FormulaExpression formulaExpression = element.getValueExpression(); final Object result = LayoutControllerUtil.evaluateExpression(flowController, element, formulaExpression); if (result == null) { // ignore it. Ignoring it is much better than printing 'null'. // LOGGER.debug("Formula '" + formulaExpression.getFormula() + "' evaluated to null."); return null; } else if (result instanceof DataFlags) { return (DataFlags) result; } else { return new DefaultDataFlags(null, result, true); } } }