Coverage Report - org.kuali.rice.krad.datadictionary.AttributeDefinition
 
Classes in this File Line Coverage Branch Coverage Complexity
AttributeDefinition
16%
19/112
0%
0/28
1.368
 
 1  
 /*
 2  
  * Copyright 2005-2008 The Kuali Foundation
 3  
  * 
 4  
  * Licensed under the Educational Community License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  * 
 8  
  * http://www.opensource.org/licenses/ecl2.php
 9  
  * 
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 
 17  
 package org.kuali.rice.krad.datadictionary;
 18  
 
 19  
 import org.apache.commons.lang.ClassUtils;
 20  
 import org.apache.commons.lang.StringUtils;
 21  
 import org.apache.log4j.Logger;
 22  
 import org.kuali.rice.core.api.uif.DataType;
 23  
 import org.kuali.rice.core.api.util.ClassLoaderUtils;
 24  
 import org.kuali.rice.core.web.format.Formatter;
 25  
 import org.kuali.rice.krad.datadictionary.control.ControlDefinition;
 26  
 import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
 27  
 import org.kuali.rice.krad.datadictionary.exception.ClassValidationException;
 28  
 import org.kuali.rice.krad.datadictionary.validation.ValidationPattern;
 29  
 import org.kuali.rice.krad.datadictionary.validation.capability.CaseConstrainable;
 30  
 import org.kuali.rice.krad.datadictionary.validation.capability.Formatable;
 31  
 import org.kuali.rice.krad.datadictionary.validation.capability.HierarchicallyConstrainable;
 32  
 import org.kuali.rice.krad.datadictionary.validation.capability.LengthConstrainable;
 33  
 import org.kuali.rice.krad.datadictionary.validation.capability.MustOccurConstrainable;
 34  
 import org.kuali.rice.krad.datadictionary.validation.capability.PrerequisiteConstrainable;
 35  
 import org.kuali.rice.krad.datadictionary.validation.capability.RangeConstrainable;
 36  
 import org.kuali.rice.krad.datadictionary.validation.capability.ValidCharactersConstrainable;
 37  
 import org.kuali.rice.krad.datadictionary.validation.constraint.CaseConstraint;
 38  
 import org.kuali.rice.krad.datadictionary.validation.constraint.LookupConstraint;
 39  
 import org.kuali.rice.krad.datadictionary.validation.constraint.MustOccurConstraint;
 40  
 import org.kuali.rice.krad.datadictionary.validation.constraint.PrerequisiteConstraint;
 41  
 import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
 42  
 import org.kuali.rice.krad.keyvalues.KeyValuesFinder;
 43  
 import org.kuali.rice.krad.uif.control.Control;
 44  
 import org.kuali.rice.krad.util.ObjectUtils;
 45  
 
 46  
 import java.util.List;
 47  
 
 48  
 /**
 49  
  * A single attribute definition in the DataDictionary, which contains
 50  
  * information relating to the display, validation, and general maintenance of a
 51  
  * specific attribute of an entry.
 52  
  * 
 53  
  * @author Kuali Rice Team (rice.collab@kuali.org)
 54  
  */
 55  
 public class AttributeDefinition extends AttributeDefinitionBase implements CaseConstrainable, PrerequisiteConstrainable, Formatable, HierarchicallyConstrainable, MustOccurConstrainable, LengthConstrainable, RangeConstrainable, ValidCharactersConstrainable {
 56  
         private static final long serialVersionUID = -2490613377818442742L;
 57  
 
 58  257
         protected Boolean forceUppercase = Boolean.FALSE;
 59  
         
 60  
         protected DataType dataType;
 61  
         
 62  
         protected Integer minLength;
 63  
         protected Integer maxLength;
 64  
         protected Boolean unique;
 65  
 
 66  
         protected String exclusiveMin;
 67  
         protected String inclusiveMax;
 68  
 
 69  
         @Deprecated 
 70  
         protected ValidationPattern validationPattern;
 71  
 
 72  
         protected ControlDefinition control;
 73  
 
 74  
         // TODO: rename to control once ControlDefinition is removed
 75  
         protected Control controlField;
 76  
 
 77  
         protected String formatterClass;
 78  
 
 79  
         protected AttributeSecurity attributeSecurity;
 80  
         
 81  
         protected Boolean dynamic;
 82  
         
 83  
         // KS-style constraints 
 84  
         protected String customValidatorClass;
 85  
         protected ValidCharactersConstraint validCharactersConstraint;        
 86  
     protected CaseConstraint caseConstraint;
 87  
     protected List<PrerequisiteConstraint> dependencyConstraints;
 88  
         protected List<MustOccurConstraint> mustOccurConstraints;
 89  
         protected LookupConstraint lookupDefinition;// If the user wants to match
 90  
                 // against two searches, that search must be defined as  well
 91  
         protected String lookupContextPath;
 92  
         
 93  
         //TODO: This may not be required since we now use ComplexAttributeDefinition
 94  
         protected String childEntryName;
 95  
         
 96  
         private KeyValuesFinder optionsFinder;
 97  
 
 98  
         protected String alternateDisplayAttributeName;
 99  
     protected String additionalDisplayAttributeName;
 100  
     
 101  
 
 102  257
         public AttributeDefinition() {
 103  
                 // Empty
 104  257
         }
 105  
 
 106  
         /**
 107  
          * forceUppercase = convert user entry to uppercase and always display
 108  
          * database value as uppercase.
 109  
          */
 110  
         public void setForceUppercase(Boolean forceUppercase) {
 111  0
                 this.forceUppercase = forceUppercase;
 112  0
         }
 113  
 
 114  
         public Boolean getForceUppercase() {
 115  0
                 return this.forceUppercase;
 116  
         }
 117  
 
 118  
         @Override
 119  
         public Integer getMaxLength() {
 120  0
                 return maxLength;
 121  
         }
 122  
 
 123  
         /**
 124  
          * The maxLength element determines the maximum size of the field for data
 125  
          * entry edit purposes and for display purposes.
 126  
          */
 127  
         public void setMaxLength(Integer maxLength) {
 128  0
                 this.maxLength = maxLength;
 129  0
         }
 130  
 
 131  
         @Override
 132  
         public String getExclusiveMin() {
 133  6
                 return exclusiveMin;
 134  
         }
 135  
 
 136  
         /**
 137  
          * The exclusiveMin element determines the minimum allowable value for data
 138  
          * entry editing purposes. Value can be an integer or decimal value such as
 139  
          * -.001 or 99.
 140  
          */
 141  
         public void setExclusiveMin(String exclusiveMin) {
 142  11
                 this.exclusiveMin = exclusiveMin;
 143  11
         }
 144  
 
 145  
         /**
 146  
          * The inclusiveMax element determines the maximum allowable value for data
 147  
          * entry editing purposes. Value can be an integer or decimal value such as
 148  
          * -.001 or 99.
 149  
          * 
 150  
          * JSTL: This field is mapped into the field named "exclusiveMax".
 151  
          */
 152  
         @Override
 153  
         public String getInclusiveMax() {
 154  6
                 return inclusiveMax;
 155  
         }
 156  
 
 157  
         /**
 158  
          * The inclusiveMax element determines the maximum allowable value for data
 159  
          * entry editing purposes. Value can be an integer or decimal value such as
 160  
          * -.001 or 99.
 161  
          * 
 162  
          * JSTL: This field is mapped into the field named "exclusiveMax".
 163  
          */
 164  
         public void setInclusiveMax(String inclusiveMax) {
 165  11
                 this.inclusiveMax = inclusiveMax;
 166  11
         }
 167  
 
 168  
         /**
 169  
          * @return true if a validationPattern has been set
 170  
          */
 171  
         public boolean hasValidationPattern() {
 172  0
                 return (validationPattern != null);
 173  
         }
 174  
 
 175  
         public ValidationPattern getValidationPattern() {
 176  0
                 return this.validationPattern;
 177  
         }
 178  
 
 179  
         /**
 180  
          * The validationPattern element defines the allowable character-level or
 181  
          * field-level values for an attribute.
 182  
          * 
 183  
          * JSTL: validationPattern is a Map which is accessed using a key of
 184  
          * "validationPattern". Each entry may contain some of the keys listed
 185  
          * below. The keys that may be present for a given attribute are dependent
 186  
          * upon the type of validationPattern.
 187  
          * 
 188  
          * maxLength (String) exactLength type allowWhitespace allowUnderscore
 189  
          * allowPeriod validChars precision scale allowNegative
 190  
          * 
 191  
          * The allowable keys (in addition to type) for each type are: Type****
 192  
          * ***Keys*** alphanumeric exactLength maxLength allowWhitespace
 193  
          * allowUnderscore allowPeriod
 194  
          * 
 195  
          * alpha exactLength maxLength allowWhitespace
 196  
          * 
 197  
          * anyCharacter exactLength maxLength allowWhitespace
 198  
          * 
 199  
          * charset validChars
 200  
          * 
 201  
          * numeric exactLength maxLength
 202  
          * 
 203  
          * fixedPoint allowNegative precision scale
 204  
          * 
 205  
          * floatingPoint allowNegative
 206  
          * 
 207  
          * date n/a emailAddress n/a javaClass n/a month n/a phoneNumber n/a
 208  
          * timestamp n/a year n/a zipcode n/a
 209  
          * 
 210  
          * Note: maxLength and exactLength are mutually exclusive. If one is
 211  
          * entered, the other may not be entered.
 212  
          * 
 213  
          * Note: See ApplicationResources.properties for exact regex patterns. e.g.
 214  
          * validationPatternRegex.date for regex used in date validation.
 215  
          */
 216  
         public void setValidationPattern(ValidationPattern validationPattern) {
 217  0
                 this.validationPattern = validationPattern;
 218  
                 
 219  
                 // FIXME: JLR - need to recreate this functionality using the ValidCharsConstraint logic
 220  0
         }
 221  
 
 222  
 
 223  
         /**
 224  
          * @return control
 225  
          */
 226  
         public ControlDefinition getControl() {
 227  0
                 return control;
 228  
         }
 229  
 
 230  
         /**
 231  
          * The control element defines the manner in which an attribute is displayed
 232  
          * and the manner in which the attribute value is entered.
 233  
          * 
 234  
          * JSTL: control is a Map representing an HTML control. It is accessed using
 235  
          * a key of "control". The table below shows the types of entries associated
 236  
          * with each type of control.
 237  
          * 
 238  
          ** Control Type** **Key** **Value** checkbox checkbox boolean String
 239  
          * 
 240  
          * hidden hidden boolean String
 241  
          * 
 242  
          * radio radio boolean String valuesFinder valuesFinder class name
 243  
          * dataObjectClass String keyAttribute String labelAttribute String
 244  
          * includeKeyInLabel boolean String
 245  
          * 
 246  
          * select select boolean String valuesFinder valuesFinder class name
 247  
          * dataObjectClass String keyAttribute String labelAttribute String
 248  
          * includeBlankRow boolean String includeKeyInLabel boolean String
 249  
          * 
 250  
          * apcSelect apcSelect boolean String paramNamespace String
 251  
          * parameterDetailType String parameterName String
 252  
          * 
 253  
          * text text boolean String size String
 254  
          * 
 255  
          * textarea textarea boolean String rows cols
 256  
          * 
 257  
          * currency currency boolean String size String formattedMaxLength String
 258  
          * 
 259  
          * kualiUser kualiUser boolean String universalIdAttributeName String
 260  
          * userIdAttributeName String personNameAttributeName String
 261  
          * 
 262  
          * lookupHidden lookupHidden boolean String
 263  
          * 
 264  
          * lookupReadonly lookupReadonly boolean String
 265  
          * 
 266  
          * @param control
 267  
          * @throws IllegalArgumentException
 268  
          *             if the given control is null
 269  
          */
 270  
         public void setControl(ControlDefinition control) {
 271  0
                 if (control == null) {
 272  0
                         throw new IllegalArgumentException("invalid (null) control");
 273  
                 }
 274  0
                 this.control = control;
 275  0
         }
 276  
 
 277  
         public boolean hasFormatterClass() {
 278  0
                 return (formatterClass != null);
 279  
         }
 280  
 
 281  
         @Override
 282  
         public String getFormatterClass() {
 283  16
                 return formatterClass;
 284  
         }
 285  
 
 286  
         /**
 287  
          * The formatterClass element is used when custom formatting is required for
 288  
          * display of the field value. This field specifies the name of the java
 289  
          * class to be used for the formatting. About 15 different classes are
 290  
          * available including BooleanFormatter, CurrencyFormatter, DateFormatter,
 291  
          * etc.
 292  
          */
 293  
         public void setFormatterClass(String formatterClass) {
 294  0
                 if (formatterClass == null) {
 295  0
                         throw new IllegalArgumentException("invalid (null) formatterClass");
 296  
                 }
 297  0
                 this.formatterClass = formatterClass;
 298  0
         }
 299  
 
 300  
         /**
 301  
          * Directly validate simple fields, call completeValidation on Definition
 302  
          * fields.
 303  
          * 
 304  
          * @see org.kuali.rice.krad.datadictionary.DataDictionaryEntry#completeValidation()
 305  
          */
 306  
         @Override
 307  
         public void completeValidation(Class<?> rootObjectClass, Class<?> otherObjectClass) {
 308  
                 try {
 309  0
                         if (!DataDictionary.isPropertyOf(rootObjectClass, getName())) {
 310  0
                                 throw new AttributeValidationException("property '" + getName() + "' is not a property of class '"
 311  
                                                 + rootObjectClass.getName() + "' (" + "" + ")");
 312  
                         }
 313  
 
 314  
                         //TODO currently requiring a control or controlField, but this should not be case (AttrField should probably do the check)
 315  0
                         if (getControl() == null && getControlField() == null) {
 316  0
                                 throw new AttributeValidationException("property '" + getName() + "' in class '"
 317  
                                                 + rootObjectClass.getName() + " does not have a control defined");
 318  
                         }
 319  
                         
 320  0
                         if(getControl() != null) {
 321  0
                             getControl().completeValidation(rootObjectClass, otherObjectClass);
 322  
                         }
 323  
 
 324  0
                         if (attributeSecurity != null) {
 325  0
                                 attributeSecurity.completeValidation(rootObjectClass, otherObjectClass);
 326  
                         }
 327  
 
 328  0
                         if (validationPattern != null) {
 329  0
                                 validationPattern.completeValidation();
 330  
                         }
 331  
 
 332  0
                         if (formatterClass != null) {
 333  
                                 try {
 334  0
                                         Class formatterClassObject = ClassUtils.getClass(ClassLoaderUtils.getDefaultClassLoader(),
 335  
                                                         getFormatterClass());
 336  0
                                         if (!Formatter.class.isAssignableFrom(formatterClassObject)) {
 337  0
                                                 throw new ClassValidationException("formatterClass is not a valid instance of "
 338  
                                                                 + Formatter.class.getName() + " instead was: " + formatterClassObject.getName());
 339  
                                         }
 340  
                                 }
 341  0
                                 catch (ClassNotFoundException e) {
 342  0
                                         throw new ClassValidationException("formatterClass could not be found: " + getFormatterClass(), e);
 343  0
                                 }
 344  
                         }
 345  
                 }
 346  0
                 catch (RuntimeException ex) {
 347  0
                         Logger.getLogger(getClass()).error(
 348  
                                         "Unable to validate attribute " + rootObjectClass + "." + getName() + ": " + ex.getMessage(), ex);
 349  0
                         throw ex;
 350  0
                 }
 351  0
         }
 352  
 
 353  
         /**
 354  
          * @see java.lang.Object#toString()
 355  
          */
 356  
         @Override
 357  
         public String toString() {
 358  0
                 return "AttributeDefinition for attribute " + getName();
 359  
         }
 360  
 
 361  
         /**
 362  
          * @return the attributeSecurity
 363  
          */
 364  
         public AttributeSecurity getAttributeSecurity() {
 365  0
                 return this.attributeSecurity;
 366  
         }
 367  
 
 368  
         /**
 369  
          * @param attributeSecurity
 370  
          *            the attributeSecurity to set
 371  
          */
 372  
         public void setAttributeSecurity(AttributeSecurity attributeSecurity) {
 373  0
                 this.attributeSecurity = attributeSecurity;
 374  0
         }
 375  
 
 376  
         public boolean hasAttributeSecurity() {
 377  0
                 return (attributeSecurity != null);
 378  
         }
 379  
 
 380  
         /**
 381  
          * This overridden method ...
 382  
          * 
 383  
          * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
 384  
          */
 385  
         @Override
 386  
         public void afterPropertiesSet() throws Exception {
 387  0
                 if (StringUtils.isEmpty(name)) {
 388  0
                         throw new RuntimeException("blank name for bean: " + id);
 389  
                 }
 390  0
         }
 391  
 
 392  
         /**
 393  
          * @return the unique
 394  
          */
 395  
         public Boolean getUnique() {
 396  0
                 return this.unique;
 397  
         }
 398  
 
 399  
         /**
 400  
          * @param unique
 401  
          *            the unique to set
 402  
          */
 403  
         public void setUnique(Boolean unique) {
 404  0
                 this.unique = unique;
 405  0
         }
 406  
 
 407  
         /**
 408  
          * Default <code>Control</code> to use when the attribute is to be rendered
 409  
          * for the UI. Used by the UIF when a control is not defined for an
 410  
          * <code>AttributeField</code>
 411  
          * 
 412  
          * @return Control instance
 413  
          */
 414  
         public Control getControlField() {
 415  0
                 return this.controlField;
 416  
         }
 417  
 
 418  
         /**
 419  
          * Setter for the default control
 420  
          * 
 421  
          * @param controlField
 422  
          */
 423  
         public void setControlField(Control controlField) {
 424  0
                 this.controlField = controlField;
 425  0
         }
 426  
 
 427  
         /**
 428  
          * @return the minLength
 429  
          */
 430  
         public Integer getMinLength() {
 431  0
                 return this.minLength;
 432  
         }
 433  
 
 434  
         /**
 435  
          * @param minLength the minLength to set
 436  
          */
 437  
         public void setMinLength(Integer minLength) {
 438  0
                 this.minLength = minLength;
 439  0
         }
 440  
 
 441  
         /**
 442  
          * @return the dataType
 443  
          */
 444  
         @Override
 445  
         public DataType getDataType() {
 446  8
                 return this.dataType;
 447  
         }
 448  
 
 449  
         /**
 450  
          * @param dataType the dataType to set
 451  
          */
 452  
         public void setDataType(DataType dataType) {
 453  11
                 this.dataType = dataType;
 454  11
         }
 455  
         
 456  
         public void setDataType(String dataType) {
 457  0
                 this.dataType = DataType.valueOf(dataType);
 458  0
         }
 459  
 
 460  
         /**
 461  
          * @return the customValidatorClass
 462  
          */
 463  
         public String getCustomValidatorClass() {
 464  0
                 return this.customValidatorClass;
 465  
         }
 466  
 
 467  
         /**
 468  
          * @param customValidatorClass the customValidatorClass to set
 469  
          */
 470  
         public void setCustomValidatorClass(String customValidatorClass) {
 471  0
                 this.customValidatorClass = customValidatorClass;
 472  0
         }
 473  
 
 474  
         /**
 475  
          * @return the validChars
 476  
          */
 477  
         @Override
 478  
         public ValidCharactersConstraint getValidCharactersConstraint() {
 479  0
                 return this.validCharactersConstraint;
 480  
         }
 481  
 
 482  
         /**
 483  
          * @param validCharactersConstraint the validChars to set
 484  
          */
 485  
         public void setValidCharactersConstraint(ValidCharactersConstraint validCharactersConstraint) {
 486  109
                 this.validCharactersConstraint = validCharactersConstraint;
 487  109
         }
 488  
 
 489  
         /**
 490  
          * @return the caseConstraint
 491  
          */
 492  
         @Override
 493  
         public CaseConstraint getCaseConstraint() {
 494  0
                 return this.caseConstraint;
 495  
         }
 496  
 
 497  
         /**
 498  
          * @param caseConstraint the caseConstraint to set
 499  
          */
 500  
         public void setCaseConstraint(CaseConstraint caseConstraint) {
 501  5
                 this.caseConstraint = caseConstraint;
 502  5
         }
 503  
 
 504  
         /**
 505  
          * @return the requireConstraint
 506  
          */
 507  
         @Override
 508  
         public List<PrerequisiteConstraint> getPrerequisiteConstraints() {
 509  0
                 return this.dependencyConstraints;
 510  
         }
 511  
 
 512  
         /**
 513  
          * @param dependencyConstraints the requireConstraint to set
 514  
          */
 515  
         public void setPrerequisiteConstraints(List<PrerequisiteConstraint> dependencyConstraints) {
 516  5
                 this.dependencyConstraints = dependencyConstraints;
 517  5
         }
 518  
 
 519  
         /**
 520  
          * @return the occursConstraint
 521  
          */
 522  
         @Override
 523  
         public List<MustOccurConstraint> getMustOccurConstraints() {
 524  0
                 return this.mustOccurConstraints;
 525  
         }
 526  
 
 527  
         /**
 528  
          * @param mustOccurConstraints the occursConstraint to set
 529  
          */
 530  
         public void setMustOccurConstraints(List<MustOccurConstraint> mustOccurConstraints) {
 531  0
                 this.mustOccurConstraints = mustOccurConstraints;
 532  0
         }
 533  
 
 534  
         /**
 535  
          * @return the lookupDefinition
 536  
          */
 537  
         public LookupConstraint getLookupDefinition() {
 538  0
                 return this.lookupDefinition;
 539  
         }
 540  
 
 541  
         /**
 542  
          * @param lookupDefinition the lookupDefinition to set
 543  
          */
 544  
         public void setLookupDefinition(LookupConstraint lookupDefinition) {
 545  0
                 this.lookupDefinition = lookupDefinition;
 546  0
         }
 547  
 
 548  
         /**
 549  
          * @return the lookupContextPath
 550  
          */
 551  
         public String getLookupContextPath() {
 552  0
                 return this.lookupContextPath;
 553  
         }
 554  
 
 555  
         /**
 556  
          * @param lookupContextPath the lookupContextPath to set
 557  
          */
 558  
         public void setLookupContextPath(String lookupContextPath) {
 559  0
                 this.lookupContextPath = lookupContextPath;
 560  0
         }
 561  
 
 562  
         /**
 563  
          * @return the childEntryName
 564  
          */
 565  
         public String getChildEntryName() {
 566  0
                 return this.childEntryName;
 567  
         }
 568  
 
 569  
         /**
 570  
          * @param childEntryName the childEntryName to set
 571  
          */
 572  
         public void setChildEntryName(String childEntryName) {
 573  0
                 this.childEntryName = childEntryName;
 574  0
         }
 575  
 
 576  
         /**
 577  
          * @return the constraintMessage
 578  
          */
 579  
         public String getConstraint() {
 580  0
                 return this.constraint;
 581  
         }
 582  
 
 583  
         /**
 584  
          * @param constraintMessage the constraintMessage to set
 585  
          */
 586  
         public void setConstraint(String constraint) {
 587  0
                 this.constraint = constraint;
 588  0
         }
 589  
         
 590  
     /**
 591  
      * Instance of <code>KeyValluesFinder</code> that should be invoked to
 592  
      * provide a List of values the field can have. Generally used to provide
 593  
      * the options for a multi-value control or to validate the submitted field
 594  
      * value
 595  
      * 
 596  
      * @return KeyValuesFinder instance
 597  
      */
 598  
     public KeyValuesFinder getOptionsFinder() {
 599  0
         return this.optionsFinder;
 600  
     }
 601  
 
 602  
     /**
 603  
      * Setter for the field's KeyValuesFinder instance
 604  
      * 
 605  
      * @param optionsFinder
 606  
      */
 607  
     public void setOptionsFinder(KeyValuesFinder optionsFinder) {
 608  0
         this.optionsFinder = optionsFinder;
 609  0
     }
 610  
     
 611  
     /**
 612  
      * Setter that takes in the class name for the options finder and creates a
 613  
      * new instance to use as the finder for the attribute field
 614  
      * 
 615  
      * @param optionsFinderClass
 616  
      */
 617  
     public void setOptionsFinderClass(Class<? extends KeyValuesFinder> optionsFinderClass) {
 618  0
         this.optionsFinder = ObjectUtils.newInstance(optionsFinderClass);
 619  0
     }
 620  
         
 621  
         public void setAdditionalDisplayAttributeName(String additionalDisplayAttributeName) {
 622  0
                 this.additionalDisplayAttributeName = additionalDisplayAttributeName;
 623  0
         }
 624  
         
 625  
         public String getAdditionalDisplayAttributeName() {
 626  0
                 return this.additionalDisplayAttributeName;
 627  
         }
 628  
 
 629  
         public void setAlternateDisplayAttributeName(String alternateDisplayAttributeName) {
 630  0
                 this.alternateDisplayAttributeName = alternateDisplayAttributeName;
 631  0
         }
 632  
         
 633  
         public String getAlternateDisplayAttributeName() {
 634  0
                 return this.alternateDisplayAttributeName;
 635  
         }
 636  
 
 637  
 }