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