1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.helpers;
19
20 import org.apache.log4j.Layout;
21 import org.apache.log4j.helpers.RelativeTimeDateFormat;
22 import org.apache.log4j.helpers.AbsoluteTimeDateFormat;
23 import org.apache.log4j.helpers.DateTimeDateFormat;
24 import org.apache.log4j.helpers.ISO8601DateFormat;
25 import org.apache.log4j.spi.LoggingEvent;
26 import java.text.DateFormat;
27 import java.text.SimpleDateFormat;
28 import java.util.Date;
29 import java.util.TimeZone;
30 import java.text.FieldPosition;
31
32
33 /***
34 This abstract layout takes care of all the date related options and
35 formatting work.
36
37
38 @author Ceki Gülcü
39 */
40 abstract public class DateLayout extends Layout {
41
42 /***
43 String constant designating no time information. Current value of
44 this constant is <b>NULL</b>.
45
46 */
47 public final static String NULL_DATE_FORMAT = "NULL";
48
49 /***
50 String constant designating relative time. Current value of
51 this constant is <b>RELATIVE</b>.
52 */
53 public final static String RELATIVE_TIME_DATE_FORMAT = "RELATIVE";
54
55 protected FieldPosition pos = new FieldPosition(0);
56
57 /***
58 @deprecated Options are now handled using the JavaBeans paradigm.
59 This constant is not longer needed and will be removed in the
60 <em>near</em> term.
61 */
62 final static public String DATE_FORMAT_OPTION = "DateFormat";
63
64 /***
65 @deprecated Options are now handled using the JavaBeans paradigm.
66 This constant is not longer needed and will be removed in the
67 <em>near</em> term.
68 */
69 final static public String TIMEZONE_OPTION = "TimeZone";
70
71 private String timeZoneID;
72 private String dateFormatOption;
73
74 protected DateFormat dateFormat;
75 protected Date date = new Date();
76
77 /***
78 @deprecated Use the setter method for the option directly instead
79 of the generic <code>setOption</code> method.
80 */
81 public
82 String[] getOptionStrings() {
83 return new String[] {DATE_FORMAT_OPTION, TIMEZONE_OPTION};
84 }
85
86 /***
87 @deprecated Use the setter method for the option directly instead
88 of the generic <code>setOption</code> method.
89 */
90 public
91 void setOption(String option, String value) {
92 if(option.equalsIgnoreCase(DATE_FORMAT_OPTION)) {
93 dateFormatOption = value.toUpperCase();
94 } else if(option.equalsIgnoreCase(TIMEZONE_OPTION)) {
95 timeZoneID = value;
96 }
97 }
98
99
100 /***
101 The value of the <b>DateFormat</b> option should be either an
102 argument to the constructor of {@link SimpleDateFormat} or one of
103 the srings "NULL", "RELATIVE", "ABSOLUTE", "DATE" or "ISO8601.
104 */
105 public
106 void setDateFormat(String dateFormat) {
107 if (dateFormat != null) {
108 dateFormatOption = dateFormat;
109 }
110 setDateFormat(dateFormatOption, TimeZone.getDefault());
111 }
112
113 /***
114 Returns value of the <b>DateFormat</b> option.
115 */
116 public
117 String getDateFormat() {
118 return dateFormatOption;
119 }
120
121 /***
122 The <b>TimeZoneID</b> option is a time zone ID string in the format
123 expected by the {@link TimeZone#getTimeZone} method.
124 */
125 public
126 void setTimeZone(String timeZone) {
127 this.timeZoneID = timeZone;
128 }
129
130 /***
131 Returns value of the <b>TimeZone</b> option.
132 */
133 public
134 String getTimeZone() {
135 return timeZoneID;
136 }
137
138 public
139 void activateOptions() {
140 setDateFormat(dateFormatOption);
141 if(timeZoneID != null && dateFormat != null) {
142 dateFormat.setTimeZone(TimeZone.getTimeZone(timeZoneID));
143 }
144 }
145
146 public
147 void dateFormat(StringBuffer buf, LoggingEvent event) {
148 if(dateFormat != null) {
149 date.setTime(event.timeStamp);
150 dateFormat.format(date, buf, this.pos);
151 buf.append(' ');
152 }
153 }
154
155 /***
156 Sets the {@link DateFormat} used to format time and date in the
157 zone determined by <code>timeZone</code>.
158 */
159 public
160 void setDateFormat(DateFormat dateFormat, TimeZone timeZone) {
161 this.dateFormat = dateFormat;
162 this.dateFormat.setTimeZone(timeZone);
163 }
164
165 /***
166 Sets the DateFormat used to format date and time in the time zone
167 determined by <code>timeZone</code> parameter. The {@link DateFormat} used
168 will depend on the <code>dateFormatType</code>.
169
170 <p>The recognized types are {@link #NULL_DATE_FORMAT}, {@link
171 #RELATIVE_TIME_DATE_FORMAT} {@link
172 AbsoluteTimeDateFormat#ABS_TIME_DATE_FORMAT}, {@link
173 AbsoluteTimeDateFormat#DATE_AND_TIME_DATE_FORMAT} and {@link
174 AbsoluteTimeDateFormat#ISO8601_DATE_FORMAT}. If the
175 <code>dateFormatType</code> is not one of the above, then the
176 argument is assumed to be a date pattern for {@link
177 SimpleDateFormat}.
178 */
179 public
180 void setDateFormat(String dateFormatType, TimeZone timeZone) {
181 if(dateFormatType == null) {
182 this.dateFormat = null;
183 return;
184 }
185
186 if(dateFormatType.equalsIgnoreCase(NULL_DATE_FORMAT)) {
187 this.dateFormat = null;
188 } else if (dateFormatType.equalsIgnoreCase(RELATIVE_TIME_DATE_FORMAT)) {
189 this.dateFormat = new RelativeTimeDateFormat();
190 } else if(dateFormatType.equalsIgnoreCase(
191 AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT)) {
192 this.dateFormat = new AbsoluteTimeDateFormat(timeZone);
193 } else if(dateFormatType.equalsIgnoreCase(
194 AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT)) {
195 this.dateFormat = new DateTimeDateFormat(timeZone);
196 } else if(dateFormatType.equalsIgnoreCase(
197 AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT)) {
198 this.dateFormat = new ISO8601DateFormat(timeZone);
199 } else {
200 this.dateFormat = new SimpleDateFormat(dateFormatType);
201 this.dateFormat.setTimeZone(timeZone);
202 }
203 }
204 }