1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright (C) 2016 The Android Open Source Project
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Licensed under the Apache License, Version 2.0 (the "License");
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * you may not use this file except in compliance with the License.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * You may obtain a copy of the License at
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *      http://www.apache.org/licenses/LICENSE-2.0
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Unless required by applicable law or agreed to in writing, software
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * distributed under the License is distributed on an "AS IS" BASIS,
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * See the License for the specific language governing permissions and
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * limitations under the License.
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpackage androidx.room.util;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport android.util.Log;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport androidx.annotation.Nullable;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport androidx.annotation.RestrictTo;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport java.util.ArrayList;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport java.util.List;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport java.util.StringTokenizer;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/**
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @hide
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * String utilities for Room
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic class StringUtil {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    @SuppressWarnings("unused")
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public static final String[] EMPTY_STRING_ARRAY = new String[0];
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Returns a new StringBuilder to be used while producing SQL queries.
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @return A new or recycled StringBuilder
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public static StringBuilder newStringBuilder() {
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // TODO pool:
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return new StringBuilder();
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Adds bind variable placeholders (?) to the given string. Each placeholder is separated
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * by a comma.
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param builder The StringBuilder for the query
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param count Number of placeholders
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public static void appendPlaceholders(StringBuilder builder, int count) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < count; i++) {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            builder.append("?");
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (i < count - 1) {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                builder.append(",");
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Splits a comma separated list of integers to integer list.
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * <p>
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If an input is malformed, it is omitted from the result.
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param input Comma separated list of integers.
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @return A List containing the integers or null if the input is null.
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    @Nullable
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public static List<Integer> splitToIntList(@Nullable String input) {
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (input == null) {
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return null;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        List<Integer> result = new ArrayList<>();
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        StringTokenizer tokenizer = new StringTokenizer(input, ",");
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        while (tokenizer.hasMoreElements()) {
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            final String item = tokenizer.nextToken();
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            try {
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                result.add(Integer.parseInt(item));
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            } catch (NumberFormatException ex) {
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                Log.e("ROOM", "Malformed integer list", ex);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return result;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Joins the given list of integers into a comma separated list.
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param input The list of integers.
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @return Comma separated string composed of integers in the list. If the list is null, return
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * value is null.
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    @Nullable
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public static String joinIntoString(@Nullable List<Integer> input) {
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (input == null) {
99            return null;
100        }
101
102        final int size = input.size();
103        if (size == 0) {
104            return "";
105        }
106        StringBuilder sb = new StringBuilder();
107        for (int i = 0; i < size; i++) {
108            sb.append(Integer.toString(input.get(i)));
109            if (i < size - 1) {
110                sb.append(",");
111            }
112        }
113        return sb.toString();
114    }
115
116    private StringUtil() {
117    }
118}
119