1d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/* 2d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 3d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 4d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * you may not use this file except in compliance with the License. 6d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * You may obtain a copy of the License at 7d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 8d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 10d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * See the License for the specific language governing permissions and 14d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * limitations under the License. 15d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 16d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 17d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypackage com.android.internal.util; 18d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 19c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.annotation.IntRange; 20c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.annotation.NonNull; 21c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.text.TextUtils; 22c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann 2391838ded36131525312739c0929913b215519c2aRuben Brunkimport java.util.Collection; 2491838ded36131525312739c0929913b215519c2aRuben Brunk 25d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/** 26d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Simple static methods to be called at the start of your own methods to verify 27d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * correct arguments and state. 28d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 29d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypublic class Preconditions { 30d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 31620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey public static void checkArgument(boolean expression) { 32620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey if (!expression) { 33620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey throw new IllegalArgumentException(); 34620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey } 35620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey } 36620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey 37d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey /** 38d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * Ensures that an expression checking an argument is true. 39d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * 40d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * @param expression the expression to check 41d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * @param errorMessage the exception message to use if the check fails; will 42d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * be converted to a string using {@link String#valueOf(Object)} 43d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann * @throws IllegalArgumentException if {@code expression} is false 44d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann */ 45d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann public static void checkArgument(boolean expression, final Object errorMessage) { 46d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann if (!expression) { 47d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann throw new IllegalArgumentException(String.valueOf(errorMessage)); 48d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann } 49d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann } 50d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann 51d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann /** 52cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * Ensures that an expression checking an argument is true. 53cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * 54cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * @param expression the expression to check 55cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * @param messageTemplate a printf-style message template to use if the check fails; will 56cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * be converted to a string using {@link String#format(String, Object...)} 57cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * @param messageArgs arguments for {@code messageTemplate} 58cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla * @throws IllegalArgumentException if {@code expression} is false 59cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla */ 60cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla public static void checkArgument(boolean expression, 61cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla final String messageTemplate, 62cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla final Object... messageArgs) { 63cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla if (!expression) { 64cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla throw new IllegalArgumentException(String.format(messageTemplate, messageArgs)); 65cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla } 66cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla } 67cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla 68cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla /** 69c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * Ensures that an string reference passed as a parameter to the calling 70c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * method is not empty. 71c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * 72c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * @param string an string reference 73c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * @return the string reference that was validated 74c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * @throws IllegalArgumentException if {@code string} is empty 75c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann */ 769dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string) { 7776d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann if (TextUtils.isEmpty(string)) { 7876d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann throw new IllegalArgumentException(); 7976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann } 8076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann return string; 8176d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann } 8276d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann 8376d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann /** 8476d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * Ensures that an string reference passed as a parameter to the calling 8576d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * method is not empty. 8676d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * 8776d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * @param string an string reference 8876d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * @param errorMessage the exception message to use if the check fails; will 8976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * be converted to a string using {@link String#valueOf(Object)} 9076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * @return the string reference that was validated 9176d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann * @throws IllegalArgumentException if {@code string} is empty 9276d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann */ 939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string, 94c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann final Object errorMessage) { 95c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann if (TextUtils.isEmpty(string)) { 96c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann throw new IllegalArgumentException(String.valueOf(errorMessage)); 97c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann } 98c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann return string; 99c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann } 100c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann 101c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann /** 102d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Ensures that an object reference passed as a parameter to the calling 103d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * method is not null. 104d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 105d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @param reference an object reference 106d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @return the non-null reference that was validated 107d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @throws NullPointerException if {@code reference} is null 108d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 109c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann public static @NonNull <T> T checkNotNull(final T reference) { 110d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey if (reference == null) { 111d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey throw new NullPointerException(); 112d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 113d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey return reference; 114d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 115d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 116d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey /** 117d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Ensures that an object reference passed as a parameter to the calling 118d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * method is not null. 119d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 120d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @param reference an object reference 121d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @param errorMessage the exception message to use if the check fails; will 122d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * be converted to a string using {@link String#valueOf(Object)} 123d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @return the non-null reference that was validated 124d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @throws NullPointerException if {@code reference} is null 125d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 126c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann public static @NonNull <T> T checkNotNull(final T reference, final Object errorMessage) { 127d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey if (reference == null) { 128d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey throw new NullPointerException(String.valueOf(errorMessage)); 129d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 130d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey return reference; 131d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 132d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 133c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey /** 134adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * Ensures that an object reference passed as a parameter to the calling 135adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * method is not null. 136adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * 137adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * @param reference an object reference 138adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * @param messageTemplate a printf-style message template to use if the check fails; will 139adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * be converted to a string using {@link String#format(String, Object...)} 140adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * @param messageArgs arguments for {@code messageTemplate} 141adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * @return the non-null reference that was validated 142adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla * @throws NullPointerException if {@code reference} is null 143adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla */ 144adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla public static @NonNull <T> T checkNotNull(final T reference, 145adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla final String messageTemplate, 146adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla final Object... messageArgs) { 147adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla if (reference == null) { 148adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla throw new NullPointerException(String.format(messageTemplate, messageArgs)); 149adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla } 150adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla return reference; 151adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla } 152adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla 153adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla /** 154c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey * Ensures the truth of an expression involving the state of the calling 155c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey * instance, but not involving any parameters to the calling method. 156c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey * 157c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey * @param expression a boolean expression 1581a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * @param message exception message 159c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey * @throws IllegalStateException if {@code expression} is false 160c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey */ 1611a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki public static void checkState(final boolean expression, String message) { 162c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey if (!expression) { 1631a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki throw new IllegalStateException(message); 164c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 165c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 166ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey 167ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey /** 1681a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * Ensures the truth of an expression involving the state of the calling 1691a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * instance, but not involving any parameters to the calling method. 1701a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * 1711a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * @param expression a boolean expression 1721a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki * @throws IllegalStateException if {@code expression} is false 1731a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki */ 1741a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki public static void checkState(final boolean expression) { 1751a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki checkState(expression, null); 1761a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki } 1771a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki 1781a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki /** 179ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey * Check the requested flags, throwing if any requested flags are outside 180ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey * the allowed set. 1819dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 1829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @return the validated requested flags. 183ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey */ 1849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static int checkFlagsArgument(final int requestedFlags, final int allowedFlags) { 185ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey if ((requestedFlags & allowedFlags) != requestedFlags) { 186ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey throw new IllegalArgumentException("Requested flags 0x" 187ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey + Integer.toHexString(requestedFlags) + ", but only 0x" 188ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey + Integer.toHexString(allowedFlags) + " are allowed"); 189ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey } 1909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 1919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return requestedFlags; 192ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey } 193b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 194b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 195b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that that the argument numeric value is non-negative. 196b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 197b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a numeric int value 198b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param errorMessage the exception message to use if the check fails 199b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated numeric value 200b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if {@code value} was negative 201b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 202c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann public static @IntRange(from = 0) int checkArgumentNonnegative(final int value, 203c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann final String errorMessage) { 204b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (value < 0) { 205b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(errorMessage); 206b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 207b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 208b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 209b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 210b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 211b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 212b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that that the argument numeric value is non-negative. 213b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 2149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param value a numeric int value 2159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 2169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @return the validated numeric value 2179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @throws IllegalArgumentException if {@code value} was negative 2189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 2199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static @IntRange(from = 0) int checkArgumentNonnegative(final int value) { 2209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann if (value < 0) { 2219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann throw new IllegalArgumentException(); 2229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 2239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 2249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return value; 2259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 2269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 2279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann /** 2289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Ensures that that the argument numeric value is non-negative. 2299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 230b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a numeric long value 2314723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann * @return the validated numeric value 2324723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann * @throws IllegalArgumentException if {@code value} was negative 2334723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann */ 2344723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann public static long checkArgumentNonnegative(final long value) { 2354723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann if (value < 0) { 2364723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann throw new IllegalArgumentException(); 2374723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann } 2384723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann 2394723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann return value; 2404723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann } 2414723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann 2424723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann /** 2434723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann * Ensures that that the argument numeric value is non-negative. 2444723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann * 2454723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann * @param value a numeric long value 246b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param errorMessage the exception message to use if the check fails 247b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated numeric value 248b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if {@code value} was negative 249b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 250b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static long checkArgumentNonnegative(final long value, final String errorMessage) { 251b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (value < 0) { 252b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(errorMessage); 253b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 254b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 255b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 256b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 257b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 258b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 259b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that that the argument numeric value is positive. 260b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 261b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a numeric int value 262b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param errorMessage the exception message to use if the check fails 263b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated numeric value 264b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if {@code value} was not positive 265b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 266b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static int checkArgumentPositive(final int value, final String errorMessage) { 267b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (value <= 0) { 268b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(errorMessage); 269b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 270b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 271b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 272b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 273b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 274b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 275b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that the argument floating point value is a finite number. 276b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 277b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>A finite number is defined to be both representable (that is, not NaN) and 278b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * not infinite (that is neither positive or negative infinity).</p> 279b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 280b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a floating point value 281b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param valueName the name of the argument to use if the check fails 282b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 283b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated floating point value 284b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 285b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if {@code value} was not finite 286b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 287b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static float checkArgumentFinite(final float value, final String valueName) { 288b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (Float.isNaN(value)) { 289b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(valueName + " must not be NaN"); 290b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } else if (Float.isInfinite(value)) { 291b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(valueName + " must not be infinite"); 292b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 293b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 294b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 295b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 296b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 297b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 298b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that the argument floating point value is within the inclusive range. 299b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 300b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>While this can be used to range check against +/- infinity, note that all NaN numbers 301b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * will always be out of range.</p> 302b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 303b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a floating point value 304b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param lower the lower endpoint of the inclusive range 305b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param upper the upper endpoint of the inclusive range 306b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param valueName the name of the argument to use if the check fails 307b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 308b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated floating point value 309b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 310b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if {@code value} was not within the range 311b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 312b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static float checkArgumentInRange(float value, float lower, float upper, 313b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String valueName) { 314b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (Float.isNaN(value)) { 315b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(valueName + " must not be NaN"); 316b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } else if (value < lower) { 317b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException( 318b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String.format( 319b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin "%s is out of range of [%f, %f] (too low)", valueName, lower, upper)); 320b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } else if (value > upper) { 321b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException( 322b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String.format( 323b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin "%s is out of range of [%f, %f] (too high)", valueName, lower, upper)); 324b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 325b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 326b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 327b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 328b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 329b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 33097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * Ensures that the argument int value is within the inclusive range. 33197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * 33297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @param value a int value 33397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @param lower the lower endpoint of the inclusive range 33497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @param upper the upper endpoint of the inclusive range 33597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @param valueName the name of the argument to use if the check fails 33697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * 33797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @return the validated int value 33897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * 33997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @throws IllegalArgumentException if {@code value} was not within the range 34097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh */ 34197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh public static int checkArgumentInRange(int value, int lower, int upper, 34297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh String valueName) { 34397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh if (value < lower) { 34497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh throw new IllegalArgumentException( 34597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh String.format( 34697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh "%s is out of range of [%d, %d] (too low)", valueName, lower, upper)); 34797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh } else if (value > upper) { 34897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh throw new IllegalArgumentException( 34997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh String.format( 35097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh "%s is out of range of [%d, %d] (too high)", valueName, lower, upper)); 35197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh } 35297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh 35397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh return value; 35497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh } 35597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh 35697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh /** 3572dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * Ensures that the argument long value is within the inclusive range. 3582dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * 3592dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @param value a long value 3602dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @param lower the lower endpoint of the inclusive range 3612dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @param upper the upper endpoint of the inclusive range 3622dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @param valueName the name of the argument to use if the check fails 3632dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * 3642dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @return the validated long value 3652dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * 3662dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono * @throws IllegalArgumentException if {@code value} was not within the range 3672dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono */ 3682dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono public static long checkArgumentInRange(long value, long lower, long upper, 3692dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono String valueName) { 3702dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono if (value < lower) { 3712dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono throw new IllegalArgumentException( 3722dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono String.format( 3732dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono "%s is out of range of [%d, %d] (too low)", valueName, lower, upper)); 3742dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono } else if (value > upper) { 3752dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono throw new IllegalArgumentException( 3762dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono String.format( 3772dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono "%s is out of range of [%d, %d] (too high)", valueName, lower, upper)); 3782dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono } 3792dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono 3802dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono return value; 3812dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono } 3822dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono 3832dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono /** 38491838ded36131525312739c0929913b215519c2aRuben Brunk * Ensures that the array is not {@code null}, and none of its elements are {@code null}. 385b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 386b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value an array of boxed objects 387b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param valueName the name of the argument to use if the check fails 388b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 389b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated array 390b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 391b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws NullPointerException if the {@code value} or any of its elements were {@code null} 392b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 393b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static <T> T[] checkArrayElementsNotNull(final T[] value, final String valueName) { 394b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (value == null) { 395b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new NullPointerException(valueName + " must not be null"); 396b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 397b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 398b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin for (int i = 0; i < value.length; ++i) { 399b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (value[i] == null) { 400b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new NullPointerException( 401b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String.format("%s[%d] must not be null", valueName, i)); 402b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 403b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 404b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 405b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 406b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 407b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 408b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 40991838ded36131525312739c0929913b215519c2aRuben Brunk * Ensures that the {@link Collection} is not {@code null}, and none of its elements are 41091838ded36131525312739c0929913b215519c2aRuben Brunk * {@code null}. 41191838ded36131525312739c0929913b215519c2aRuben Brunk * 41291838ded36131525312739c0929913b215519c2aRuben Brunk * @param value a {@link Collection} of boxed objects 41391838ded36131525312739c0929913b215519c2aRuben Brunk * @param valueName the name of the argument to use if the check fails 41491838ded36131525312739c0929913b215519c2aRuben Brunk * 41591838ded36131525312739c0929913b215519c2aRuben Brunk * @return the validated {@link Collection} 41691838ded36131525312739c0929913b215519c2aRuben Brunk * 41791838ded36131525312739c0929913b215519c2aRuben Brunk * @throws NullPointerException if the {@code value} or any of its elements were {@code null} 41891838ded36131525312739c0929913b215519c2aRuben Brunk */ 41976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann public static @NonNull <C extends Collection<T>, T> C checkCollectionElementsNotNull( 42076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann final C value, final String valueName) { 42191838ded36131525312739c0929913b215519c2aRuben Brunk if (value == null) { 42291838ded36131525312739c0929913b215519c2aRuben Brunk throw new NullPointerException(valueName + " must not be null"); 42391838ded36131525312739c0929913b215519c2aRuben Brunk } 42491838ded36131525312739c0929913b215519c2aRuben Brunk 42591838ded36131525312739c0929913b215519c2aRuben Brunk long ctr = 0; 42691838ded36131525312739c0929913b215519c2aRuben Brunk for (T elem : value) { 42791838ded36131525312739c0929913b215519c2aRuben Brunk if (elem == null) { 42891838ded36131525312739c0929913b215519c2aRuben Brunk throw new NullPointerException( 42991838ded36131525312739c0929913b215519c2aRuben Brunk String.format("%s[%d] must not be null", valueName, ctr)); 43091838ded36131525312739c0929913b215519c2aRuben Brunk } 43191838ded36131525312739c0929913b215519c2aRuben Brunk ++ctr; 43291838ded36131525312739c0929913b215519c2aRuben Brunk } 43391838ded36131525312739c0929913b215519c2aRuben Brunk 43491838ded36131525312739c0929913b215519c2aRuben Brunk return value; 43591838ded36131525312739c0929913b215519c2aRuben Brunk } 43691838ded36131525312739c0929913b215519c2aRuben Brunk 43791838ded36131525312739c0929913b215519c2aRuben Brunk /** 43891838ded36131525312739c0929913b215519c2aRuben Brunk * Ensures that the {@link Collection} is not {@code null}, and contains at least one element. 43991838ded36131525312739c0929913b215519c2aRuben Brunk * 44091838ded36131525312739c0929913b215519c2aRuben Brunk * @param value a {@link Collection} of boxed elements. 44191838ded36131525312739c0929913b215519c2aRuben Brunk * @param valueName the name of the argument to use if the check fails. 44291838ded36131525312739c0929913b215519c2aRuben Brunk 44391838ded36131525312739c0929913b215519c2aRuben Brunk * @return the validated {@link Collection} 44491838ded36131525312739c0929913b215519c2aRuben Brunk * 44591838ded36131525312739c0929913b215519c2aRuben Brunk * @throws NullPointerException if the {@code value} was {@code null} 44691838ded36131525312739c0929913b215519c2aRuben Brunk * @throws IllegalArgumentException if the {@code value} was empty 44791838ded36131525312739c0929913b215519c2aRuben Brunk */ 44891838ded36131525312739c0929913b215519c2aRuben Brunk public static <T> Collection<T> checkCollectionNotEmpty(final Collection<T> value, 44991838ded36131525312739c0929913b215519c2aRuben Brunk final String valueName) { 45091838ded36131525312739c0929913b215519c2aRuben Brunk if (value == null) { 45191838ded36131525312739c0929913b215519c2aRuben Brunk throw new NullPointerException(valueName + " must not be null"); 45291838ded36131525312739c0929913b215519c2aRuben Brunk } 45391838ded36131525312739c0929913b215519c2aRuben Brunk if (value.isEmpty()) { 45491838ded36131525312739c0929913b215519c2aRuben Brunk throw new IllegalArgumentException(valueName + " is empty"); 45591838ded36131525312739c0929913b215519c2aRuben Brunk } 45691838ded36131525312739c0929913b215519c2aRuben Brunk return value; 45791838ded36131525312739c0929913b215519c2aRuben Brunk } 45891838ded36131525312739c0929913b215519c2aRuben Brunk 45991838ded36131525312739c0929913b215519c2aRuben Brunk /** 460b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Ensures that all elements in the argument floating point array are within the inclusive range 461b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 462b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>While this can be used to range check against +/- infinity, note that all NaN numbers 463b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * will always be out of range.</p> 464b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 465b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param value a floating point array of values 466b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param lower the lower endpoint of the inclusive range 467b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param upper the upper endpoint of the inclusive range 468b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param valueName the name of the argument to use if the check fails 469b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 470b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return the validated floating point value 471b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 472b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws IllegalArgumentException if any of the elements in {@code value} were out of range 473b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws NullPointerException if the {@code value} was {@code null} 474b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 475b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public static float[] checkArrayElementsInRange(float[] value, float lower, float upper, 476b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String valueName) { 477b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin checkNotNull(value, valueName + " must not be null"); 478b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 479b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin for (int i = 0; i < value.length; ++i) { 480b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin float v = value[i]; 481b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 482b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (Float.isNaN(v)) { 483b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException(valueName + "[" + i + "] must not be NaN"); 484b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } else if (v < lower) { 485b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException( 486b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String.format("%s[%d] is out of range of [%f, %f] (too low)", 487b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin valueName, i, lower, upper)); 488b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } else if (v > upper) { 489b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin throw new IllegalArgumentException( 490b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin String.format("%s[%d] is out of range of [%f, %f] (too high)", 491b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin valueName, i, lower, upper)); 492b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 493b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 494b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 495b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return value; 496b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 497d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey} 498