blob: 7fd977bcd72822d9b42c3ada9f50ac3190f09e84 [file] [log] [blame]
/**************************************************************
*
* 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);
}
}
}