1 10 11 package org.mmbase.util.functions; 12 13 import org.mmbase.util.Casting; 14 import java.util.*; 15 import org.mmbase.util.logging.*; 16 17 30 31 public class Parameters extends AbstractList implements java.io.Serializable { 32 private static final Logger log = Logging.getLoggerInstance(Parameters.class); 33 34 private static final int serialVersionUID = 1; 35 36 39 public static final Parameters VOID = new Parameters(Parameter.EMPTY); 40 41 42 45 protected Map backing; 46 47 51 protected Parameter[] definition = null; 52 53 56 protected boolean autoCasting = false; 57 58 private int fromIndex = 0; 59 protected int toIndex; 60 61 79 public Parameters(Parameter[] def) { 80 definition = (Parameter[]) Functions.define(def, new ArrayList()).toArray(Parameter.EMPTY); 81 toIndex = definition.length; 82 if (log.isDebugEnabled()) { 83 log.debug("Found definition " + Arrays.asList(definition)); 84 } 85 backing = new HashMap(); 86 for (int i = fromIndex; i < toIndex; i++) { 88 if (backing.put(definition[i].getName(), definition[i].getDefaultValue()) != null) { 89 throw new IllegalArgumentException ("Parameter keys not unique"); 90 } 91 92 } 93 94 } 95 96 103 public Parameters(Parameter[] def, Collection values) { 104 this(def); 105 setAll(values); 106 } 107 108 111 protected Parameters(Parameters params, int from, int to) { 112 backing = params.backing; 113 definition = params.definition; 114 fromIndex = from + params.fromIndex; 115 toIndex = to + params.fromIndex; 116 if (fromIndex < 0) throw new IndexOutOfBoundsException ("fromIndex < 0"); 117 if (toIndex > definition.length) throw new IndexOutOfBoundsException ("toIndex greater then length of list"); 118 if (fromIndex > toIndex) throw new IndexOutOfBoundsException ("fromIndex > toIndex"); 119 120 } 121 122 public String toString() { 123 StringBuffer buf = new StringBuffer ("["); 124 for (int i = fromIndex; i < toIndex; i++) { 125 if (i > fromIndex) buf.append(", "); 126 buf.append(definition[i]).append('=').append(get(i)); 127 } 128 buf.append("]"); 129 return buf.toString(); 130 } 131 132 public Class [] toClassArray() { 133 Class [] array = new Class [toIndex - fromIndex]; 134 for (int i = fromIndex; i < toIndex; i++) { 135 array[i - fromIndex] = definition[i].getDataType().getTypeAsClass(); 136 } 137 return array; 138 } 139 140 145 public void setAutoCasting(boolean autocast) { 146 autoCasting = autocast; 147 } 148 149 public Parameter[] getDefinition() { 150 if (fromIndex > 0 || toIndex != definition.length - 1) { 151 return (Parameter[]) Arrays.asList(definition).subList(fromIndex, toIndex).toArray(Parameter.EMPTY); 152 } else { 153 return definition; 154 } 155 } 156 157 162 public boolean isAutoCasting() { 163 return autoCasting; 164 } 165 166 public int size() { 169 return toIndex - fromIndex; 170 } 171 172 public Object get(int i) { 175 return backing.get(definition[i + fromIndex].getName()); 176 } 177 178 public Object set(int i, Object value) { 181 Parameter a = definition[i + fromIndex]; 182 if (autoCasting) value = a.autoCast(value); 183 a.checkType(value); 184 return backing.put(a.getName(), value); 185 } 186 187 188 191 public void checkRequiredParameters() { 192 for (int i = fromIndex; i < toIndex; i++) { 193 Parameter a = definition[i]; 194 if (a.isRequired() && (get(a.getName()) == null)) { 195 throw new IllegalArgumentException ("Required parameter '" + a.getName() + "' is null (of (" + toString() + ")"); 196 } 197 } 198 } 199 200 206 207 public int indexOfParameter(Parameter parameter) { 208 int index = -1; 209 for (int i = fromIndex; i < toIndex; i++) { 210 if (definition[i].equals(parameter)) { 211 index = i - fromIndex; 212 break; 213 } 214 } 215 return index; 216 } 217 218 219 225 public int indexOfParameter(String parameterName) { 226 int index = -1; 227 for (int i = fromIndex; i < toIndex; i++) { 228 if (definition[i].getName().equals(parameterName)) { 229 index = i - fromIndex; 230 break; 231 } 232 } 233 return index; 234 } 235 236 237 242 public boolean containsParameter(Parameter parameter) { 243 return indexOfParameter(parameter) != -1; 244 } 245 246 251 public boolean containsParameter(String parameterName) { 252 return indexOfParameter(parameterName) != -1; 253 } 254 255 261 public Parameters set(Parameter parameter, Object value) { 262 int index = indexOfParameter(parameter); 263 if (index > -1) { 264 set(index, value); 265 return this; 266 } else { 267 throw new IllegalArgumentException ("The parameter '" + parameter + "' is not defined (defined are " + toString() + ")"); 268 } 269 } 270 271 277 public Parameters set(String parameterName, Object value) { 278 int index = indexOfParameter(parameterName); 279 if (index > -1) { 280 set(index, value); 281 return this; 282 } else { 283 throw new IllegalArgumentException ("The parameter '" + parameterName + "' is not defined (defined are " + toString() + ")"); 284 } 285 } 286 287 290 public Parameters setAll(Map map) { 291 if (map != null) { 292 Iterator i = map.entrySet().iterator(); 293 while (i.hasNext()) { 294 Map.Entry entry = (Map.Entry) i.next(); 295 set((String ) entry.getKey(), entry.getValue()); 296 } 297 } 298 return this; 299 } 300 301 304 public Parameters setAll(Collection values) { 305 if (values != null) { 306 if (log.isDebugEnabled()) { 307 if (values.size() > definition.length) { 308 log.debug("Given too many values. " + values + " does not match " + Arrays.asList(definition)); 309 } 310 } 311 Iterator valueIterator = values.iterator(); 312 int i = 0; 313 while (valueIterator.hasNext()) { 314 set(i++, valueIterator.next()); 315 } 316 } 317 return this; 318 } 319 320 public List subList(int fromIndex, int toIndex) { 321 return new Parameters(this, fromIndex, toIndex); 322 } 323 324 325 330 public Parameters setIfDefined(Parameter parameter, Object value) { 331 int index = indexOfParameter(parameter); 332 if (index > -1) { 333 set(index, value); 334 } 335 return this; 336 } 337 338 339 344 public Parameters setIfDefined(String parameterName, Object value) { 345 int index = indexOfParameter(parameterName); 346 if (index > -1) { 347 set(index, value); 348 } 349 return this; 350 } 351 352 357 public Object get(Parameter parameter) { 358 return get(parameter.getName()); 359 } 360 361 362 367 public Object get(String parameterName) { 368 return backing.get(parameterName); 369 } 370 371 372 377 378 public String getString(Parameter parameter) { 379 return getString(parameter.getName()); 380 } 381 382 383 388 public String getString(String parameterName) { 389 return Casting.toString(get(parameterName)); 390 } 391 392 395 public Map toMap() { 396 return Collections.unmodifiableMap(backing); 397 } 398 399 } 400 | Popular Tags |