1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.bugreport.util;
18 
19 import java.util.Calendar;
20 import java.util.GregorianCalendar;
21 import java.util.TimeZone;
22 import java.util.regex.Matcher;
23 
24 /**
25  * Random collection of stuff. Mostly for parsing.
26  */
27 public class Utils {
28     /**
29      * UTC Time Zone.
30      */
31     public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
32 
33     /**
34      * Regex for a date/time, without milliseconds.
35      */
36     public static final String DATE_TIME_MS_PATTERN
37             = "(?:(\\d\\d\\d\\d)-)?(\\d\\d)-(\\d\\d)\\s+(\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d\\d\\d)";
38 
39     /**
40      * Regex for a date/time, without milliseconds.
41      */
42     public static final String DATE_TIME_PATTERN
43             = "(?:(\\d\\d\\d\\d)-)?(\\d\\d)-(\\d\\d)\\s+(\\d\\d):(\\d\\d):(\\d\\d)";
44 
45     /**
46      * Returns whether text matches the matcher.  The matcher can be used afterwards
47      * to get the groups.
48      */
matches(Matcher matcher, String text)49     public static boolean matches(Matcher matcher, String text) {
50         matcher.reset(text);
51         return matcher.matches();
52     }
53 
54     /**
55      * Returns the matcher if it matches the text, null otherwise.
56      */
match(Matcher matcher, String text)57     public static Matcher match(Matcher matcher, String text) {
58         matcher.reset(text);
59         if (matcher.matches()) {
60             return matcher;
61         } else {
62             return null;
63         }
64     }
65 
66     /**
67      * Gets a group from the matcher, and if it was set returns that
68      * value as an int.  Otherwise returns def.
69      */
getInt(Matcher matcher, int group, int def)70     public static int getInt(Matcher matcher, int group, int def) {
71         final String str = matcher.group(group);
72         if (str == null || str.length() == 0) {
73             return def;
74         } else {
75             return Integer.parseInt(str);
76         }
77     }
78 
79     /**
80      * Gets the date time groups from the matcher and returns a GregorianCalendar.
81      * The year is optional.
82      *
83      * @param Matcher a matcher
84      * @param startGroup the index of the first group to use
85      * @param milliseconds whether to expect the millisecond group.
86      *
87      * @see #DATE_TIME_MS_PATTERN
88      * @see #DATE_TIME_PATTERN
89      */
parseCalendar(Matcher matcher, int startGroup, boolean milliseconds)90     public static GregorianCalendar parseCalendar(Matcher matcher, int startGroup,
91             boolean milliseconds) {
92         final GregorianCalendar result = new GregorianCalendar(UTC);
93 
94         if (matcher.group(startGroup+0) != null) {
95             result.set(Calendar.YEAR, Integer.parseInt(matcher.group(startGroup + 0)));
96         }
97         result.set(Calendar.MONTH, Integer.parseInt(matcher.group(startGroup + 1)));
98         result.set(Calendar.DAY_OF_MONTH, Integer.parseInt(matcher.group(startGroup + 2)));
99         result.set(Calendar.HOUR_OF_DAY, Integer.parseInt(matcher.group(startGroup + 3)));
100         result.set(Calendar.MINUTE, Integer.parseInt(matcher.group(startGroup + 4)));
101         result.set(Calendar.SECOND, Integer.parseInt(matcher.group(startGroup + 5)));
102         if (milliseconds) {
103             result.set(Calendar.MILLISECOND, Integer.parseInt(matcher.group(startGroup + 6)));
104         }
105 
106         return result;
107     }
108 }
109