AT&T 2.0.19 Code drop, stage 1
[aaf/authz.git] / misc / env / src / main / java / org / onap / aaf / misc / env / util / Chrono.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.misc.env.util;
23
24 import java.security.SecureRandom;
25 import java.text.DateFormat;
26 import java.text.SimpleDateFormat;
27 import java.util.Date;
28 import java.util.GregorianCalendar;
29 import java.util.TimeZone;
30 import java.util.UUID;
31 import java.util.logging.Formatter;
32 import java.util.logging.LogRecord;
33
34 import javax.xml.datatype.DatatypeConfigurationException;
35 import javax.xml.datatype.DatatypeFactory;
36 import javax.xml.datatype.XMLGregorianCalendar;
37
38 public class Chrono {
39     private static final long NUM_100NS_INTERVALS_SINCE_UUID_EPOCH = 0x01b21dd213814000L;
40
41         public final static DateFormat dateFmt, dateOnlyFmt, niceDateFmt, utcFmt,iso8601Fmt;
42         // Give general access to XML DataType Factory, since it's pretty common
43         public static final DatatypeFactory xmlDatatypeFactory;
44         
45         static {
46                 try {
47                         xmlDatatypeFactory = DatatypeFactory.newInstance();
48                 } catch (DatatypeConfigurationException e) {
49                         throw new RuntimeException(e);
50                 }
51                 dateOnlyFmt = new SimpleDateFormat("yyyy-MM-dd");
52                 niceDateFmt = new SimpleDateFormat("yyyy/MM/dd HH:mm zzz");
53                 dateFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
54                 utcFmt =  new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
55                 iso8601Fmt =  new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
56                 utcFmt.setTimeZone(TimeZone.getTimeZone("UTC"));
57         }
58         
59
60         public static class Formatter8601 extends Formatter {
61
62                 @Override
63                 public String format(LogRecord r) {
64                         StringBuilder sb = new StringBuilder();
65                         sb.append(dateFmt.format(new Date(r.getMillis())));
66                         sb.append(' ');
67                         sb.append(r.getThreadID());
68                         sb.append(' ');
69                         sb.append(r.getLevel());
70                         sb.append(": ");
71                         sb.append(r.getMessage());
72                         sb.append('\n');
73                         return sb.toString();
74                 }
75                 
76         }
77         
78         /**
79          * timeStamp
80          * 
81          * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with "now" 
82          * @return
83          */
84         public static XMLGregorianCalendar timeStamp() {
85                 return xmlDatatypeFactory.newXMLGregorianCalendar(new GregorianCalendar());
86         }
87
88         /**
89          * timestamp
90          * 
91          * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with passed in Date 
92          * @param date
93          * @return
94          */
95         public static XMLGregorianCalendar timeStamp(Date date) {
96                 GregorianCalendar gc = new GregorianCalendar();
97                 gc.setTime(date);
98                 return xmlDatatypeFactory.newXMLGregorianCalendar(gc);
99         }
100
101         public static XMLGregorianCalendar timeStamp(GregorianCalendar gc) {
102                 return xmlDatatypeFactory.newXMLGregorianCalendar(gc);
103         }
104
105         public static String utcStamp() {
106                 return utcFmt.format(new Date());
107         }
108
109         public static String utcStamp(Date date) {
110                 if(date==null)return "";
111                 return utcFmt.format(date);
112         }
113
114         public static String utcStamp(GregorianCalendar gc) {
115                 if(gc==null)return "";
116                 return utcFmt.format(gc.getTime());
117         }
118
119         public static String utcStamp(XMLGregorianCalendar xgc) {
120                 if(xgc==null)return "";
121                 return utcFmt.format(xgc.toGregorianCalendar().getTime());
122         }
123
124         public static String dateStamp() {
125                 return dateFmt.format(new Date());
126         }
127
128         public static String dateStamp(GregorianCalendar gc) {
129                 if(gc == null)return "";
130                 return dateFmt.format(gc.getTime());
131         }
132
133         public static String dateStamp(Date date) {
134                 if(date == null)return "";
135                 return dateFmt.format(date);
136         }
137
138         public static String dateStamp(XMLGregorianCalendar xgc) {
139                 if(xgc==null)return "";
140                 return dateFmt.format(xgc.toGregorianCalendar().getTime());
141         }
142
143         /**
144          * JAXB compatible dataTime Stamp
145          * 
146          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.
147          * 
148          * @return
149          */
150         public static String dateTime() {
151                 return dateTime(new GregorianCalendar());
152         }
153
154         /**
155          * JAXB compatible dataTime Stamp
156          * 
157          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.
158          * 
159          * @return
160          */
161         public static String dateTime(Date date) {
162                 GregorianCalendar gc = new GregorianCalendar();
163                 gc.setTime(date);
164                 return dateTime(gc);
165         }
166
167         /**
168          * JAXB compatible dataTime Stamp
169          * 
170          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.
171          * 
172          * @return
173          */
174         public static String dateTime(GregorianCalendar gc) {
175                 if(gc == null)return "";
176                 TimeZone tz = gc.getTimeZone();
177                 int tz1 = (tz.getRawOffset()+tz.getDSTSavings())/0x8CA0;
178                 int tz1abs = Math.abs(tz1);
179                 return String.format("%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d:%02d", 
180                                 gc.get(GregorianCalendar.YEAR),
181                                 gc.get(GregorianCalendar.MONTH)+1,
182                                 gc.get(GregorianCalendar.DAY_OF_MONTH),
183                                 gc.get(GregorianCalendar.HOUR),
184                                 gc.get(GregorianCalendar.MINUTE),
185                                 gc.get(GregorianCalendar.SECOND),
186                                 gc.get(GregorianCalendar.MILLISECOND),
187                                 tz1==tz1abs?'+':'-',
188                                 tz1abs/100,
189                                 ((tz1abs-(tz1abs/100)*100)*6)/10 // Get the "10s", then convert to mins (without losing int place)
190                                 );
191         }
192
193         /**
194          * JAXB compatible dataTime Stamp
195          * 
196          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.
197          * 
198          * @return
199          */
200         public static String dateTime(XMLGregorianCalendar xgc) {
201                 return xgc==null?"":dateTime(xgc.toGregorianCalendar());
202         }
203
204         public static String dateOnlyStamp() {
205                 return dateOnlyFmt.format(new Date());
206         }
207
208         public static String dateOnlyStamp(GregorianCalendar gc) {
209                 return gc == null?"":dateOnlyFmt.format(gc.getTime());
210         }
211
212         public static String dateOnlyStamp(Date date) {
213                 return date == null?"":dateOnlyFmt.format(date);
214         }
215
216         public static String dateOnlyStamp(XMLGregorianCalendar xgc) {
217                 return xgc==null?"":dateOnlyFmt.format(xgc.toGregorianCalendar().getTime());
218         }
219
220         public static String niceDateStamp() {
221                 return niceDateFmt.format(new Date());
222         }
223
224         public static String niceDateStamp(Date date) {
225                 return date==null?"":niceDateFmt.format(date);
226         }
227
228         public static String niceDateStamp(GregorianCalendar gc) {
229                 return gc==null?"":niceDateFmt.format(gc.getTime());
230         }
231
232         public static String niceDateStamp(XMLGregorianCalendar xgc) {
233                 return xgc==null?"":niceDateFmt.format(xgc.toGregorianCalendar().getTime());
234         }
235
236
237         //////////////////////  HELPFUL Strings
238         public static final String BAD_DIR_CHARS_REGEX = "[/:\\;.]";
239         public static final String SPLIT_DIR_REGEX = "/";
240
241         public static long firstMomentOfDay(long utc) {
242                 GregorianCalendar begin = new GregorianCalendar();
243                 begin.setTimeInMillis(utc);
244                 return firstMomentOfDay(begin).getTimeInMillis();
245         }       
246         
247         public static long lastMomentOfDay(long utc) {
248                 GregorianCalendar end = new GregorianCalendar();
249                 end.setTimeInMillis(utc);
250                 return lastMomentOfDay(end).getTimeInMillis();
251         }
252
253         public static GregorianCalendar firstMomentOfDay(GregorianCalendar begin) {
254                 if(begin==null)begin = new GregorianCalendar();
255                 begin.set(GregorianCalendar.HOUR, 0);
256                 begin.set(GregorianCalendar.AM_PM, GregorianCalendar.AM);
257                 begin.set(GregorianCalendar.MINUTE, 0);
258                 begin.set(GregorianCalendar.SECOND, 0);
259                 begin.set(GregorianCalendar.MILLISECOND, 0);
260                 return begin;
261         }       
262
263         public static GregorianCalendar lastMomentOfDay(GregorianCalendar end) {
264                 if(end==null)end = new GregorianCalendar();
265                 end.set(GregorianCalendar.HOUR, 11);
266                 end.set(GregorianCalendar.MINUTE, 59);
267                 end.set(GregorianCalendar.SECOND, 59);
268                 end.set(GregorianCalendar.MILLISECOND, 999);
269                 end.set(GregorianCalendar.AM_PM, GregorianCalendar.PM);
270                 return end;
271         }
272
273         // UUID needs to be converted from UUID Epoch
274         public static final Date uuidToDate(UUID id) {
275                 return new Date((id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000);
276         }
277
278         public static final long uuidToUnix(UUID id) {
279                 return (id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000;
280         }
281
282         public static float millisFromNanos(long start, long end) {
283                 return (end - start) / 1000000f;
284         }
285
286
287         private static long sequence = new SecureRandom().nextInt();
288         private static synchronized long sequence() {
289                 return ++sequence;
290         }
291         
292         public static final UUID dateToUUID(Date origTime) {
293                 return dateToUUID(origTime.getTime());
294         }
295         
296         public static final UUID dateToUUID(long origTime) {
297         /*
298          * From Cassandra : http://wiki.apache.org/cassandra/FAQ
299           Magic number obtained from #cassandra's thobbs, who
300           claims to have stolen it from a Python library.
301         */
302         long time = origTime * 10000 + NUM_100NS_INTERVALS_SINCE_UUID_EPOCH;
303         long timeLow = time &       0xffffffffL;
304         long timeMid = time &   0xffff00000000L;
305         long timeHi = time & 0xfff000000000000L;
306         long upperLong = (timeLow << 32) | (timeMid >> 16) | (1 << 12) | (timeHi >> 48) ;
307         return new java.util.UUID(upperLong, (0xC000000000000000L | sequence()));
308         }
309
310 }