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