001/** 002 * Copyright 2005-2016 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.kuali.rice.kns.datadictionary.control; 017 018import org.apache.commons.lang.ClassUtils; 019import org.apache.commons.lang.builder.EqualsBuilder; 020import org.kuali.rice.core.api.util.ClassLoaderUtils; 021import org.kuali.rice.krad.bo.BusinessObject; 022import org.kuali.rice.krad.datadictionary.DataDictionaryDefinitionBase; 023import org.kuali.rice.krad.datadictionary.control.ControlDefinition; 024import org.kuali.rice.krad.datadictionary.exception.ClassValidationException; 025import org.kuali.rice.krad.datadictionary.exception.CompletionException; 026import org.kuali.rice.krad.keyvalues.KeyValuesFinder; 027 028/** 029 * A single HTML control definition in the DataDictionary, which contains information relating to the HTML control used to realize a 030 * specific attribute. All types of controls are represented by an instance of this class; you have to call one of the is* methods 031 * to figure out which of the other accessors should return useful values. 032 * 033 * @deprecated Only used by KNS classes, use KRAD. 034 */ 035@Deprecated 036public abstract class ControlDefinitionBase extends DataDictionaryDefinitionBase implements ControlDefinition { 037 private static final long serialVersionUID = 4372435175782501152L; 038 039 protected boolean datePicker; 040 protected boolean expandedTextArea; 041 protected String script; 042 protected String valuesFinderClass; 043 protected String businessObjectClass; 044 protected String keyAttribute; 045 protected String labelAttribute; 046 protected Boolean includeBlankRow; 047 protected Boolean includeKeyInLabel; 048 protected Integer size; 049 protected Integer rows; 050 protected Integer cols; 051 protected boolean ranged; 052 053 054 public ControlDefinitionBase() { 055 ranged = true; 056 } 057 058 public boolean isDatePicker() { 059 return datePicker; 060 } 061 062 /** Whether this control should have a date picker button next to the field. 063 * Valid for text fields. 064 * 065 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setDatePicker(boolean) 066 */ 067 public void setDatePicker(boolean datePicker) { 068 this.datePicker=datePicker; 069 } 070 071 public boolean isExpandedTextArea() { 072 return expandedTextArea; 073 } 074 075 /** Whether this control should have a expanded text area button next to the field. 076 * Valid for textarea fields. 077 * 078 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setExpandedTextArea(boolean) 079 */ 080 public void setExpandedTextArea(boolean eTextArea) { 081 this.expandedTextArea=eTextArea; 082 } 083 084 /** 085 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isCheckbox() 086 */ 087 public boolean isCheckbox() { 088 return false; 089 } 090 091 /** 092 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isHidden() 093 */ 094 public boolean isHidden() { 095 return false; 096 } 097 098 /** 099 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isRadio() 100 */ 101 public boolean isRadio() { 102 return false; 103 } 104 105 /** 106 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isSelect() 107 */ 108 public boolean isSelect() { 109 return false; 110 } 111 112 /** 113 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isSelect() 114 */ 115 public boolean isMultiselect() { 116 return false; 117 } 118 119 /** 120 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isText() 121 */ 122 public boolean isText() { 123 return false; 124 } 125 126 /** 127 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isTextarea() 128 */ 129 public boolean isTextarea() { 130 return false; 131 } 132 133 /** 134 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isCurrency() 135 */ 136 public boolean isCurrency() { 137 return false; 138 } 139 140 /** 141 * 142 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isKualiUser() 143 */ 144 public boolean isKualiUser() { 145 return false; 146 } 147 148 /** 149 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isWorkgroup() 150 */ 151 public boolean isWorkflowWorkgroup() { 152 return false; 153 } 154 155 /** 156 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isFile() 157 */ 158 public boolean isFile() { 159 return false; 160 } 161 162 /** 163 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isLookupHidden() 164 */ 165 public boolean isLookupHidden() { 166 return false; 167 } 168 169 /** 170 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isLookupReadonly() 171 */ 172 public boolean isLookupReadonly() { 173 return false; 174 } 175 176 /** 177 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isButton() 178 */ 179 public boolean isButton() { 180 return false; 181 } 182 183 /** 184 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isLink() 185 */ 186 public boolean isLink() { 187 return false; 188 } 189 190 191 /** 192 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setKeyValuesFinder(java.lang.String) 193 */ 194 public void setValuesFinderClass(String valuesFinderClass) { 195 if (valuesFinderClass == null) { 196 throw new IllegalArgumentException("invalid (null) valuesFinderClass"); 197 } 198 199 this.valuesFinderClass = valuesFinderClass; 200 } 201 202 /** 203 * @return the dataObjectClass 204 */ 205 public String getBusinessObjectClass() { 206 return this.businessObjectClass; 207 } 208 209 /** 210 * Used by a PersistableBusinessObjectValuesFinder to automatically query and display a list 211 * of business objects as part of a select list or set of radio buttons. 212 * 213 * The keyAttribute, labelAttribute, and includeKeyInLabel are used with this property. 214 * 215 * @param businessObjectClass the dataObjectClass to set 216 */ 217 public void setBusinessObjectClass(String businessObjectClass) { 218 if (businessObjectClass == null) { 219 throw new IllegalArgumentException("invalid (null) dataObjectClass"); 220 } 221 222 this.businessObjectClass = businessObjectClass; 223 } 224 225 /** 226 * @return the includeBlankRow 227 */ 228 public Boolean getIncludeBlankRow() { 229 return this.includeBlankRow; 230 } 231 232 /** 233 * @return the includeBlankRow 234 */ 235 public void setIncludeBlankRow(Boolean includeBlankRow) { 236 this.includeBlankRow = includeBlankRow; 237 } 238 239 /** 240 * @return the includeKeyInLabel 241 */ 242 public Boolean getIncludeKeyInLabel() { 243 return this.includeKeyInLabel; 244 } 245 246 /** 247 * Whether to include the key in the label for select lists and radio buttons. 248 */ 249 public void setIncludeKeyInLabel(Boolean includeKeyInLabel) { 250 this.includeKeyInLabel = includeKeyInLabel; 251 } 252 253 /** 254 * @return the keyAttribute 255 */ 256 public String getKeyAttribute() { 257 return this.keyAttribute; 258 } 259 260 /** 261 * Attribute of the given dataObjectClass to use as the value of a select list 262 * or set of radio buttons. 263 */ 264 public void setKeyAttribute(String keyAttribute) { 265 this.keyAttribute = keyAttribute; 266 } 267 268 /** 269 * @return the labelAttribute 270 */ 271 public String getLabelAttribute() { 272 return this.labelAttribute; 273 } 274 275 /** 276 * Attribute of the given dataObjectClass to use as the displayed label on a select list 277 * or set of radio buttons. 278 */ 279 public void setLabelAttribute(String labelAttribute) { 280 this.labelAttribute = labelAttribute; 281 } 282 283 /** 284 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#getKeyValuesFinder() 285 */ 286 public String getValuesFinderClass() { 287 return valuesFinderClass; 288 } 289 290 /** 291 * Size of a text control. 292 * 293 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setSize(int) 294 */ 295 public void setSize(Integer size) { 296 this.size = size; 297 } 298 299 /** 300 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#getSize() 301 */ 302 public Integer getSize() { 303 return size; 304 } 305 306 /** 307 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#hasScript() 308 */ 309 public boolean hasScript() { 310 return false; 311 } 312 313 /** 314 * Number of rows to display on a text-area widget. 315 * 316 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setRows(int) 317 */ 318 public void setRows(Integer rows) { 319 this.rows = rows; 320 } 321 322 /** 323 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#getRows() 324 */ 325 public Integer getRows() { 326 return rows; 327 } 328 329 /** 330 * Number of columns to display on a text-area widget. 331 * 332 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setCols(int) 333 */ 334 public void setCols(Integer cols) { 335 this.cols = cols; 336 } 337 338 /** 339 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#getCols() 340 */ 341 public Integer getCols() { 342 return cols; 343 } 344 345 /** 346 * Directly validate simple fields. 347 * 348 * @see org.kuali.rice.krad.datadictionary.DataDictionaryDefinition#completeValidation(java.lang.Class, java.lang.Object) 349 */ 350 public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) { 351 if (!isCheckbox() && !isHidden() && !isRadio() && !isSelect() && !isMultiselect() && !isText() && !isTextarea() && !isCurrency() && !isKualiUser() && !isLookupHidden() && !isLookupReadonly() && !isWorkflowWorkgroup() && !isFile()&& !isButton() && !isLink()) { 352 throw new CompletionException("error validating " + rootBusinessObjectClass.getName() + " control: unknown control type in control definition (" + "" + ")"); 353 } 354 if (valuesFinderClass != null) { 355 try { 356 Class valuesFinderClassObject = ClassUtils.getClass(ClassLoaderUtils.getDefaultClassLoader(), getValuesFinderClass()); 357 if (!KeyValuesFinder.class.isAssignableFrom(valuesFinderClassObject)) { 358 throw new ClassValidationException("valuesFinderClass is not a valid instance of " + KeyValuesFinder.class.getName() + " instead was: " + valuesFinderClassObject.getName()); 359 } 360 } catch (ClassNotFoundException e) { 361 throw new ClassValidationException("valuesFinderClass could not be found: " + getValuesFinderClass(), e); 362 } 363 } 364 if (businessObjectClass != null) { 365 try { 366 Class businessObjectClassObject = ClassUtils.getClass(ClassLoaderUtils.getDefaultClassLoader(), getBusinessObjectClass()); 367 if (!BusinessObject.class.isAssignableFrom(businessObjectClassObject)) { 368 throw new ClassValidationException("dataObjectClass is not a valid instance of " + BusinessObject.class.getName() + " instead was: " + businessObjectClassObject.getName()); 369 } 370 } catch (ClassNotFoundException e) { 371 throw new ClassValidationException("dataObjectClass could not be found: " + getBusinessObjectClass(), e); 372 } 373 } 374 } 375 376 /** 377 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#getScript() 378 */ 379 public String getScript() { 380 return script; 381 } 382 383 /** 384 * JavaScript script to run when a select control's value is changed. 385 * 386 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#setScript() 387 */ 388 public void setScript(String script) { 389 this.script = script; 390 } 391 392 /** 393 * @see org.kuali.rice.krad.datadictionary.control.ControlDefinition#isRanged() 394 */ 395 public boolean isRanged() { 396 return this.ranged; 397 } 398 399 /** 400 * Sets the control as a ranged (from and to) date field if true, or a single date field if false 401 * 402 * @param ranged boolean true for a ranged control, false for a single date field 403 */ 404 public void setRanged(boolean ranged) { 405 this.ranged = ranged; 406 } 407 408 /** 409 * @see java.lang.Object#equals(Object) 410 */ 411 public boolean equals(Object object) { 412 if ( !(object instanceof ControlDefinitionBase) ) { 413 return false; 414 } 415 ControlDefinitionBase rhs = (ControlDefinitionBase)object; 416 return new EqualsBuilder() 417 .append( this.cols, rhs.cols ) 418 .append( this.businessObjectClass, rhs.businessObjectClass ) 419 .append( this.valuesFinderClass, rhs.valuesFinderClass ) 420 .append( this.rows, rhs.rows ) 421 .append( this.script, rhs.script ) 422 .append( this.size, rhs.size ) 423 .append( this.datePicker, rhs.datePicker ) 424 .append( this.ranged, rhs.ranged ) 425 .append( this.labelAttribute,rhs.labelAttribute ) 426 .append( this.includeKeyInLabel, rhs.includeKeyInLabel ) 427 .append( this.keyAttribute, rhs.keyAttribute ) 428 .isEquals(); 429 } 430 431 432}