@Before
  public void setUp() throws Exception {

    processor = new ValidCharactersConstraintProcessor();

    dictionaryValidationResult = new DictionaryValidationResult();
    dictionaryValidationResult.setErrorLevel(ErrorLevel.NOCONSTRAINT);

    addressEntry = new BusinessObjectEntry();

    List<AttributeDefinition> attributes = new ArrayList<AttributeDefinition>();

    cityAlphaPatternConstraint = new AlphaPatternConstraint();
    cityAlphaPatternConstraint.setMessageKey("validate.dummykey");
    cityAlphaPatternConstraint.setValidationMessageParams(new ArrayList<String>());

    cityDefinition = new AttributeDefinition();
    cityDefinition.setName("city");
    cityDefinition.setValidCharactersConstraint(cityAlphaPatternConstraint);
    attributes.add(cityDefinition);

    street1AlphaPatternConstraint = new AlphaPatternConstraint();
    street1AlphaPatternConstraint.setMessageKey("validate.dummykey");
    street1AlphaPatternConstraint.setValidationMessageParams(new ArrayList<String>());
    street1AlphaPatternConstraint.setAllowWhitespace(true);

    street1Definition = new AttributeDefinition();
    street1Definition.setName("street1");
    street1Definition.setValidCharactersConstraint(street1AlphaPatternConstraint);
    attributes.add(street1Definition);

    addressEntry.setAttributes(attributes);
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeDisplayMask(java.lang.String,
   *     java.lang.String)
   */
  public AttributeSecurity getAttributeSecurity(String entryName, String attributeName) {
    AttributeSecurity attributeSecurity = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      attributeSecurity = attributeDefinition.getAttributeSecurity();
    }

    return attributeSecurity;
  }
  /**
   * @see org.kuali.rice.krad.service.DataDictionaryService#isAttributeRequired(java.lang.Class,
   *     java.lang.String)
   */
  public Boolean isAttributeRequired(String entryName, String attributeName) {
    Boolean required = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      required = attributeDefinition.isRequired();
    }

    return required;
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeDescription(java.lang.String)
   */
  public String getAttributeDescription(String entryName, String attributeName) {
    String description = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      description = attributeDefinition.getDescription();
    }

    return description;
  }
  /**
   * @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeSummary(java.lang.String)
   */
  public String getAttributeSummary(String entryName, String attributeName) {
    String summary = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      summary = attributeDefinition.getSummary();
    }

    return summary;
  }
  /**
   * @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeMaxLength(java.lang.String)
   */
  public Integer getAttributeMaxLength(String entryName, String attributeName) {
    Integer maxLength = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      maxLength = attributeDefinition.getMaxLength();
    }

    return maxLength;
  }
 /**
  * @see
  *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeValidatingErrorMessageKey(java.lang.String,
  *     java.lang.String)
  */
 public String getAttributeValidatingErrorMessageKey(String entryName, String attributeName) {
   AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
   if (attributeDefinition != null) {
     if (attributeDefinition.hasValidationPattern()) {
       ValidationPattern validationPattern = attributeDefinition.getValidationPattern();
       return validationPattern.getValidationErrorMessageKey();
     }
   }
   return null;
 }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeControlDefinition(java.lang.String)
   */
  public ControlDefinition getAttributeControlDefinition(String entryName, String attributeName) {
    ControlDefinition controlDefinition = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      controlDefinition = attributeDefinition.getControl();
    }

    return controlDefinition;
  }
  protected void addAttributesToLookupCriteria(LookupView view, DataObjectEntry dataObjectEntry) {
    AttributeDefinition activeAttribute = null;
    for (AttributeDefinition attr : dataObjectEntry.getAttributes()) {
      // Check if we have been told not to display this attribute here
      boolean dontDisplay =
          hasHintOfType(attr.getDataObjectAttribute(), UifDisplayHintType.NO_LOOKUP_CRITERIA);
      dontDisplay |= (attr.getControlField() instanceof HiddenControl);

      if (dontDisplay) {
        continue;
      }
      if (attr.getName().equals(KRADPropertyConstants.ACTIVE)) {
        activeAttribute = attr;
        continue; // leave until the end of the lookup criteria
      }
      LookupInputField field = ComponentFactory.getLookupCriteriaInputField();
      field.setPropertyName(attr.getName());
      field.setLabel(attr.getLabel());
      view.getCriteriaFields().add(field);
    }
    // If there was one, add the active attribute at the end
    if (activeAttribute != null) {
      LookupInputField field = ComponentFactory.getLookupCriteriaInputField();
      field.setPropertyName(activeAttribute.getName());
      field.setLabel(activeAttribute.getLabel());
      view.getCriteriaFields().add(field);
    }
  }
  @SuppressWarnings("unchecked")
  protected void addCollectionSectionsToInquiryView(
      InquiryView view, DataObjectEntry dataObjectEntry) {
    for (CollectionDefinition coll : dataObjectEntry.getCollections()) {
      // Create a new section
      DataObjectEntry collectionEntry =
          dataDictionaryService.getDataDictionary().getDataObjectEntry(coll.getDataObjectClass());
      // Extract the key fields on the collection which are linked to the parent.
      // When auto-generating the Inquiry Collection table, we want to exclude those.
      Collection<String> collectionFieldsLinkedToParent = new HashSet<String>();

      if (coll.getDataObjectCollection() != null) {
        for (DataObjectAttributeRelationship rel :
            coll.getDataObjectCollection().getAttributeRelationships()) {
          collectionFieldsLinkedToParent.add(rel.getChildAttributeName());
        }
      }

      if (collectionEntry == null) {
        LOG.warn(
            "Unable to find DataObjectEntry for collection class: " + coll.getDataObjectClass());
        continue;
      }

      CollectionGroup section = createCollectionInquirySection(coll.getName(), coll.getLabel());
      try {
        section.setCollectionObjectClass(Class.forName(coll.getDataObjectClass()));
      } catch (ClassNotFoundException e) {
        LOG.warn(
            "Unable to set class on collection section - class not found: "
                + coll.getDataObjectClass());
      }

      section.setPropertyName(coll.getName());
      // summary title : collection object label
      // Summary fields : PK fields?
      // add the attributes to the section
      for (AttributeDefinition attr : collectionEntry.getAttributes()) {
        boolean dontDisplay =
            hasHintOfType(attr.getDataObjectAttribute(), UifDisplayHintType.NO_INQUIRY);
        dontDisplay |= (attr.getControlField() instanceof HiddenControl);
        // Auto-exclude fields linked to the parent object
        dontDisplay |= collectionFieldsLinkedToParent.contains(attr.getName());

        if (dontDisplay) {
          continue;
        }

        DataField dataField = ComponentFactory.getDataField();
        dataField.setPropertyName(attr.getName());
        ((List<Component>) section.getItems()).add(dataField);
      }
      ((List<Group>) view.getItems()).add(section);
    }
  }
  /**
   * @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeFormatter(java.lang.String)
   */
  public Class<? extends Formatter> getAttributeFormatter(String entryName, String attributeName) {
    Class formatterClass = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      if (attributeDefinition.hasFormatterClass()) {
        formatterClass = ClassLoaderUtils.getClass(attributeDefinition.getFormatterClass());
      }
    }

    return formatterClass;
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeValuesScopeId(java.lang.Class,
   *     java.lang.String)
   */
  public Class<? extends KeyValuesFinder> getAttributeValuesFinderClass(
      String entryName, String attributeName) {
    Class valuesFinderClass = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      String valuesFinderClassName = attributeDefinition.getControl().getValuesFinderClass();
      valuesFinderClass = ClassLoaderUtils.getClass(valuesFinderClassName);
    }

    return valuesFinderClass;
  }
 /**
  * @see
  *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeValidatingErrorMessageParameters(java.lang.String,
  *     java.lang.String)
  */
 public String[] getAttributeValidatingErrorMessageParameters(
     String entryName, String attributeName) {
   AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
   if (attributeDefinition != null) {
     if (attributeDefinition.hasValidationPattern()) {
       ValidationPattern validationPattern = attributeDefinition.getValidationPattern();
       String attributeLabel = getAttributeErrorLabel(entryName, attributeName);
       return validationPattern.getValidationErrorMessageParameters(attributeLabel);
     }
   }
   return null;
 }
  @Override
  public ValidCharactersConstraint deriveValidCharactersConstraint(AttributeDefinition attrDef) {
    ValidCharactersConstraint validCharactersConstraint = null;
    // First - see if one was defined in the metadata (provided by krad-data module annotations)
    if (attrDef.getDataObjectAttribute() != null) {
      if (StringUtils.isNotBlank(
          attrDef.getDataObjectAttribute().getValidCharactersConstraintBeanName())) {
        Object consObj =
            dataDictionaryService.getDictionaryBean(
                attrDef.getDataObjectAttribute().getValidCharactersConstraintBeanName());
        if (consObj != null && consObj instanceof ValidCharactersConstraint) {
          validCharactersConstraint = (ValidCharactersConstraint) consObj;
        }
      }
    }
    // if not, make an intelligent guess from the data type
    if (validCharactersConstraint == null) {
      if (attrDef.getDataType() != null) {
        if (attrDef.getDataType() == DataType.CURRENCY) {
          validCharactersConstraint =
              (ValidCharactersConstraint)
                  dataDictionaryService.getDictionaryBean(CURRENCY_PATTERN_CONSTRAINT);
        } else if (attrDef.getDataType() == DataType.PRECISE_DECIMAL) {
          validCharactersConstraint =
              (ValidCharactersConstraint)
                  dataDictionaryService.getDictionaryBean(BIG_DECIMAL_PATTERN_CONSTRAINT);
        } else if (attrDef.getDataType().isNumeric()) {
          validCharactersConstraint =
              (ValidCharactersConstraint)
                  dataDictionaryService.getDictionaryBean(FLOATING_POINT_PATTERN_CONSTRAINT);
        } else if (attrDef.getDataType().isTemporal()) {
          if (attrDef.getDataType() == DataType.DATE) {
            validCharactersConstraint =
                (ValidCharactersConstraint)
                    dataDictionaryService.getDictionaryBean(DATE_PATTERN_CONSTRAINT);
          } else if (attrDef.getDataType() == DataType.TIMESTAMP) {
            validCharactersConstraint =
                (ValidCharactersConstraint)
                    dataDictionaryService.getDictionaryBean(TIMESTAMP_PATTERN_CONSTRAINT);
          }
        }
      }
    }
    // default to UTF8
    if (validCharactersConstraint == null) {
      validCharactersConstraint =
          (ValidCharactersConstraint)
              dataDictionaryService.getDictionaryBean(ANY_CHARACTER_PATTERN_CONSTRAINT);
    }

    return validCharactersConstraint;
  }
  /** @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeSize(java.lang.String) */
  public Integer getAttributeSize(String entryName, String attributeName) {
    Integer size = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      ControlDefinition controlDefinition = attributeDefinition.getControl();
      if (controlDefinition.isText() || controlDefinition.isCurrency()) {
        size = controlDefinition.getSize();
      }
    }

    return size;
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeValidatingExpression(java.lang.String)
   */
  public Pattern getAttributeValidatingExpression(String entryName, String attributeName) {
    Pattern regex = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null && (attributeDefinition.getValidationPattern() != null)) {
      regex = attributeDefinition.getValidationPattern().getRegexPattern();
    } else {
      // workaround for existing calls which don't bother checking for null return values
      regex = Pattern.compile(".*");
    }

    return regex;
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getAttributeForceUppercase(java.lang.String)
   */
  public Boolean getAttributeForceUppercase(String entryName, String attributeName)
      throws UnknownBusinessClassAttributeException {
    Boolean forceUppercase = null;

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition == null) {
      throw new UnknownBusinessClassAttributeException(
          "Could not find a matching data dictionary business class attribute entry for "
              + entryName
              + "."
              + attributeName);
    }
    forceUppercase = attributeDefinition.getForceUppercase();

    return forceUppercase;
  }
  /** @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeLabel(java.lang.String) */
  public String getAttributeLabel(String entryName, String attributeName) {
    String label = "";

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      // KULRICE-4445 prevent NullPointerException by ensuring a label is set
      label = attributeDefinition.getLabel();
      if (!StringUtils.isEmpty(attributeDefinition.getDisplayLabelAttribute())) {
        attributeDefinition =
            getAttributeDefinition(entryName, attributeDefinition.getDisplayLabelAttribute());
        if (attributeDefinition != null) {
          label = attributeDefinition.getLabel();
        }
      }
    }

    return label;
  }
  /**
   * @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeShortLabel(java.lang.String)
   */
  public String getAttributeShortLabel(String entryName, String attributeName) {
    String shortLabel = "";

    AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
    if (attributeDefinition != null) {
      if (!StringUtils.isEmpty(attributeDefinition.getDisplayLabelAttribute())) {
        attributeDefinition =
            getAttributeDefinition(entryName, attributeDefinition.getDisplayLabelAttribute());
        if (attributeDefinition != null) {
          shortLabel = attributeDefinition.getShortLabel();
        }
      } else {
        shortLabel = attributeDefinition.getShortLabel();
      }
    }

    return shortLabel;
  }
  /**
   * Calculates a map with the field length of all of the attributes of the class given by the
   * getBusinessObjectClass method
   */
  protected void initializeFieldLengthMap() {
    fieldLengthMap = new HashMap<String, Integer>();
    DataDictionaryService dataDictionaryService =
        SpringContext.getBean(DataDictionaryService.class);
    List<AttributeDefinition> attributes =
        dataDictionaryService
            .getDataDictionary()
            .getBusinessObjectEntry(getBusinessObjectClass().getName())
            .getAttributes();

    for (AttributeDefinition attributeDefinition : attributes) {
      Integer fieldLength;
      fieldLength =
          dataDictionaryService.getAttributeMaxLength(
              getBusinessObjectClass(), attributeDefinition.getName());
      fieldLengthMap.put(attributeDefinition.getName(), fieldLength);
    }
  }
  /**
   * Checks an account numbers exact length
   *
   * @param accountNumber
   * @param size to be returned
   * @return
   */
  protected boolean isValidAccountNumberLength(
      String accountNumber, AccountCreationStatusDTO accountCreationStatus) {

    boolean isValid = false;
    int fieldSize = -1;

    // grab account number length from DD and set size
    final org.kuali.rice.krad.datadictionary.BusinessObjectEntry entry =
        SpringContext.getBean(DataDictionaryService.class)
            .getDataDictionary()
            .getBusinessObjectEntry(Account.class.getName());
    AttributeDefinition attributeDefinition =
        entry.getAttributeDefinition(KFSPropertyConstants.ACCOUNT_NUMBER);

    if (ObjectUtils.isNotNull(attributeDefinition)) {
      final ValidationPattern validationPattern = attributeDefinition.getValidationPattern();

      if (ObjectUtils.isNotNull(validationPattern)
          && validationPattern instanceof AlphaNumericValidationPattern) {
        AlphaNumericValidationPattern alphaPattern =
            (AlphaNumericValidationPattern) validationPattern;
        fieldSize = alphaPattern.getExactLength();
      }
    }

    // skip if account number null
    if (ObjectUtils.isNotNull(accountNumber)) {

      // data dictionary defined size must equal length of incoming value
      if (fieldSize == accountNumber.length()) {
        isValid = true;
      }
    }

    if (isValid == false) {
      setFailStatus(
          accountCreationStatus,
          KcUtils.getErrorMessage(
              KcConstants.AccountCreationService.ERROR_KR_ALPHANUMERIC_VALIDATION_EXACT_LENGTH,
              new String[] {"account number", String.valueOf(fieldSize)}));
    }

    return isValid;
  }
 @Override
 public Control deriveControlAttributeFromMetadata(AttributeDefinition attrDef) {
   DataObjectAttribute dataObjectAttribute = attrDef.getDataObjectAttribute();
   Control c = getControlInstance(attrDef, dataObjectAttribute);
   // If we a have a control...we should - but just in case - don't want to be too dependent on
   // assumptions of the above code
   if (c != null) {
     customizeControlInstance(c, attrDef, dataObjectAttribute);
   }
   return c;
 }
  /**
   * Override of InputField copy to setup properties necessary to make the field usable for
   * inputting search criteria.
   *
   * <p>Note super is not being called because we don't want to add restirctions that can cause
   * problems with the use of wildcard {@inheritDoc}
   */
  @Override
  public void copyFromAttributeDefinition(AttributeDefinition attributeDefinition) {
    // label
    if (StringUtils.isEmpty(getLabel())) {
      setLabel(attributeDefinition.getLabel());
    }

    // short label
    if (StringUtils.isEmpty(getShortLabel())) {
      setShortLabel(attributeDefinition.getShortLabel());
    }

    // security
    if ((attributeDefinition.getAttributeSecurity() != null)
        && ((getDataFieldSecurity() == null)
            || (getDataFieldSecurity().getAttributeSecurity() == null))) {
      initializeComponentSecurity();

      getDataFieldSecurity().setAttributeSecurity(attributeDefinition.getAttributeSecurity());
    }

    // options
    if (getOptionsFinder() == null) {
      setOptionsFinder(attributeDefinition.getOptionsFinder());
    }

    // use control from dictionary if not specified and convert for searching
    if (getControl() == null) {
      Control control = convertControlToLookupControl(attributeDefinition);
      setControl(control);
    }

    // overwrite maxLength to allow for wildcards and ranges; set a minimum max length unless it is
    // greater than 100
    setMaxLength(100);
    if (attributeDefinition.getMaxLength() != null && (attributeDefinition.getMaxLength() > 100)) {
      setMaxLength(attributeDefinition.getMaxLength());
    }

    // set default value for active field to true
    if (getDefaultValue() == null
        || (getDefaultValue() instanceof String
            && StringUtils.isEmpty((String) getDefaultValue()))) {
      if ((StringUtils.equals(getPropertyName(), KRADPropertyConstants.ACTIVE))) {
        setDefaultValue(KRADConstants.YES_INDICATOR_VALUE);
      }
    }
  }
  /**
   * If control definition is defined on the given attribute definition, converts to an appropriate
   * control for searching (if necessary) and returns a copy for setting on the field.
   *
   * @param attributeDefinition attribute definition instance to retrieve control from
   * @return Control instance or null if not found
   */
  protected static Control convertControlToLookupControl(AttributeDefinition attributeDefinition) {
    if (attributeDefinition.getControlField() == null) {
      return null;
    }

    Control newControl = null;

    // convert checkbox to radio with yes/no/both options
    if (CheckboxControl.class.isAssignableFrom(attributeDefinition.getControlField().getClass())) {
      newControl =
          (RadioGroupControl)
              ComponentFactory.getNewComponentInstance(
                  ComponentFactory.CHECKBOX_CONVERTED_RADIO_CONTROL);
    }
    // text areas get converted to simple text inputs
    else if (TextAreaControl.class.isAssignableFrom(
        attributeDefinition.getControlField().getClass())) {
      newControl = ComponentFactory.getTextControl();
    } else {
      newControl = ComponentUtils.copy(attributeDefinition.getControlField(), "");
    }

    return newControl;
  }
  @SuppressWarnings("unchecked")
  protected void addAttributeSectionsToInquiryView(
      InquiryView view, DataObjectEntry dataObjectEntry) {
    // Set up data structures to manage the creation of sections
    Map<String, Group> inquirySectionsById = new HashMap<String, Group>();
    Group currentGroup = createInquirySection("default", dataObjectEntry.getObjectLabel());
    inquirySectionsById.put(currentGroup.getId(), currentGroup);
    ((List<Group>) view.getItems()).add(currentGroup);

    // Loop over the attributes on the data object, adding them into the inquiry
    // If we have an @Section notation, switch to the section, creating if the ID is unknown
    List<Component> items =
        (List<Component>) currentGroup.getItems(); // needed to deal with generics issue
    for (AttributeDefinition attr : dataObjectEntry.getAttributes()) {
      boolean dontDisplay =
          hasHintOfType(attr.getDataObjectAttribute(), UifDisplayHintType.NO_INQUIRY);
      dontDisplay |= (attr.getControlField() instanceof HiddenControl);
      // Check for a section hint
      // Create or retrieve existing section as determined by the ID on the annotation
      UifDisplayHint sectionHint =
          getHintOfType(attr.getDataObjectAttribute(), UifDisplayHintType.SECTION);
      if (sectionHint != null) {
        if (StringUtils.isNotBlank(sectionHint.id())) {
          currentGroup = inquirySectionsById.get(sectionHint.id());
          if (currentGroup == null) {
            String sectionLabel = sectionHint.label();
            if (StringUtils.isBlank(sectionLabel)) {
              sectionLabel = deriveHumanFriendlyNameFromPropertyName(sectionHint.id());
            }

            currentGroup = createInquirySection(sectionHint.id(), sectionHint.label());
            inquirySectionsById.put(currentGroup.getId(), currentGroup);
            ((List<Group>) view.getItems()).add(currentGroup);
          }
        } else {
          LOG.warn("SECTION UifDisplayHint given without an ID - assuming 'default'");
          currentGroup = inquirySectionsById.get("default");
        }
        items = (List<Component>) currentGroup.getItems();
      }

      // This is checked after the section test, since the @Section annotation
      // would be on the FK field
      if (dontDisplay) {
        continue;
      }

      DataField dataField = ComponentFactory.getDataField();
      dataField.setPropertyName(attr.getName());
      dataField.setLabel(attr.getLabel());
      items.add(dataField);
    }
  }
  private boolean verifyProposaEditableColumnsDataType(MaintenanceDocument maintenanceDocument) {
    ProposalColumnsToAlter newEditableProposalField =
        (ProposalColumnsToAlter) maintenanceDocument.getNewMaintainableObject().getDataObject();
    KcPersistenceStructureService kraPersistenceStructureService =
        KcServiceLocator.getService(KcPersistenceStructureService.class);
    DataDictionaryService dataDictionaryService =
        (DataDictionaryService) KNSServiceLocator.getDataDictionaryService();
    Map<String, String> fieldMap =
        kraPersistenceStructureService.getDBColumnToObjectAttributeMap(ProposalOverview.class);
    DataDictionaryEntry entry =
        dataDictionaryService
            .getDataDictionary()
            .getDictionaryObjectEntry(ProposalDevelopmentDocument.class.getName());

    boolean returnFlag = true;
    String editableProposalField = "";
    Integer fieldMaxLength = -1;
    Integer inputDataLength = -1;
    String proposalFieldDataType = "";
    String inputDataType = "";
    ValidationPattern validatingPattern = null;

    if (newEditableProposalField != null
        && StringUtils.isNotEmpty(newEditableProposalField.getColumnName())) {
      editableProposalField = fieldMap.get(newEditableProposalField.getColumnName());
      if (StringUtils.isNotEmpty(editableProposalField)) {
        if (entry != null) {
          AttributeDefinition attributeDefinition =
              entry.getAttributeDefinition(editableProposalField);
          if (attributeDefinition != null && attributeDefinition.hasValidationPattern()) {
            validatingPattern = attributeDefinition.getValidationPattern();
            if (validatingPattern != null) {
              proposalFieldDataType =
                  validationClassesMap.get(validatingPattern.getClass().getName());
              inputDataType = newEditableProposalField.getDataType();
              if (!proposalFieldDataType.equalsIgnoreCase(inputDataType)) {
                // throw error
                GlobalVariables.getMessageMap()
                    .putError(
                        Constants.PROPOSAL_EDITABLECOLUMN_DATATYPE,
                        KeyConstants.PROPOSAL_EDITABLECOLUMN_DATATYPE_MISMATCH);
                returnFlag = false;
              }
            }
          }
        }

        inputDataLength = newEditableProposalField.getDataLength();
        fieldMaxLength =
            dataDictionaryService.getAttributeMaxLength(
                DevelopmentProposal.class, editableProposalField);
        if (fieldMaxLength > inputDataLength) {
          // throw error
          GlobalVariables.getMessageMap()
              .putError(
                  Constants.PROPOSAL_EDITABLECOLUMN_DATALENGTH,
                  KeyConstants.PROPOSAL_EDITABLECOLUMN_DATALENGTH_MISMATCH);
          returnFlag = false;
        }
      }
    }

    return returnFlag;
  }
 protected void customizeControlInstance(
     Control c, AttributeDefinition attrDef, DataObjectAttribute dataObjectAttribute) {
   c.setRequired(attrDef.isRequired());
   if (c instanceof TextControl) {
     if (attrDef.getMaxLength() != null) {
       ((TextControl) c).setMaxLength(attrDef.getMaxLength());
       ((TextControl) c).setSize(attrDef.getMaxLength());
       // If it's a larger field, add the expand icon by default
       if (attrDef.getMaxLength() > 80) { // JHK : yes, this was a mostly arbitrary choice
         ((TextControl) c).setTextExpand(true);
       }
     }
     if (attrDef.getMinLength() != null) {
       ((TextControl) c).setMinLength(attrDef.getMinLength());
     }
   }
   if (c instanceof TextAreaControl) {
     if (attrDef.getMaxLength() != null) {
       ((TextAreaControl) c).setMaxLength(attrDef.getMaxLength());
       ((TextAreaControl) c).setRows(attrDef.getMaxLength() / ((TextAreaControl) c).getCols());
     }
     if (attrDef.getMinLength() != null) {
       ((TextAreaControl) c).setMinLength(attrDef.getMinLength());
     }
   }
 }
 /** @see org.kuali.rice.krad.service.DataDictionaryService#getAttributeInclusiveMax */
 public String getAttributeInclusiveMax(String entryName, String attributeName) {
   AttributeDefinition attributeDefinition = getAttributeDefinition(entryName, attributeName);
   return attributeDefinition == null ? null : attributeDefinition.getInclusiveMax();
 }
 protected Control getControlInstance(
     AttributeDefinition attrDef, DataObjectAttribute dataObjectAttribute) {
   Control c = null;
   // Check for the hidden hint - if present - then use that control type
   if (dataObjectAttribute != null
       && hasHintOfType(dataObjectAttribute, UifDisplayHintType.HIDDEN)) {
     c = ComponentFactory.getHiddenControl();
   } else if (attrDef.getOptionsFinder() != null) {
     // if a values finder has been established, use a radio button group or drop-down list
     if (dataObjectAttribute != null
         && hasHintOfType(dataObjectAttribute, UifDisplayHintType.RADIO)) {
       c = ComponentFactory.getRadioGroupControl();
     } else {
       c = ComponentFactory.getSelectControl();
     }
   } else if (attrDef.getName().endsWith(".principalName") && dataObjectAttribute != null) {
     // FIXME: JHK: Yes, I know this is a *HORRIBLE* hack - but the alternative
     // would look even more "hacky" and error-prone
     c = ComponentFactory.getUserControl();
     // Need to find the relationship information
     // get the relationship ID by removing .principalName from the attribute name
     String relationshipName = StringUtils.removeEnd(attrDef.getName(), ".principalName");
     DataObjectMetadata metadata =
         dataObjectService
             .getMetadataRepository()
             .getMetadata(dataObjectAttribute.getOwningType());
     if (metadata != null) {
       DataObjectRelationship relationship = metadata.getRelationship(relationshipName);
       if (relationship != null
           && CollectionUtils.isNotEmpty(relationship.getAttributeRelationships())) {
         ((UserControl) c)
             .setPrincipalIdPropertyName(
                 relationship.getAttributeRelationships().get(0).getParentAttributeName());
         ((UserControl) c)
             .setPersonNamePropertyName(
                 relationshipName + "." + KimConstants.AttributeConstants.NAME);
         ((UserControl) c).setPersonObjectPropertyName(relationshipName);
       }
     } else {
       LOG.warn(
           "Attempt to pull relationship name: "
               + relationshipName
               + " resulted in missing metadata when looking for: "
               + dataObjectAttribute.getOwningType());
     }
   } else {
     switch (attrDef.getDataType()) {
       case STRING:
         // TODO: Determine better way to store the "200" metric below
         if (attrDef.getMaxLength() != null && attrDef.getMaxLength().intValue() > 200) {
           c = ComponentFactory.getTextAreaControl();
         } else {
           c = ComponentFactory.getTextControl();
         }
         break;
       case BOOLEAN:
         c = ComponentFactory.getCheckboxControl();
         break;
       case DATE:
       case DATETIME:
       case TRUNCATED_DATE:
         c = ComponentFactory.getDateControl();
         break;
       case CURRENCY:
       case DOUBLE:
       case FLOAT:
       case INTEGER:
       case LARGE_INTEGER:
       case LONG:
       case PRECISE_DECIMAL:
         c = ComponentFactory.getTextControl();
         break;
       case MARKUP:
         c = ComponentFactory.getTextAreaControl();
         break;
       default:
         c = ComponentFactory.getTextControl();
         break;
     }
   }
   return c;
 }