001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package org.apache.hadoop.lib.util; 020 021 import org.apache.hadoop.classification.InterfaceAudience; 022 023 import java.text.MessageFormat; 024 import java.util.List; 025 import java.util.regex.Pattern; 026 027 /** 028 * Utility methods to check preconditions. 029 * <p/> 030 * Commonly used for method arguments preconditions. 031 */ 032 @InterfaceAudience.Private 033 public class Check { 034 035 /** 036 * Verifies a variable is not NULL. 037 * 038 * @param obj the variable to check. 039 * @param name the name to use in the exception message. 040 * 041 * @return the variable. 042 * 043 * @throws IllegalArgumentException if the variable is NULL. 044 */ 045 public static <T> T notNull(T obj, String name) { 046 if (obj == null) { 047 throw new IllegalArgumentException(name + " cannot be null"); 048 } 049 return obj; 050 } 051 052 /** 053 * Verifies a list does not have any NULL elements. 054 * 055 * @param list the list to check. 056 * @param name the name to use in the exception message. 057 * 058 * @return the list. 059 * 060 * @throws IllegalArgumentException if the list has NULL elements. 061 */ 062 public static <T> List<T> notNullElements(List<T> list, String name) { 063 notNull(list, name); 064 for (int i = 0; i < list.size(); i++) { 065 notNull(list.get(i), MessageFormat.format("list [{0}] element [{1}]", name, i)); 066 } 067 return list; 068 } 069 070 /** 071 * Verifies a string is not NULL and not emtpy 072 * 073 * @param str the variable to check. 074 * @param name the name to use in the exception message. 075 * 076 * @return the variable. 077 * 078 * @throws IllegalArgumentException if the variable is NULL or empty. 079 */ 080 public static String notEmpty(String str, String name) { 081 if (str == null) { 082 throw new IllegalArgumentException(name + " cannot be null"); 083 } 084 if (str.length() == 0) { 085 throw new IllegalArgumentException(name + " cannot be empty"); 086 } 087 return str; 088 } 089 090 /** 091 * Verifies a string list is not NULL and not emtpy 092 * 093 * @param list the list to check. 094 * @param name the name to use in the exception message. 095 * 096 * @return the variable. 097 * 098 * @throws IllegalArgumentException if the string list has NULL or empty 099 * elements. 100 */ 101 public static List<String> notEmptyElements(List<String> list, String name) { 102 notNull(list, name); 103 for (int i = 0; i < list.size(); i++) { 104 notEmpty(list.get(i), MessageFormat.format("list [{0}] element [{1}]", name, i)); 105 } 106 return list; 107 } 108 109 private static final String IDENTIFIER_PATTERN_STR = "[a-zA-z_][a-zA-Z0-9_\\-]*"; 110 111 private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("^" + IDENTIFIER_PATTERN_STR + "$"); 112 113 /** 114 * Verifies a value is a valid identifier, 115 * <code>[a-zA-z_][a-zA-Z0-9_\-]*</code>, up to a maximum length. 116 * 117 * @param value string to check if it is a valid identifier. 118 * @param maxLen maximun length. 119 * @param name the name to use in the exception message. 120 * 121 * @return the value. 122 * 123 * @throws IllegalArgumentException if the string is not a valid identifier. 124 */ 125 public static String validIdentifier(String value, int maxLen, String name) { 126 Check.notEmpty(value, name); 127 if (value.length() > maxLen) { 128 throw new IllegalArgumentException( 129 MessageFormat.format("[{0}] = [{1}] exceeds max len [{2}]", name, value, maxLen)); 130 } 131 if (!IDENTIFIER_PATTERN.matcher(value).find()) { 132 throw new IllegalArgumentException( 133 MessageFormat.format("[{0}] = [{1}] must be '{2}'", name, value, IDENTIFIER_PATTERN_STR)); 134 } 135 return value; 136 } 137 138 /** 139 * Verifies an integer is greater than zero. 140 * 141 * @param value integer value. 142 * @param name the name to use in the exception message. 143 * 144 * @return the value. 145 * 146 * @throws IllegalArgumentException if the integer is zero or less. 147 */ 148 public static int gt0(int value, String name) { 149 return (int) gt0((long) value, name); 150 } 151 152 /** 153 * Verifies an long is greater than zero. 154 * 155 * @param value long value. 156 * @param name the name to use in the exception message. 157 * 158 * @return the value. 159 * 160 * @throws IllegalArgumentException if the long is zero or less. 161 */ 162 public static long gt0(long value, String name) { 163 if (value <= 0) { 164 throw new IllegalArgumentException( 165 MessageFormat.format("parameter [{0}] = [{1}] must be greater than zero", name, value)); 166 } 167 return value; 168 } 169 170 /** 171 * Verifies an integer is greater or equal to zero. 172 * 173 * @param value integer value. 174 * @param name the name to use in the exception message. 175 * 176 * @return the value. 177 * 178 * @throws IllegalArgumentException if the integer is greater or equal to zero. 179 */ 180 public static int ge0(int value, String name) { 181 return (int) ge0((long) value, name); 182 } 183 184 /** 185 * Verifies an long is greater or equal to zero. 186 * 187 * @param value integer value. 188 * @param name the name to use in the exception message. 189 * 190 * @return the value. 191 * 192 * @throws IllegalArgumentException if the long is greater or equal to zero. 193 */ 194 public static long ge0(long value, String name) { 195 if (value < 0) { 196 throw new IllegalArgumentException(MessageFormat.format( 197 "parameter [{0}] = [{1}] must be greater than or equals zero", name, value)); 198 } 199 return value; 200 } 201 202 }