View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j.helpers;
19  
20  import java.util.Date;
21  import java.util.Calendar;
22  import java.util.TimeZone;
23  import java.text.FieldPosition;
24  import java.text.ParsePosition;
25  import java.text.DateFormat;
26  
27  
28  /**
29     Formats a {@link Date} in the format "HH:mm:ss,SSS" for example,
30     "15:49:37,459".
31     
32     @author Ceki Gülcü
33     @author Andrew Vajoczki    
34  
35     @since 0.7.5
36  */
37  public class AbsoluteTimeDateFormat extends DateFormat {
38     private static final long serialVersionUID = -388856345976723342L;
39  
40    /**
41       String constant used to specify {@link
42       org.apache.log4j.helpers.AbsoluteTimeDateFormat} in layouts. Current
43       value is <b>ABSOLUTE</b>.  */
44    public final static String ABS_TIME_DATE_FORMAT = "ABSOLUTE";
45  
46    /**
47       String constant used to specify {@link
48       org.apache.log4j.helpers.DateTimeDateFormat} in layouts.  Current
49       value is <b>DATE</b>.
50    */
51    public final static String DATE_AND_TIME_DATE_FORMAT = "DATE";
52  
53    /**
54       String constant used to specify {@link
55       org.apache.log4j.helpers.ISO8601DateFormat} in layouts. Current
56       value is <b>ISO8601</b>.
57    */
58    public final static String ISO8601_DATE_FORMAT = "ISO8601";
59  
60    public
61    AbsoluteTimeDateFormat() {
62      setCalendar(Calendar.getInstance());
63    }
64    
65    public
66    AbsoluteTimeDateFormat(TimeZone timeZone) {
67      setCalendar(Calendar.getInstance(timeZone));
68    }
69  
70    private static long   previousTime;
71    private static char[] previousTimeWithoutMillis = new char[9]; // "HH:mm:ss."
72  
73    /**
74       Appends to <code>sbuf</code> the time in the format
75       "HH:mm:ss,SSS" for example, "15:49:37,459"
76  
77       @param date the date to format
78       @param sbuf the string buffer to write to
79       @param fieldPosition remains untouched
80      */
81    public
82    StringBuffer format(Date date, StringBuffer sbuf,
83  		      FieldPosition fieldPosition) {
84  
85      long now = date.getTime();
86      int millis = (int)(now % 1000);
87  
88      if ((now - millis) != previousTime || previousTimeWithoutMillis[0] == 0) {
89        // We reach this point at most once per second
90        // across all threads instead of each time format()
91        // is called. This saves considerable CPU time.
92  
93        calendar.setTime(date);
94  
95        int start = sbuf.length();
96        
97        int hour = calendar.get(Calendar.HOUR_OF_DAY);
98        if(hour < 10) {
99  	sbuf.append('0');
100       }
101       sbuf.append(hour);
102       sbuf.append(':');
103       
104       int mins = calendar.get(Calendar.MINUTE);
105       if(mins < 10) {
106 	sbuf.append('0');
107       }
108       sbuf.append(mins);
109       sbuf.append(':');
110       
111       int secs = calendar.get(Calendar.SECOND);
112       if(secs < 10) {
113 	sbuf.append('0');
114       }
115       sbuf.append(secs);
116       sbuf.append(',');      
117 
118       // store the time string for next time to avoid recomputation
119       sbuf.getChars(start, sbuf.length(), previousTimeWithoutMillis, 0);
120       
121       previousTime = now - millis;
122     }
123     else {
124       sbuf.append(previousTimeWithoutMillis);
125     }
126     
127 
128     
129     if(millis < 100) 
130       sbuf.append('0');
131     if(millis < 10) 
132       sbuf.append('0');
133     
134     sbuf.append(millis);
135     return sbuf;
136   }
137 
138   /**
139      This method does not do anything but return <code>null</code>.
140    */
141   public
142   Date parse(String s, ParsePosition pos) {
143     return null;
144   }  
145 }