ebae19b425afd4557302b4dabae36c794476b8e5
[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,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                 iso8601Fmt =  new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");\r
56                 utcFmt.setTimeZone(TimeZone.getTimeZone("UTC"));\r
57         }\r
58         \r
59 \r
60         public static class Formatter8601 extends Formatter {\r
61 \r
62                 @Override\r
63                 public String format(LogRecord r) {\r
64                         StringBuilder sb = new StringBuilder();\r
65                         sb.append(dateFmt.format(new Date(r.getMillis())));\r
66                         sb.append(' ');\r
67                         sb.append(r.getThreadID());\r
68                         sb.append(' ');\r
69                         sb.append(r.getLevel());\r
70                         sb.append(": ");\r
71                         sb.append(r.getMessage());\r
72                         sb.append('\n');\r
73                         return sb.toString();\r
74                 }\r
75                 \r
76         }\r
77         \r
78         /**\r
79          * timeStamp\r
80          * \r
81          * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with "now" \r
82          * @return\r
83          */\r
84         public static XMLGregorianCalendar timeStamp() {\r
85                 return xmlDatatypeFactory.newXMLGregorianCalendar(new GregorianCalendar());\r
86         }\r
87 \r
88         /**\r
89          * timestamp\r
90          * \r
91          * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with passed in Date \r
92          * @param date\r
93          * @return\r
94          */\r
95         public static XMLGregorianCalendar timeStamp(Date date) {\r
96                 GregorianCalendar gc = new GregorianCalendar();\r
97                 gc.setTime(date);\r
98                 return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
99         }\r
100 \r
101         public static XMLGregorianCalendar timeStamp(GregorianCalendar gc) {\r
102                 return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
103         }\r
104 \r
105         public static String utcStamp() {\r
106                 return utcFmt.format(new Date());\r
107         }\r
108 \r
109         public static String utcStamp(Date date) {\r
110                 if(date==null)return "";\r
111                 return utcFmt.format(date);\r
112         }\r
113 \r
114         public static String utcStamp(GregorianCalendar gc) {\r
115                 if(gc==null)return "";\r
116                 return utcFmt.format(gc.getTime());\r
117         }\r
118 \r
119         public static String utcStamp(XMLGregorianCalendar xgc) {\r
120                 if(xgc==null)return "";\r
121                 return utcFmt.format(xgc.toGregorianCalendar().getTime());\r
122         }\r
123 \r
124         public static String dateStamp() {\r
125                 return dateFmt.format(new Date());\r
126         }\r
127 \r
128         public static String dateStamp(GregorianCalendar gc) {\r
129                 if(gc == null)return "";\r
130                 return dateFmt.format(gc.getTime());\r
131         }\r
132 \r
133         public static String dateStamp(Date date) {\r
134                 if(date == null)return "";\r
135                 return dateFmt.format(date);\r
136         }\r
137 \r
138         public static String dateStamp(XMLGregorianCalendar xgc) {\r
139                 if(xgc==null)return "";\r
140                 return dateFmt.format(xgc.toGregorianCalendar().getTime());\r
141         }\r
142 \r
143         /**\r
144          * JAXB compatible dataTime Stamp\r
145          * \r
146          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
147          * \r
148          * @return\r
149          */\r
150         public static String dateTime() {\r
151                 return dateTime(new GregorianCalendar());\r
152         }\r
153 \r
154         /**\r
155          * JAXB compatible dataTime Stamp\r
156          * \r
157          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
158          * \r
159          * @return\r
160          */\r
161         public static String dateTime(Date date) {\r
162                 GregorianCalendar gc = new GregorianCalendar();\r
163                 gc.setTime(date);\r
164                 return dateTime(gc);\r
165         }\r
166 \r
167         /**\r
168          * JAXB compatible dataTime Stamp\r
169          * \r
170          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
171          * \r
172          * @return\r
173          */\r
174         public static String dateTime(GregorianCalendar gc) {\r
175                 if(gc == null)return "";\r
176                 TimeZone tz = gc.getTimeZone();\r
177                 int tz1 = (tz.getRawOffset()+tz.getDSTSavings())/0x8CA0;\r
178                 int tz1abs = Math.abs(tz1);\r
179                 return String.format("%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d:%02d", \r
180                                 gc.get(GregorianCalendar.YEAR),\r
181                                 gc.get(GregorianCalendar.MONTH)+1,\r
182                                 gc.get(GregorianCalendar.DAY_OF_MONTH),\r
183                                 gc.get(GregorianCalendar.HOUR),\r
184                                 gc.get(GregorianCalendar.MINUTE),\r
185                                 gc.get(GregorianCalendar.SECOND),\r
186                                 gc.get(GregorianCalendar.MILLISECOND),\r
187                                 tz1==tz1abs?'+':'-',\r
188                                 tz1abs/100,\r
189                                 ((tz1abs-(tz1abs/100)*100)*6)/10 // Get the "10s", then convert to mins (without losing int place)\r
190                                 );\r
191         }\r
192 \r
193         /**\r
194          * JAXB compatible dataTime Stamp\r
195          * \r
196          * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
197          * \r
198          * @return\r
199          */\r
200         public static String dateTime(XMLGregorianCalendar xgc) {\r
201                 return xgc==null?"":dateTime(xgc.toGregorianCalendar());\r
202         }\r
203 \r
204         public static String dateOnlyStamp() {\r
205                 return dateOnlyFmt.format(new Date());\r
206         }\r
207 \r
208         public static String dateOnlyStamp(GregorianCalendar gc) {\r
209                 return gc == null?"":dateOnlyFmt.format(gc.getTime());\r
210         }\r
211 \r
212         public static String dateOnlyStamp(Date date) {\r
213                 return date == null?"":dateOnlyFmt.format(date);\r
214         }\r
215 \r
216         public static String dateOnlyStamp(XMLGregorianCalendar xgc) {\r
217                 return xgc==null?"":dateOnlyFmt.format(xgc.toGregorianCalendar().getTime());\r
218         }\r
219 \r
220         public static String niceDateStamp() {\r
221                 return niceDateFmt.format(new Date());\r
222         }\r
223 \r
224         public static String niceDateStamp(Date date) {\r
225                 return date==null?"":niceDateFmt.format(date);\r
226         }\r
227 \r
228         public static String niceDateStamp(GregorianCalendar gc) {\r
229                 return gc==null?"":niceDateFmt.format(gc.getTime());\r
230         }\r
231 \r
232         public static String niceDateStamp(XMLGregorianCalendar xgc) {\r
233                 return xgc==null?"":niceDateFmt.format(xgc.toGregorianCalendar().getTime());\r
234         }\r
235 \r
236 \r
237         //////////////////////  HELPFUL Strings\r
238         public static final String BAD_DIR_CHARS_REGEX = "[/:\\;.]";\r
239         public static final String SPLIT_DIR_REGEX = "/";\r
240 \r
241         public static long firstMomentOfDay(long utc) {\r
242                 GregorianCalendar begin = new GregorianCalendar();\r
243                 begin.setTimeInMillis(utc);\r
244                 return firstMomentOfDay(begin).getTimeInMillis();\r
245         }       \r
246         \r
247         public static long lastMomentOfDay(long utc) {\r
248                 GregorianCalendar end = new GregorianCalendar();\r
249                 end.setTimeInMillis(utc);\r
250                 return lastMomentOfDay(end).getTimeInMillis();\r
251         }\r
252 \r
253         public static GregorianCalendar firstMomentOfDay(GregorianCalendar begin) {\r
254                 if(begin==null)begin = new GregorianCalendar();\r
255                 begin.set(GregorianCalendar.HOUR, 0);\r
256                 begin.set(GregorianCalendar.AM_PM, GregorianCalendar.AM);\r
257                 begin.set(GregorianCalendar.MINUTE, 0);\r
258                 begin.set(GregorianCalendar.SECOND, 0);\r
259                 begin.set(GregorianCalendar.MILLISECOND, 0);\r
260                 return begin;\r
261         }       \r
262 \r
263         public static GregorianCalendar lastMomentOfDay(GregorianCalendar end) {\r
264                 if(end==null)end = new GregorianCalendar();\r
265                 end.set(GregorianCalendar.HOUR, 11);\r
266                 end.set(GregorianCalendar.MINUTE, 59);\r
267                 end.set(GregorianCalendar.SECOND, 59);\r
268                 end.set(GregorianCalendar.MILLISECOND, 999);\r
269                 end.set(GregorianCalendar.AM_PM, GregorianCalendar.PM);\r
270                 return end;\r
271         }\r
272 \r
273         // UUID needs to be converted from UUID Epoch\r
274         public static final Date uuidToDate(UUID id) {\r
275                 return new Date((id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000);\r
276         }\r
277 \r
278         public static final long uuidToUnix(UUID id) {\r
279                 return (id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000;\r
280         }\r
281 \r
282         public static float millisFromNanos(long start, long end) {\r
283                 return (end - start) / 1000000f;\r
284         }\r
285 \r
286 \r
287         private static long sequence = new SecureRandom().nextInt();\r
288         private static synchronized long sequence() {\r
289                 return ++sequence;\r
290         }\r
291         \r
292         public static final UUID dateToUUID(Date origTime) {\r
293                 return dateToUUID(origTime.getTime());\r
294         }\r
295         \r
296         public static final UUID dateToUUID(long origTime) {\r
297         /*\r
298          * From Cassandra : http://wiki.apache.org/cassandra/FAQ\r
299           Magic number obtained from #cassandra's thobbs, who\r
300           claims to have stolen it from a Python library.\r
301         */\r
302         long time = origTime * 10000 + NUM_100NS_INTERVALS_SINCE_UUID_EPOCH;\r
303         long timeLow = time &       0xffffffffL;\r
304         long timeMid = time &   0xffff00000000L;\r
305         long timeHi = time & 0xfff000000000000L;\r
306         long upperLong = (timeLow << 32) | (timeMid >> 16) | (1 << 12) | (timeHi >> 48) ;\r
307         return new java.util.UUID(upperLong, (0xC000000000000000L | sequence()));\r
308         }\r
309 \r
310 }\r