9 package javolution.text.internal;
11 import java.awt.Color;
13 import java.io.IOException;
14 import java.math.BigDecimal;
15 import java.math.BigInteger;
16 import java.text.DateFormat;
17 import java.text.ParseException;
18 import java.text.SimpleDateFormat;
19 import java.util.Date;
20 import java.util.TimeZone;
40 ThreadLocal<Object> objToString =
new ThreadLocal<Object>();
42 public Appendable format(Object obj, Appendable dest)
44 if (obj ==
null)
return dest.append(
"null");
45 if (objToString.get() == obj)
47 dest.append(
"Object#"));
50 String str = obj.toString();
51 return dest.append(str);
53 objToString.set(
null);
57 public Object parse(CharSequence csq,
Cursor cursor) {
58 throw new UnsupportedOperationException(
59 "Generic object parsing not supported.");
88 @SuppressWarnings(
"unchecked")
106 if (annotation !=
null) {
108 format = annotation.
value().newInstance();
109 }
catch (Throwable error) {
113 Class<?> mappedClass = type;
116 if (mappedClass.equals(cls))
break;
117 mappedClass = mappedClass.getSuperclass();
123 cls = cls.getSuperclass();
125 throw new Error(
"Object default format not found !");
141 public Appendable format(Boolean obj, Appendable dest)
143 return TypeFormat.format(obj.booleanValue(), dest);
146 public Boolean parse(CharSequence csq,
Cursor cursor) {
153 public Appendable format(Character obj, Appendable dest)
155 return dest.append(obj.charValue());
158 public Character parse(CharSequence csq,
Cursor cursor) {
159 return Character.valueOf(cursor.
nextChar(csq));
163 defaultFormats.
put(Byte.class,
new TextFormat<Byte>() {
165 public Appendable format(Byte obj, Appendable dest)
167 return TypeFormat.format(obj.byteValue(), dest);
170 public Byte parse(CharSequence csq, Cursor cursor) {
171 return Byte.valueOf(TypeFormat.parseByte(csq, 10, cursor));
175 defaultFormats.
put(Short.class,
new TextFormat<Short>() {
177 public Appendable format(Short obj, Appendable dest)
179 return TypeFormat.format(obj.shortValue(), dest);
182 public Short parse(CharSequence csq, Cursor cursor) {
183 return Short.valueOf(TypeFormat.parseShort(csq, 10, cursor));
187 defaultFormats.
put(Integer.class,
new TextFormat<Integer>() {
189 public Appendable format(Integer obj, Appendable dest)
191 return TypeFormat.format(obj.intValue(), dest);
194 public Integer parse(CharSequence csq, Cursor cursor) {
195 return Integer.valueOf(TypeFormat.parseInt(csq, 10, cursor));
199 defaultFormats.
put(Long.class,
new TextFormat<Long>() {
201 public Appendable format(Long obj, Appendable dest)
203 return TypeFormat.format(obj.longValue(), dest);
206 public Long parse(CharSequence csq, Cursor cursor) {
207 return Long.valueOf(TypeFormat.parseLong(csq, 10, cursor));
211 defaultFormats.
put(Float.class,
new TextFormat<Float>() {
213 public Appendable format(Float obj, Appendable dest)
215 return TypeFormat.format(obj.floatValue(), dest);
218 public Float parse(CharSequence csq, Cursor cursor) {
219 return new Float(TypeFormat.parseFloat(csq, cursor));
223 defaultFormats.
put(Double.class,
new TextFormat<Double>() {
225 public Appendable format(Double obj, Appendable dest)
227 return TypeFormat.format(obj.doubleValue(), dest);
230 public Double parse(CharSequence csq, Cursor cursor) {
231 return new Double(TypeFormat.parseDouble(csq, cursor));
235 defaultFormats.
put(String.class,
new TextFormat<String>() {
237 public Appendable format(String obj, Appendable dest)
239 return dest.append(obj);
242 public String parse(CharSequence csq, Cursor cursor) {
243 CharSequence tmp = csq.subSequence(cursor.getIndex(),
245 cursor.setIndex(csq.length());
246 return tmp.toString();
250 defaultFormats.
put(Class.class,
new TextFormat<Class<?>>() {
252 public Appendable format(Class<?> obj, Appendable dest)
254 return dest.append(obj.getName());
257 public Class<?> parse(CharSequence csq, Cursor cursor) {
258 CharSequence name = cursor.nextToken(csq, CharSet.WHITESPACES);
260 return Class.forName(name.toString());
261 }
catch (ClassNotFoundException e) {
262 throw new IllegalArgumentException(
"Class " + name
268 defaultFormats.
put(Date.class,
new TextFormat<Date>() {
269 TimeZone tz = TimeZone.getTimeZone(
"UTC");
270 DateFormat df =
new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm'Z'");
275 public Appendable format(Date obj, Appendable dest)
277 return dest.append(df.format(obj));
280 public Date parse(CharSequence csq, Cursor cursor) {
281 CharSequence date = cursor.nextToken(csq, CharSet.WHITESPACES);
283 return df.parse(date.toString());
284 }
catch (ParseException error) {
285 throw new IllegalArgumentException(error);
289 defaultFormats.
put(BigInteger.class,
new TextFormat<BigInteger>() {
291 public Appendable format(BigInteger obj, Appendable dest)
293 return dest.append(obj.toString());
296 public BigInteger parse(CharSequence csq, Cursor cursor) {
297 CharSequence value = cursor.nextToken(csq, CharSet.WHITESPACES);
298 return new BigInteger(value.toString());
302 defaultFormats.
put(BigDecimal.class,
new TextFormat<BigDecimal>() {
304 public Appendable format(BigDecimal obj, Appendable dest)
306 return dest.append(obj.toString());
309 public BigDecimal parse(CharSequence csq, Cursor cursor) {
310 CharSequence value = cursor.nextToken(csq, CharSet.WHITESPACES);
311 return new BigDecimal(value.toString());
315 defaultFormats.
put(Font.class,
new TextFormat<Font>() {
317 public Appendable format(Font obj, Appendable dest)
319 return dest.append(obj.getName());
322 public Font parse(CharSequence csq, Cursor cursor) {
323 CharSequence name = cursor.nextToken(csq, CharSet.WHITESPACES);
324 return Font.decode(name.toString());
328 defaultFormats.
put(Color.class,
new TextFormat<Color>() {
330 public Appendable format(Color obj, Appendable dest)
332 return dest.append(
'#').append(
333 Integer.toHexString(obj.getRGB()));
336 public Color parse(CharSequence csq, Cursor cursor) {
337 CharSequence name = cursor.nextToken(csq, CharSet.WHITESPACES);
338 return Color.decode(name.toString());