Mass removal of all Tabs (Style Warnings)
[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