001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.util;
016
017 import java.util.Date;
018 import java.util.List;
019 import java.util.TimeZone;
020
021 /**
022 * Utility class to check common parameter preconditions.
023 */
024 public class ParamChecker {
025
026 /**
027 * Check that a value is not null. If null throws an IllegalArgumentException.
028 *
029 * @param obj value.
030 * @param name parameter name for the exception message.
031 * @return the given value.
032 */
033 public static <T> T notNull(T obj, String name) {
034 if (obj == null) {
035 throw new IllegalArgumentException(name + " cannot be null");
036 }
037 return obj;
038 }
039
040 /**
041 * Check that a list is not null and that none of its elements is null. If null or if the list has emtpy elements
042 * throws an IllegalArgumentException.
043 *
044 * @param list the list of strings.
045 * @param name parameter name for the exception message.
046 * @return the given list.
047 */
048 public static <T> List<T> notNullElements(List<T> list, String name) {
049 notNull(list, name);
050 for (int i = 0; i < list.size(); i++) {
051 notNull(list.get(i), XLog.format("list [{0}] element [{1}]", name, i));
052 }
053 return list;
054 }
055
056 /**
057 * Check that a string is not null and not empty. If null or emtpy throws an IllegalArgumentException.
058 *
059 * @param str value.
060 * @param name parameter name for the exception message.
061 * @return the given value.
062 */
063 public static String notEmpty(String str, String name) {
064 if (str == null) {
065 throw new IllegalArgumentException(name + " cannot be null");
066 }
067 if (str.length() == 0) {
068 throw new IllegalArgumentException(name + " cannot be empty");
069 }
070 return str;
071 }
072
073 /**
074 * Check that a list is not null and that none of its elements is null. If null or if the list has emtpy elements
075 * throws an IllegalArgumentException.
076 *
077 * @param list the list of strings.
078 * @param name parameter name for the exception message.
079 * @return the given list.
080 */
081 public static List<String> notEmptyElements(List<String> list, String name) {
082 notNull(list, name);
083 for (int i = 0; i < list.size(); i++) {
084 notEmpty(list.get(i), XLog.format("list [{0}] element [{1}]", name, i));
085 }
086 return list;
087 }
088
089 private static final int MAX_NODE_NAME_LEN = 50;
090
091 /**
092 * Check that the given string is a valid action name [a-zA-Z_][0-9a-zA-Z_\-]* and not longer than 50 chars.
093 *
094 * @param actionName string to validate is a token.
095 * @return the given string.
096 */
097 public static String validateActionName(String actionName) {
098 ParamChecker.notEmpty(actionName, "action name");
099 if (actionName.length() > MAX_NODE_NAME_LEN) {
100 throw new IllegalArgumentException(XLog.format("name [{0}] must be {1} chars or less", actionName,
101 MAX_NODE_NAME_LEN));
102 }
103
104 char c = actionName.charAt(0);
105 if (!(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z') && !(c == '_')) {
106 throw new IllegalArgumentException(XLog.format("name [{0}], must start with [A-Za-z_]", actionName));
107 }
108 for (int i = 1; i < actionName.length(); i++) {
109 c = actionName.charAt(i);
110 if (!(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z')
111 && !(c == '_' || c == '-')) {
112 throw new IllegalArgumentException(XLog.format("name [{0}] must be [A-Za-z_][0-9A-Za-z_]*", actionName));
113 }
114 }
115 return actionName;
116 }
117
118 /**
119 * Return if the specified token is a valid Java identifier.
120 *
121 * @param token string to validate if it is a valid Java identifier.
122 * @return if the specified token is a valid Java identifier.
123 */
124 public static boolean isValidIdentifier(String token) {
125 ParamChecker.notEmpty(token, "identifier");
126 for (int i = 0; i < token.length(); i++) {
127 char c = token.charAt(i);
128 if (!(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z') && !(c == '_')) {
129 return false;
130 }
131 if (i == 0 && (c >= '0' && c <= '9')) {
132 return false;
133 }
134 }
135 return true;
136 }
137
138 /**
139 * Check whether the value is greater than or equals 0.
140 *
141 * @param value : value to test
142 * @param name : Name of the parameter
143 * @return If the value is > 0, return the value. Otherwise throw IllegalArgumentException
144 */
145 public static int checkGTZero(int value, String name) {
146 if (value <= 0) {
147 throw new IllegalArgumentException(XLog.format("parameter [{0}] = [{1}] must be greater than zero", name,
148 value));
149 }
150 return value;
151 }
152
153 /**
154 * Check whether the value is greater than or equals to 0.
155 *
156 * @param value : value to test
157 * @param name : Name of the parameter
158 * @return If the value is >= 0, return the value. Otherwise throw IllegalArgumentException
159 */
160 public static int checkGEZero(int value, String name) {
161 if (value < 0) {
162 throw new IllegalArgumentException(XLog.format(
163 "parameter [{0}] = [{1}] must be greater than or equals zero", name, value));
164 }
165 return value;
166 }
167
168 /**
169 * Check whether the value is Integer.
170 *
171 * @param value : value to test
172 * @param name : Name of the parameter
173 * @return If the value is integer, return the value. Otherwise throw IllegalArgumentException
174 */
175 public static int checkInteger(String val, String name) {
176 int ret;
177 try {
178 ret = Integer.parseInt(val);
179 }
180 catch (NumberFormatException nex) {
181 throw new IllegalArgumentException(XLog.format(
182 "parameter [{0}] = [{1}] must be an integer. Parsing error {2}", name, val, nex));
183 }
184 return ret;
185 }
186
187 /**
188 * Check whether the value is UTC data format.
189 *
190 * @param value : value to test
191 * @param name : Name of the parameter
192 * @return If the value is in UTC date format, return the value. Otherwise throw IllegalArgumentException
193 */
194 public static Date checkUTC(String date, String name) {
195 Date ret;
196 try {
197 ret = DateUtils.parseDateUTC(date);
198 }
199 catch (Exception ex) {
200 throw new IllegalArgumentException(XLog.format(
201 "parameter [{0}] = [{1}] must be Date in UTC format (yyyy-MM-dd'T'HH:mm'Z')."
202 + " Parsing error {2}", name, date, ex));
203 }
204 return ret;
205 }
206
207 /**
208 * Check whether the value mention correct Timezone.
209 *
210 * @param value : value to test
211 * @param name : Name of the parameter
212 * @return If the value is correct TZ return the value. Otherwise throw IllegalArgumentException
213 */
214 public static TimeZone checkTimeZone(String tzStr, String name) {
215 TimeZone tz;
216 try {
217 tz = DateUtils.getTimeZone(tzStr);
218 }
219 catch (Exception ex) {
220 throw new IllegalArgumentException(XLog.format("parameter [{0}] = [{1}] must be a valid TZ."
221 + " Parsing error {2}", name, tzStr, ex));
222 }
223 return tz;
224 }
225
226 /**
227 * Check whether an item is a member of an array of string
228 *
229 * @param item : item to test
230 * @param members : List of items in string
231 * @param name : Name of the parameter
232 * @return If the item is in the member return true. Otherwise throw IllegalArgumentException
233 */
234 public static boolean isMember(String item, String[] members, String name) {
235 for (int i = 0; i < members.length; i++) {
236 if (members[i].equals(item)) {
237 return true;
238 }
239 }
240 // Error case
241 StringBuilder buff = new StringBuilder();
242 for (int i = 0; i < members.length; i++) {
243 buff.append(members[i]).append(", ");
244 }
245 throw new IllegalArgumentException(XLog.format("parameter [{0}] = [{1}] " + "must be in the list {2}", name,
246 item, buff.toString()));
247 }
248 }