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 package com.android.compatibility.common.util;
17 
18 import java.io.IOException;
19 import java.lang.AutoCloseable;
20 import java.util.Arrays;
21 import java.util.List;
22 
23 public abstract class InfoStore implements AutoCloseable {
24 
25     protected static final int MAX_STRING_LENGTH = 1000;
26     protected static final int MAX_ARRAY_LENGTH = 1000;
27     protected static final int MAX_LIST_LENGTH = 1000;
28 
29     /**
30      * Opens the file for storage and creates the writer.
31      */
open()32     abstract void open() throws IOException;
33 
34     /**
35      * Closes the writer.
36      */
37     @Override
close()38     public abstract void close() throws Exception;
39 
40     /**
41      * Start a new group of result.
42      */
startGroup()43     abstract void startGroup() throws IOException;
44 
45     /**
46      * Start a new group of result with specified name.
47      */
startGroup(String name)48     abstract void startGroup(String name) throws IOException;
49 
50     /**
51      * Complete adding result to the last started group.
52      */
endGroup()53     abstract void endGroup() throws IOException;
54 
55     /**
56      * Start a new array of result.
57      */
startArray()58     abstract void startArray() throws IOException;
59 
60     /**
61      * Start a new array of result with specified name.
62      */
startArray(String name)63     abstract void startArray(String name) throws IOException;
64 
65     /**
66      * Complete adding result to the last started array.
67      */
endArray()68     abstract void endArray() throws IOException;
69 
70     /**
71      * Adds a int value to the InfoStore
72      */
addResult(String name, int value)73     abstract void addResult(String name, int value) throws IOException;
74 
75     /**
76      * Adds a long value to the InfoStore
77      */
addResult(String name, long value)78     abstract void addResult(String name, long value) throws IOException;
79 
80     /**
81      * Adds a float value to the InfoStore
82      */
addResult(String name, float value)83     abstract void addResult(String name, float value) throws IOException;
84 
85     /**
86      * Adds a double value to the InfoStore
87      */
addResult(String name, double value)88     abstract void addResult(String name, double value) throws IOException;
89 
90     /**
91      * Adds a boolean value to the InfoStore
92      */
addResult(String name, boolean value)93     abstract void addResult(String name, boolean value) throws IOException;
94 
95     /**
96      * Adds a String value to the InfoStore
97      */
addResult(String name, String value)98     abstract void addResult(String name, String value) throws IOException;
99 
100     /**
101      * Adds a int array to the InfoStore
102      */
addArrayResult(String name, int[] array)103     abstract void addArrayResult(String name, int[] array) throws IOException;
104 
105     /**
106      * Adds a long array to the InfoStore
107      */
addArrayResult(String name, long[] array)108     abstract void addArrayResult(String name, long[] array) throws IOException;
109 
110     /**
111      * Adds a float array to the InfoStore
112      */
addArrayResult(String name, float[] array)113     abstract void addArrayResult(String name, float[] array) throws IOException;
114 
115     /**
116      * Adds a double array to the InfoStore
117      */
addArrayResult(String name, double[] array)118     abstract void addArrayResult(String name, double[] array) throws IOException;
119 
120     /**
121      * Adds a boolean array to the InfoStore
122      */
addArrayResult(String name, boolean[] array)123     abstract void addArrayResult(String name, boolean[] array) throws IOException;
124 
125     /**
126      * Adds a List of String to the InfoStore
127      */
addListResult(String name, List<String> list)128     abstract void addListResult(String name, List<String> list) throws IOException;
129 
checkArray(int[] values)130     protected static int[] checkArray(int[] values) {
131         if (values.length > MAX_ARRAY_LENGTH) {
132             return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
133         } else {
134             return values;
135         }
136     }
137 
checkArray(long[] values)138     protected static long[] checkArray(long[] values) {
139         if (values.length > MAX_ARRAY_LENGTH) {
140             return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
141         } else {
142             return values;
143         }
144     }
145 
checkArray(float[] values)146     protected static float[] checkArray(float[] values) {
147         if (values.length > MAX_ARRAY_LENGTH) {
148             return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
149         } else {
150             return values;
151         }
152     }
153 
checkArray(double[] values)154     protected static double[] checkArray(double[] values) {
155         if (values.length > MAX_ARRAY_LENGTH) {
156             return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
157         } else {
158             return values;
159         }
160     }
161 
checkArray(boolean[] values)162     protected static boolean[] checkArray(boolean[] values) {
163         if (values.length > MAX_ARRAY_LENGTH) {
164             return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
165         } else {
166             return values;
167         }
168     }
169 
checkStringList(List<String> list)170     protected static List<String> checkStringList(List<String> list) {
171         if (list.size() > MAX_LIST_LENGTH) {
172             return list.subList(0, MAX_LIST_LENGTH);
173         }
174         return list;
175     }
176 
checkString(String value)177     protected static String checkString(String value) {
178         if (value == null || value.isEmpty()) {
179             return "";
180         }
181         if (value.length() > MAX_STRING_LENGTH) {
182             return value.substring(0, MAX_STRING_LENGTH);
183         }
184         return value;
185     }
186 
checkName(String value)187     protected static String checkName(String value) {
188         if (value == null || value.isEmpty()) {
189             throw new NullPointerException();
190         }
191         return value;
192     }
193 
isDoubleNaNOrInfinite(Double value)194     protected static boolean isDoubleNaNOrInfinite(Double value) {
195         return Double.isNaN(value) || Double.isInfinite(value);
196     }
197 }
198