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