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