001/*
002 * (C) Copyright 2006-20011 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Nuxeo - initial API and implementation
016 *
017 */
018
019package org.nuxeo.ecm.platform.reporting.report;
020
021import java.text.ParseException;
022import java.text.SimpleDateFormat;
023import java.util.Calendar;
024import java.util.Date;
025
026import org.apache.commons.logging.Log;
027import org.apache.commons.logging.LogFactory;
028import org.eclipse.birt.report.engine.api.IParameterDefn;
029import org.eclipse.birt.report.engine.api.impl.ScalarParameterDefn;
030
031/**
032 * Wraps Birt Report parameters to manage Cast and Conversions
033 *
034 * @author Tiry (tdelprat@nuxeo.com)
035 */
036public class ReportParameter {
037
038    private static final Log log = LogFactory.getLog(ReportParameter.class);
039
040    public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
041
042    public static final String DATE_FORMAT = "yyyy-MM-dd";
043
044    public static final String TIME_FORMAT = "hh:mm:ss";
045
046    protected int type;
047
048    protected String stringValue;
049
050    protected String name;
051
052    protected String displayName;
053
054    protected String help;
055
056    protected boolean required;
057
058    protected boolean editable = true;
059
060    protected boolean error;
061
062    public ReportParameter(IParameterDefn paramDef) {
063        this(paramDef, null);
064    }
065
066    public ReportParameter(IParameterDefn paramDef, String value) {
067        type = paramDef.getDataType();
068        name = paramDef.getName();
069        displayName = paramDef.getDisplayName();
070        help = paramDef.getHelpText();
071        required = paramDef.isRequired();
072        if (value != null && value.isEmpty()) {
073            stringValue = value;
074        } else {
075            if (paramDef instanceof ScalarParameterDefn) {
076                ScalarParameterDefn scalarParam = (ScalarParameterDefn) paramDef;
077                stringValue = scalarParam.getDefaultValue();
078
079            }
080        }
081    }
082
083    public void setValue(String value) {
084        stringValue = value;
085    }
086
087    public boolean setAndValidateValue(String value) {
088        if (value == null) {
089            return false;
090        }
091        try {
092            if (type == IParameterDefn.TYPE_DATE) {
093                new SimpleDateFormat(DATE_FORMAT).parse(value);
094            } else if (type == IParameterDefn.TYPE_DATE_TIME) {
095                new SimpleDateFormat(DATETIME_FORMAT).parse(value);
096            } else if (type == IParameterDefn.TYPE_TIME) {
097                new SimpleDateFormat(TIME_FORMAT).parse(value);
098            } else if (type == IParameterDefn.TYPE_INTEGER) {
099                Integer.parseInt(value);
100            } else if (type == IParameterDefn.TYPE_FLOAT) {
101                Float.parseFloat(value);
102            } else if (type == IParameterDefn.TYPE_BOOLEAN) {
103                Boolean.parseBoolean(value);
104            } else {
105                if (value.trim().isEmpty()) {
106                    return false;
107                }
108            }
109            stringValue = value;
110            return true;
111        } catch (NumberFormatException | ParseException e) {
112            return false;
113        }
114    }
115
116    public String getTypeName() {
117        if (type == IParameterDefn.TYPE_DATE) {
118            return "Date";
119        } else if (type == IParameterDefn.TYPE_DATE_TIME) {
120            return "DateTime";
121        } else if (type == IParameterDefn.TYPE_TIME) {
122            return "Time";
123        } else if (type == IParameterDefn.TYPE_INTEGER) {
124            return "Integer";
125        } else if (type == IParameterDefn.TYPE_FLOAT) {
126            return "Float";
127        } else if (type == IParameterDefn.TYPE_BOOLEAN) {
128            return "Boolean";
129        }
130        return "String";
131    }
132
133    public String getTypeFormat() {
134        if (type == IParameterDefn.TYPE_DATE) {
135            return DATE_FORMAT;
136        } else if (type == IParameterDefn.TYPE_DATE_TIME) {
137            return DATETIME_FORMAT;
138        } else if (type == IParameterDefn.TYPE_TIME) {
139            return TIME_FORMAT;
140        }
141        return null;
142    }
143
144    public void setValue(Calendar value) {
145        setValue(value.getTime());
146    }
147
148    public void setValue(Date value) {
149        if (type == IParameterDefn.TYPE_DATE) {
150            stringValue = new SimpleDateFormat(DATE_FORMAT).format(value);
151        } else if (type == IParameterDefn.TYPE_DATE_TIME) {
152            stringValue = new SimpleDateFormat(DATETIME_FORMAT).format(value);
153        } else if (type == IParameterDefn.TYPE_TIME) {
154            stringValue = new SimpleDateFormat(TIME_FORMAT).format(value);
155        }
156    }
157
158    public void setValue(Integer value) {
159        if (type == IParameterDefn.TYPE_INTEGER) {
160            stringValue = value.toString();
161        }
162    }
163
164    public void setValue(Float value) {
165        if (type == IParameterDefn.TYPE_FLOAT) {
166            stringValue = value.toString();
167        }
168    }
169
170    public void setValue(Boolean value) {
171        if (type == IParameterDefn.TYPE_BOOLEAN) {
172            stringValue = value.toString();
173        }
174    }
175
176    public String getStringValue() {
177        return stringValue;
178    }
179
180    public Date getDateTimeValue() {
181        try {
182            if (type == IParameterDefn.TYPE_DATE) {
183                return new SimpleDateFormat(DATE_FORMAT).parse(stringValue);
184            } else if (type == IParameterDefn.TYPE_DATE_TIME) {
185                return new SimpleDateFormat(DATETIME_FORMAT).parse(stringValue);
186            } else if (type == IParameterDefn.TYPE_TIME) {
187                return new SimpleDateFormat(TIME_FORMAT).parse(stringValue);
188            }
189        } catch (ParseException e) {
190            String message = String.format("Error while parsing the '%s' date value", stringValue);
191            log.error(message, e);
192        }
193        return null;
194    }
195
196    public Boolean getBooleanValue() {
197        return Boolean.valueOf(stringValue);
198    }
199
200    public Integer getIntegerValue() {
201        return Integer.valueOf(stringValue);
202    }
203
204    public Float getFloatValue() {
205        return Float.valueOf(stringValue);
206    }
207
208    public int getType() {
209        return type;
210    }
211
212    public String getName() {
213        return name;
214    }
215
216    public String getDisplayName() {
217        if (displayName == null || displayName.isEmpty()) {
218            return name;
219        }
220        return displayName;
221    }
222
223    public String getHelp() {
224        return help;
225    }
226
227    public boolean isRequired() {
228        return required;
229    }
230
231    public Object getObjectValue() {
232        if (type == IParameterDefn.TYPE_DATE) {
233            return getDateTimeValue();
234        } else if (type == IParameterDefn.TYPE_DATE_TIME) {
235            return getDateTimeValue();
236        } else if (type == IParameterDefn.TYPE_TIME) {
237            return getDateTimeValue();
238        } else if (type == IParameterDefn.TYPE_BOOLEAN) {
239            return getBooleanValue();
240        } else if (type == IParameterDefn.TYPE_INTEGER) {
241            return getIntegerValue();
242        } else if (type == IParameterDefn.TYPE_FLOAT) {
243            return getFloatValue();
244        } else if (type == IParameterDefn.TYPE_DECIMAL) {
245            return getFloatValue();
246        }
247        return stringValue;
248    }
249
250    public void setObjectValue(Object value) {
251        if (value instanceof Calendar) {
252            setValue((Calendar) value);
253        } else if (value instanceof Date) {
254            setValue((Date) value);
255        } else if (value instanceof Boolean) {
256            setValue((Boolean) value);
257        } else if (value instanceof Integer) {
258            setValue((Integer) value);
259        } else if (value instanceof Float) {
260            setValue((Float) value);
261        } else {
262            if (value != null) {
263                setValue(value.toString());
264            } else {
265                setValue((String) null);
266            }
267        }
268    }
269
270    public boolean isEditable() {
271        return editable;
272    }
273
274    public void setEditable(boolean editable) {
275        this.editable = editable;
276    }
277
278    @Override
279    public String toString() {
280        return "" + name + ":" + type + "(" + stringValue + ")";
281    }
282
283    public boolean isError() {
284        return error;
285    }
286
287    public void setError(boolean error) {
288        this.error = error;
289    }
290
291}