1
24 package net.sf.jasperreports.engine.util;
25
26 import java.lang.reflect.InvocationTargetException;
27 import java.text.DateFormat;
28 import java.text.DecimalFormat;
29 import java.text.NumberFormat;
30 import java.text.SimpleDateFormat;
31 import java.util.Locale;
32 import java.util.TimeZone;
33
34 import net.sf.jasperreports.engine.JRRuntimeException;
35
36
37
40 public class DefaultFormatFactory implements FormatFactory
41 {
42 public static final String EXCEPTION_MESSAGE_KEY_FACTORY_INSTANCE_ERROR = "util.format.factory.instance.error";
43 public static final String EXCEPTION_MESSAGE_KEY_FACTORY_LOADING_ERROR = "util.format.factory.loading.error";
44
45
49 public static final String STANDARD_DATE_FORMAT_DEFAULT = "default";
50
51
55 public static final String STANDARD_DATE_FORMAT_SHORT = "short";
56
57
61 public static final String STANDARD_DATE_FORMAT_MEDIUM = "medium";
62
63
67 public static final String STANDARD_DATE_FORMAT_LONG = "long";
68
69
73 public static final String STANDARD_DATE_FORMAT_FULL = "full";
74
75
78 public static final String STANDARD_DATE_FORMAT_HIDE = "hide";
79
80
83 public static final String STANDARD_DATE_FORMAT_SEPARATOR = ",";
84
85
88 public static final String STANDARD_NUMBER_FORMAT_DURATION = "[h]:mm:ss";
89
90
91 @Override
92 public DateFormat createDateFormat(String pattern, Locale locale, TimeZone tz)
93 {
94 int[] dateStyle = null;
95 int[] timeStyle = null;
96 if (pattern != null && pattern.trim().length() > 0)
97 {
98 int sepIdx = pattern.indexOf(STANDARD_DATE_FORMAT_SEPARATOR);
99 String dateTok = sepIdx < 0 ? pattern : pattern.substring(0, sepIdx);
100 dateStyle = getDateStyle(dateTok);
101 if (dateStyle != null)
102 {
103 if (sepIdx >= 0)
104 {
105 String timeTok = pattern.substring(sepIdx + STANDARD_DATE_FORMAT_SEPARATOR.length());
106 timeStyle = getDateStyle(timeTok);
107 }
108 else
109 {
110 timeStyle = dateStyle;
111 }
112 }
113 }
114
115 DateFormat format;
116 if (dateStyle != null && timeStyle != null)
117 {
118 format = getDateFormat(dateStyle, timeStyle, locale);
119 }
120 else
121 {
122 if (locale == null)
123 {
124 format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
125 }
126 else
127 {
128 format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
129 }
130 if (
131 pattern != null && pattern.trim().length() > 0
132 && format instanceof SimpleDateFormat
133 )
134 {
135 ((SimpleDateFormat) format).applyPattern(pattern);
136 }
137 }
138
139 if (tz != null)
140 {
141 format.setTimeZone(tz);
142 }
143
144 return format;
145 }
146
147
148 protected static int[] getDateStyle(String pattern)
149 {
150 if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_DEFAULT))
151 {
152 return new int[]{DateFormat.DEFAULT};
153 }
154 else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_SHORT))
155 {
156 return new int[]{DateFormat.SHORT};
157 }
158 else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_MEDIUM))
159 {
160 return new int[]{DateFormat.MEDIUM};
161 }
162 else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_LONG))
163 {
164 return new int[]{DateFormat.LONG};
165 }
166 else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_FULL))
167 {
168 return new int[]{DateFormat.FULL};
169 }
170 else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_HIDE))
171 {
172 return new int[0];
173 }
174 else
175 {
176 return null;
177 }
178 }
179
180
181 protected static DateFormat getDateFormat(int[] dateStyle, int[] timeStyle, Locale locale)
182 {
183 if (dateStyle.length == 0)
184 {
185 if (timeStyle.length == 0)
186 {
187 return new SimpleDateFormat("");
188 }
189
190 return locale == null ?
191 DateFormat.getTimeInstance(timeStyle[0]) :
192 DateFormat.getTimeInstance(timeStyle[0], locale);
193 }
194
195 if (timeStyle.length == 0)
196 {
197 return locale == null ?
198 DateFormat.getDateInstance(dateStyle[0]) :
199 DateFormat.getDateInstance(dateStyle[0], locale);
200 }
201
202 return locale == null ?
203 DateFormat.getDateTimeInstance(dateStyle[0], timeStyle[0]) :
204 DateFormat.getDateTimeInstance(dateStyle[0], timeStyle[0], locale);
205 }
206
207
208 @Override
209 public NumberFormat createNumberFormat(String pattern, Locale locale)
210 {
211 NumberFormat format = null;
212 if (pattern != null && pattern.trim().length() > 0)
213 {
214 if (STANDARD_NUMBER_FORMAT_DURATION.equals(pattern))
215 {
216 format = new DurationNumberFormat();
217 }
218 else
219 {
220 if (locale == null)
221 {
222 format = NumberFormat.getNumberInstance();
223 }
224 else
225 {
226 format = NumberFormat.getNumberInstance(locale);
227 }
228
229 if (format instanceof DecimalFormat)
230 {
231 ((DecimalFormat) format).applyPattern(pattern);
232 }
233 }
234 }
235 return format;
236 }
237
238
239 public static FormatFactory createFormatFactory(String formatFactoryClassName)
240 {
241 FormatFactory formatFactory = null;
242
243 if (formatFactoryClassName != null)
244 {
245 try
246 {
247 Class<?> formatFactoryClass = JRClassLoader.loadClassForName(formatFactoryClassName);
248 formatFactory = (FormatFactory) formatFactoryClass.getDeclaredConstructor().newInstance();
249 }
250 catch (ClassNotFoundException e)
251 {
252 throw
253 new JRRuntimeException(
254 EXCEPTION_MESSAGE_KEY_FACTORY_LOADING_ERROR,
255 new Object[]{formatFactoryClassName},
256 e);
257 }
258 catch (NoSuchMethodException | InvocationTargetException
259 | IllegalAccessException | InstantiationException e)
260 {
261 throw
262 new JRRuntimeException(
263 EXCEPTION_MESSAGE_KEY_FACTORY_INSTANCE_ERROR,
264 new Object[]{formatFactoryClassName},
265 e);
266 }
267 }
268 else
269 {
270 formatFactory = new DefaultFormatFactory();
271 }
272
273 return formatFactory;
274 }
275
276
277 }
278