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