public Boolean getAllowsNoteAttachments() {
   if (allowsNoteAttachments == null) {
     DocumentEntry entry =
         (DocumentEntry)
             getDataDictionaryService().getDataDictionary().getDocumentEntry(getClass().getName());
     allowsNoteAttachments = entry.getAllowsNoteAttachments();
   }
   return allowsNoteAttachments;
 }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getDocumentClassByTypeName(java.lang.String)
   */
  public Class<? extends Document> getDocumentClassByTypeName(String documentTypeName) {
    Class clazz = null;

    DocumentEntry documentEntry = getDataDictionary().getDocumentEntry(documentTypeName);
    if (documentEntry != null) {
      clazz = documentEntry.getDocumentClass();
    }

    return clazz;
  }
  /**
   * Produces legacy KNS rows to use for search attributes. This method was left intact to help ease
   * conversion until KNS is replaced with KRAD.
   */
  protected List<Row> getSearchingRows(String documentTypeName) {

    List<Row> docSearchRows = new ArrayList<Row>();

    Class boClass = DocumentHeader.class;

    Field descriptionField = FieldUtils.getPropertyField(boClass, "documentDescription", true);
    descriptionField.setFieldDataType(
        KewApiConstants.SearchableAttributeConstants.DATA_TYPE_STRING);

    Field orgDocNumberField =
        FieldUtils.getPropertyField(boClass, "organizationDocumentNumber", true);
    orgDocNumberField.setFieldDataType(
        KewApiConstants.SearchableAttributeConstants.DATA_TYPE_STRING);

    List<Field> fieldList = new ArrayList<Field>();
    fieldList.add(descriptionField);
    docSearchRows.add(new Row(fieldList));

    fieldList = new ArrayList<Field>();
    fieldList.add(orgDocNumberField);
    docSearchRows.add(new Row(fieldList));

    DocumentEntry entry =
        KRADServiceLocatorWeb.getDataDictionaryService()
            .getDataDictionary()
            .getDocumentEntry(documentTypeName);
    if (entry == null) return docSearchRows;
    if (entry instanceof MaintenanceDocumentEntry) {
      Class<? extends BusinessObject> businessObjectClass =
          getBusinessObjectClass(documentTypeName);
      Class<? extends Maintainable> maintainableClass = getMaintainableClass(documentTypeName);

      KualiGlobalMaintainableImpl globalMaintainable = null;
      try {
        globalMaintainable = (KualiGlobalMaintainableImpl) maintainableClass.newInstance();
        businessObjectClass = globalMaintainable.getPrimaryEditedBusinessObjectClass();
      } catch (Exception ie) {
        // was not a globalMaintainable.
      }

      if (businessObjectClass != null)
        docSearchRows.addAll(createFieldRowsForBusinessObject(businessObjectClass));
    }

    WorkflowAttributes workflowAttributes = entry.getWorkflowAttributes();
    if (workflowAttributes != null)
      docSearchRows.addAll(createFieldRowsForWorkflowAttributes(workflowAttributes));

    return docSearchRows;
  }
  /**
   * @see
   *     org.kuali.rice.krad.service.DataDictionaryService#getDocumentTypeNameByClass(java.lang.Class)
   */
  public String getDocumentTypeNameByClass(Class documentClass) {
    if (documentClass == null) {
      throw new IllegalArgumentException("invalid (null) documentClass");
    }
    if (!Document.class.isAssignableFrom(documentClass)) {
      throw new IllegalArgumentException("invalid (non-Document) documentClass");
    }

    String documentTypeName = null;

    DocumentEntry documentEntry = getDataDictionary().getDocumentEntry(documentClass.getName());
    if (documentEntry != null) {
      documentTypeName = documentEntry.getDocumentTypeName();
    }

    return documentTypeName;
  }
  @Override
  public List<DocumentAttribute> extractDocumentAttributes(
      ExtensionDefinition extensionDefinition, DocumentWithContent documentWithContent) {
    List<DocumentAttribute> attributes = new ArrayList<DocumentAttribute>();

    String docId = documentWithContent.getDocument().getDocumentId();

    DocumentService docService = KRADServiceLocatorWeb.getDocumentService();
    Document doc = null;
    try {
      doc = docService.getByDocumentHeaderIdSessionless(docId);
    } catch (WorkflowException we) {
      LOG.error("Unable to retrieve document " + docId + " in getSearchStorageValues()", we);
    }

    String attributeValue = "";
    if (doc != null) {
      if (doc.getDocumentHeader() != null) {
        attributeValue = doc.getDocumentHeader().getDocumentDescription();
      } else {
        attributeValue = "null document header";
      }
    } else {
      attributeValue = "null document";
    }
    DocumentAttributeString attribute =
        DocumentAttributeFactory.createStringAttribute("documentDescription", attributeValue);
    attributes.add(attribute);

    attributeValue = "";
    if (doc != null) {
      if (doc.getDocumentHeader() != null) {
        attributeValue = doc.getDocumentHeader().getOrganizationDocumentNumber();
      } else {
        attributeValue = "null document header";
      }
    } else {
      attributeValue = "null document";
    }
    attribute =
        DocumentAttributeFactory.createStringAttribute(
            "organizationDocumentNumber", attributeValue);
    attributes.add(attribute);

    if (doc != null && doc instanceof MaintenanceDocument) {
      final Class<? extends BusinessObject> businessObjectClass =
          getBusinessObjectClass(documentWithContent.getDocument().getDocumentTypeName());
      if (businessObjectClass != null) {
        if (GlobalBusinessObject.class.isAssignableFrom(businessObjectClass)) {
          final GlobalBusinessObject globalBO =
              retrieveGlobalBusinessObject(docId, businessObjectClass);

          if (globalBO != null) {
            attributes.addAll(findAllDocumentAttributesForGlobalBusinessObject(globalBO));
          }
        } else {
          attributes.addAll(
              parsePrimaryKeyValuesFromDocument(businessObjectClass, (MaintenanceDocument) doc));
        }
      }
    }
    if (doc != null) {
      DocumentEntry docEntry =
          KRADServiceLocatorWeb.getDataDictionaryService()
              .getDataDictionary()
              .getDocumentEntry(documentWithContent.getDocument().getDocumentTypeName());
      if (docEntry != null) {
        WorkflowAttributes workflowAttributes = docEntry.getWorkflowAttributes();
        WorkflowAttributePropertyResolutionService waprs =
            KNSServiceLocator.getWorkflowAttributePropertyResolutionService();
        attributes.addAll(waprs.resolveSearchableAttributeValues(doc, workflowAttributes));
      } else {
        LOG.error(
            "Unable to find DD document entry for document type: "
                + documentWithContent.getDocument().getDocumentTypeName());
      }
    }
    return attributes;
  }