KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > runtime > format > DateTimeConversion


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package net.sf.retrotranslator.runtime.format;
33
34 import java.text.SimpleDateFormat JavaDoc;
35 import java.util.*;
36
37 /**
38  * @author Taras Puchko
39  */

40 abstract class DateTimeConversion extends Conversion {
41
42     public static Map<Character JavaDoc, DateTimeConversion> getConversions() {
43         HashMap<Character JavaDoc, DateTimeConversion> map = new HashMap<Character JavaDoc, DateTimeConversion>();
44         map.put('H', new PatternConversion("HH"));
45         map.put('I', new PatternConversion("hh"));
46         map.put('k', new PatternConversion("H"));
47         map.put('l', new PatternConversion("h"));
48         map.put('M', new PatternConversion("mm"));
49         map.put('S', new PatternConversion("ss"));
50         map.put('L', new PatternConversion("SSS"));
51         map.put('N', new PatternConversion("SSS000000"));
52         map.put('p', new PatternConversion("a", true));
53         map.put('z', new TimeZoneOffsetConversion());
54         map.put('Z', new PatternConversion("z"));
55         map.put('s', new MillisConversion(1000));
56         map.put('Q', new MillisConversion(1));
57         map.put('B', new PatternConversion("MMMM"));
58         map.put('b', new PatternConversion("MMM"));
59         map.put('h', new PatternConversion("MMM"));
60         map.put('A', new PatternConversion("EEEE"));
61         map.put('a', new PatternConversion("EEE"));
62         map.put('C', new CenturyConversion());
63         map.put('Y', new PatternConversion("yyyy"));
64         map.put('y', new PatternConversion("yy"));
65         map.put('j', new PatternConversion("DDD"));
66         map.put('m', new PatternConversion("MM"));
67         map.put('d', new PatternConversion("dd"));
68         map.put('e', new PatternConversion("d"));
69         map.put('R', new PatternConversion("HH:mm"));
70         map.put('T', new PatternConversion("HH:mm:ss"));
71         map.put('r', new PatternConversion("hh:mm:ss a"));
72         map.put('D', new PatternConversion("MM/dd/yy"));
73         map.put('F', new PatternConversion("yyyy-MM-dd"));
74         map.put('c', new PatternConversion("EEE MMM dd HH:mm:ss z yyyy"));
75         return map;
76     }
77
78     public void format(FormatContext context) {
79         context.assertNoPrecision();
80         context.assertNoFlag('#');
81         context.checkWidth();
82         Object JavaDoc argument = context.getArgument();
83         if (argument == null) {
84             context.writePadded(String.valueOf(argument));
85         } else {
86             printf(context);
87         }
88     }
89
90     protected abstract void printf(FormatContext context);
91
92     protected static Calendar getCalendar(FormatContext context) {
93         Object JavaDoc argument = context.getArgument();
94         Calendar calendar;
95         if (argument instanceof Date) {
96             calendar = new GregorianCalendar();
97             calendar.setTime((Date) argument);
98         } else if (argument instanceof Calendar) {
99             calendar = (Calendar) argument;
100         } else if (argument instanceof Long JavaDoc) {
101             calendar = new GregorianCalendar();
102             calendar.setTimeInMillis((Long JavaDoc) argument);
103         } else {
104             throw context.getConversionException();
105         }
106         return calendar;
107     }
108
109     private static class PatternConversion extends DateTimeConversion {
110
111         private String JavaDoc pattern;
112         private boolean toLowerCase;
113
114         public PatternConversion(String JavaDoc pattern) {
115             this.pattern = pattern;
116         }
117
118         public PatternConversion(String JavaDoc pattern, boolean toLowerCase) {
119             this.pattern = pattern;
120             this.toLowerCase = toLowerCase;
121         }
122
123         protected void printf(FormatContext context) {
124             Locale locale = context.getLocale();
125             if (locale == null) {
126                 locale = Locale.US;
127             }
128             SimpleDateFormat JavaDoc format = new SimpleDateFormat JavaDoc(pattern, locale);
129             Object JavaDoc argument = context.getArgument();
130             Date date;
131             if (argument instanceof Date) {
132                 date = (Date) argument;
133             } else if (argument instanceof Calendar) {
134                 Calendar calendar = (Calendar) argument;
135                 format.setTimeZone(calendar.getTimeZone());
136                 date = calendar.getTime();
137             } else if (argument instanceof Long JavaDoc) {
138                 date = new Date((Long JavaDoc) argument);
139             } else {
140                 throw context.getConversionException();
141             }
142             String JavaDoc result = format.format(date);
143             if (toLowerCase) {
144                 result = result.toLowerCase(locale);
145             }
146             context.writePadded(result);
147         }
148     }
149
150     private static class MillisConversion extends DateTimeConversion {
151
152         private long divisor;
153
154         public MillisConversion(long divisor) {
155             this.divisor = divisor;
156         }
157
158         protected void printf(FormatContext context) {
159             Object JavaDoc argument = context.getArgument();
160             long millis;
161             if (argument instanceof Date) {
162                 millis = ((Date) argument).getTime();
163             } else if (argument instanceof Calendar) {
164                 millis = ((Calendar) argument).getTimeInMillis();
165             } else if (argument instanceof Long JavaDoc) {
166                 millis = (Long JavaDoc) argument;
167             } else {
168                 throw context.getConversionException();
169             }
170             context.writePadded(String.valueOf(millis / divisor));
171         }
172     }
173
174     private static class TimeZoneOffsetConversion extends DateTimeConversion {
175
176         protected void printf(FormatContext context) {
177             int offset = getCalendar(context).get(Calendar.ZONE_OFFSET) / 60000;
178             StringBuilder JavaDoc builder = new StringBuilder JavaDoc(5).append(offset < 0 ? '-' : '+');
179             int value = offset < 0 ? -offset : offset;
180             String JavaDoc s = Integer.toString(value / 60 * 100 + value % 60);
181             for (int i = 4 - s.length(); i > 0; i--) {
182                 builder.append('0');
183             }
184             context.writePadded(builder.append(s).toString());
185         }
186     }
187
188     private static class CenturyConversion extends DateTimeConversion {
189
190         protected void printf(FormatContext context) {
191             int century = getCalendar(context).get(Calendar.YEAR) / 100;
192             if (century < 10) {
193                 char[] chars = Integer.toString(century + 10).toCharArray();
194                 chars[0] = '0';
195                 context.writePadded(new String JavaDoc(chars));
196             } else {
197                 context.writePadded(Integer.toString(century));
198             }
199         }
200     }
201
202 }
203
Popular Tags