1 /* 2 * Copyright (c) 1998-2004 The Jgroup Team. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Lesser General Public License for more details. 12 * 13 * You should have received a copy of the GNU Lesser General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 * 17 */ 18 19 package jgroup.experiment; 20 21 22 /** 23 * An instance of class <code>PropertyDefinition</code> contains 24 * information about valid values for a named property. 25 * The constructors of <code>PropertyDefinition</code> usually take 26 * a property name, the type of property, and the valid values of 27 * the property, as parameters. If the valid values are not given, 28 * all values are valid, as long as they are of the given type. 29 * <br> 30 * Valid types are boolean, String, int, Integer and Range, 31 * or an array of these types. The list of valid values is 32 * also passed as an array of one of these types. 33 * Each type is represented by a member constant according to this list:<br> 34 * <br> 35 * boolean PropertyDefinition.BOOLEAN_TYPE<br> 36 * String PropertyDefinition.STRING_TYPE<br> 37 * int PropertyDefinition.INT_TYPE<br> 38 * Integer PropertyDefinition.INTEGER_TYPE<br> 39 * Range PropertyDefinition.RANGE_TYPE<br> 40 * 41 * @author Bjarte Svaeren 42 */ 43 public class PropertyDefinition 44 { 45 //////////////////////////////////////////////////////////////////////////////////////////// 46 // Constants 47 //////////////////////////////////////////////////////////////////////////////////////////// 48 49 public static final int BOOLEAN_TYPE = 0; 50 public static final int STRING_TYPE = 1; 51 public static final int INT_TYPE = 2; 52 public static final int INTEGER_TYPE = 3; 53 public static final int RANGE_TYPE = 4; 54 public static final int BOOLEAN_ARRAY_TYPE = 5; 55 public static final int STRING_ARRAY_TYPE = 6; 56 public static final int INT_ARRAY_TYPE = 7; 57 public static final int INTEGER_ARRAY_TYPE = 8; 58 public static final int RANGE_ARRAY_TYPE = 9; 59 60 //////////////////////////////////////////////////////////////////////////////////////////// 61 // Data fields 62 //////////////////////////////////////////////////////////////////////////////////////////// 63 64 private String propertyName; 65 private int propertyType; 66 private Object validValues; 67 68 69 //////////////////////////////////////////////////////////////////////////////////////////// 70 // Constructors 71 //////////////////////////////////////////////////////////////////////////////////////////// 72 73 /** 74 * Creates a <code>PropertyDefinition</code> object with 75 * the specified name and type, with no restrictions on 76 * value. If the property is of type boolean, only this 77 * constructor can be used. boolean values cannot be 78 * restriced more than the implicit 'true' and 'false'. 79 * <code>type</code> has to be one of the member constants 80 * listed above. 81 * 82 * @param name The name of the property 83 * @param type The type of the property 84 */ 85 public PropertyDefinition(String name, int type) 86 { 87 propertyName = name; 88 propertyType = type; 89 validValues = null; 90 } 91 92 93 /** 94 * Creates a <code>PropertyDefinition</code> object with 95 * the specified name and type. The valid values will be 96 * interpreted according to the type of the property. 97 * 98 * @param name The name of the property 99 * @param type The type of the property 100 * @param validValues The valid values of the property 101 */ 102 public PropertyDefinition(String name, int type, Object[] values) 103 { 104 propertyName = name; 105 propertyType = type; 106 107 switch (propertyType) { 108 case STRING_TYPE: 109 case STRING_ARRAY_TYPE: 110 registerString(values); 111 break; 112 case INTEGER_TYPE: 113 case INTEGER_ARRAY_TYPE: 114 registerInteger(values); 115 break; 116 case RANGE_TYPE: 117 case RANGE_ARRAY_TYPE: 118 registerRange(values); 119 break; 120 121 default: 122 throw new IllegalArgumentException("Unknown property type"); 123 } 124 } 125 126 127 /** 128 * Creates a <code>PropertyDefinition</code> object of type 129 * int, with the specified name. The valid values will be 130 * interpreted accordingly. 131 * 132 * @param name The name of the property 133 * @param type The type of the property 134 * @param validValues The valid values of the property 135 */ 136 public PropertyDefinition(String name, int type, int[] values) 137 { 138 if(type != INT_TYPE && type != INT_ARRAY_TYPE) 139 throw new IllegalArgumentException(); 140 141 registerInt(values); 142 } 143 144 145 //////////////////////////////////////////////////////////////////////////////////////////// 146 // Public methods 147 //////////////////////////////////////////////////////////////////////////////////////////// 148 149 /** 150 * Returns the name of the property as a String. 151 * 152 * @return The name of the property 153 */ 154 public String getPropertyName() 155 { 156 return propertyName; 157 } 158 159 160 /** 161 * Returns the type of the property as one of the 162 * constants from the list above. 163 * 164 * @return The type of the property 165 */ 166 public int getPropertyType() 167 { 168 return propertyType; 169 } 170 171 172 /** 173 * Returns true if the value is a valid type 174 * for this property, and has a valid value. 175 * Otherwise it returns false. 176 * 177 * @param value The value to check. 178 * @return True if the value is valid, false if it's not. 179 */ 180 public boolean isValid(Object value) 181 { 182 // If validValues is null, all values are valid 183 if(validValues == null) 184 return true; 185 186 switch (propertyType) { 187 case STRING_TYPE: 188 return isStringValid(value); 189 case INTEGER_TYPE: 190 return isIntegerValid(value); 191 case RANGE_TYPE: 192 return isRangeValid(value); 193 194 default: 195 throw new IllegalArgumentException("Uknown property type"); 196 } 197 } 198 199 200 /** 201 * Returns true if the int is a valid type 202 * for this property, and has a valid value. 203 * Otherwise, it returns false. 204 * 205 * @param value The value to check. 206 * @return True if the value is valid, false if it's not. 207 */ 208 public boolean isValid(int value) 209 { 210 if(propertyType != INT_TYPE && propertyType != INT_ARRAY_TYPE) 211 throw new IllegalArgumentException(); 212 213 // If validValues is null, all values are valid 214 if(validValues == null) 215 return true; 216 217 Integer[] validIntegers = (Integer[]) validValues; 218 219 for (int i = 0; i < validIntegers.length; i++) { 220 if(validIntegers[i].intValue() == value) 221 return true; 222 } 223 224 return false; 225 } 226 227 228 /** 229 * Returns true if boolean is a valid type 230 * for this property, otherwise it returns false. 231 * 232 * @param value The value to check. 233 * @return True if the value is valid, false if it's not. 234 */ 235 public boolean isValid(boolean value) 236 { 237 if(propertyType != BOOLEAN_TYPE && propertyType != BOOLEAN_ARRAY_TYPE) 238 throw new IllegalArgumentException(); 239 240 // If the type is boolean, it can either be 241 // true or false - both are valid 242 return true; 243 } 244 245 246 //////////////////////////////////////////////////////////////////////////////////////////// 247 // Private methods 248 //////////////////////////////////////////////////////////////////////////////////////////// 249 250 private void registerString(Object[] values) 251 { 252 String[] validStrings = (String[]) values; 253 validValues = validStrings; 254 } 255 256 257 private void registerInt(int[] values) 258 { 259 Integer[] validIntegers = new Integer[values.length]; 260 261 // Transform from ints to Integers 262 for (int i = 0; i < validIntegers.length; i++) { 263 validIntegers[i] = new Integer(values[i]); 264 } 265 266 validValues = validIntegers; 267 } 268 269 270 private void registerInteger(Object[] values) 271 { 272 Integer[] validIntegers = (Integer[]) values; 273 validValues = validIntegers; 274 } 275 276 277 private void registerRange(Object[] values) 278 { 279 Range[] validRanges = (Range[]) values; 280 validValues = validRanges; 281 } 282 283 284 private boolean isStringValid(Object value) 285 { 286 String[] validStrings = (String[]) validValues; 287 288 for (int i = 0; i < validStrings.length; i++) { 289 if(validStrings[i].equals(value)) 290 return true; 291 } 292 293 return false; 294 } 295 296 297 private boolean isIntegerValid(Object value) 298 { 299 Integer[] validIntegers = (Integer[]) validValues; 300 301 for (int i = 0; i < validIntegers.length; i++) { 302 if(validIntegers[i].compareTo((Integer) value) == 0) 303 return true; 304 } 305 306 return false; 307 } 308 309 310 private boolean isRangeValid(Object value) 311 { 312 Range[] validRanges = (Range[]) validValues; 313 314 for (int i = 0; i < validRanges.length; i++) { 315 if(validRanges[i].equals(value)) 316 return true; 317 } 318 319 return false; 320 } 321 }