protected void addDueDateReference(Form form, String formSet, boolean writable) {
    String fieldName = null;
    if (form.isStartForm()) {
      fieldName = AlfrescoConversionConstants.PROPERTY_WORKFLOW_DUE_DATE;
    } else {
      fieldName = AlfrescoConversionConstants.PROPERTY_DUE_DATE;
    }

    form.getFormFieldVisibility().addShowFieldElement(fieldName);

    FormField formField =
        form.getFormAppearance()
            .addFormField(
                fieldName, AlfrescoConversionConstants.FORM_WORKFLOW_DUE_DATE_LABEL, formSet);
    if (form.isStartForm() || writable) {
      formField.setControl(new FormFieldControl(AlfrescoConversionConstants.FORM_DATE_TEMPLATE));
      formField
          .getControl()
          .getControlParameters()
          .add(
              new FormFieldControlParameter(
                  AlfrescoConversionConstants.FORM_DATE_PARAM_SHOW_TIME, Boolean.FALSE.toString()));
      formField
          .getControl()
          .getControlParameters()
          .add(
              new FormFieldControlParameter(
                  AlfrescoConversionConstants.FORM_DATE_PARAM_SUBMIT_TIME,
                  Boolean.FALSE.toString()));
    } else {
      formField.setControl(
          new FormFieldControl(AlfrescoConversionConstants.FORM_READONLY_TEMPLATE));
    }
    form.getFormAppearance().addFormAppearanceElement(formField);
  }
  protected void addWorkflowDescriptionReference(Form form, String formSet) {
    String fieldName = null;
    if (form.isStartForm()) {
      fieldName = AlfrescoConversionConstants.PROPERTY_WORKFLOW_DESCRIPTION;
    } else {
      fieldName = AlfrescoConversionConstants.PROPERTY_DESCRIPTION;
    }
    form.getFormFieldVisibility().addShowFieldElement(fieldName);

    FormField descriptionField = new FormField();
    descriptionField.setId(fieldName);
    descriptionField.setLabelId(AlfrescoConversionConstants.FORM_WORKFLOW_DESCRIPTION_LABEL);
    descriptionField.setSet(formSet);
    if (form.isStartForm()) {
      descriptionField.setControl(
          new FormFieldControl(AlfrescoConversionConstants.FORM_MULTILINE_TEXT_TEMPLATE));
    } else {
      descriptionField.setControl(
          new FormFieldControl(AlfrescoConversionConstants.FORM_READONLY_TEMPLATE));
    }
    form.getFormAppearance().addFormAppearanceElement(descriptionField);
  }
  protected void addPriorityReference(Form form, String formSet, boolean writable) {

    String fieldName = null;
    if (form.isStartForm()) {
      fieldName = AlfrescoConversionConstants.PROPERTY_WORKFLOW_PRIORITY;
    } else {
      fieldName = AlfrescoConversionConstants.PROPERTY_PRIORITY;
    }
    form.getFormFieldVisibility().addShowFieldElement(fieldName);

    FormField priorityField = new FormField();
    priorityField.setSet(formSet);
    priorityField.setLabelId(AlfrescoConversionConstants.FORM_WORKFLOW_PRIORITY_LABEL);
    priorityField.setId(fieldName);

    if (form.isStartForm() || writable) {
      priorityField.setControl(
          new FormFieldControl(AlfrescoConversionConstants.FORM_PRIORITY_TEMPLATE));
    } else {
      priorityField.setControl(
          new FormFieldControl(AlfrescoConversionConstants.FORM_READONLY_TEMPLATE));
    }
    form.getFormAppearance().addFormAppearanceElement(priorityField);
  }
  protected void addPackageReference(
      Form form,
      String formSet,
      M2Type contentType,
      ReferencePropertyDefinition referenceDefinition) {
    form.getFormFieldVisibility()
        .addShowFieldElement(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS);
    form.getFormAppearance()
        .addFormField(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS, null, formSet);

    // Only take into account package-actions when we're not dealing with a start-form
    if (!form.isStartForm()) {
      boolean allowAddingItems =
          extractBooleanFromParameters(
              referenceDefinition.getParameters(),
              AlfrescoConversionConstants.PARAMETER_PACKAGEITEMS_ALLOW_ADD,
              true);
      boolean allowRemovingItems =
          extractBooleanFromParameters(
              referenceDefinition.getParameters(),
              AlfrescoConversionConstants.PARAMETER_PACKAGEITEMS_ALLOW_REMOVE,
              true);

      if (allowAddingItems) {
        M2PropertyOverride addOverride = new M2PropertyOverride();
        addOverride.setName(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ACTION_GROUP);
        addOverride.setDefaultValue(
            AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ACTION_GROUP_ADD);
        contentType.getPropertyOverrides().add(addOverride);
      }

      // Override for package item actions
      M2PropertyOverride addOverride = new M2PropertyOverride();
      contentType.getPropertyOverrides().add(addOverride);

      if (allowRemovingItems) {
        addOverride.setName(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP);
        addOverride.setDefaultValue(
            AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP_REMOVE);
      } else {
        addOverride.setName(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP);
        addOverride.setDefaultValue(
            AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP_EDIT);
      }
    }
  }
  protected void addFieldReference(
      Form form,
      String formSet,
      ReferencePropertyDefinition definition,
      M2Type contentType,
      WorkflowDefinitionConversion conversion) {
    if (form.isStartForm()) {
      throw new AlfrescoSimpleWorkflowException("Field references cannot be used on start-forms");
    }

    M2Model model = AlfrescoConversionUtil.getContentModel(conversion);

    // Check if model contains an aspect for the property
    String propertyName = getPropertyName(definition, conversion);

    if (model.getAspect(propertyName) == null) {
      throw new AlfrescoSimpleWorkflowException(
          "The property '"
              + definition.getName()
              + "' is not used in a from prior to this form: "
              + contentType.getName()
              + " - "
              + propertyName);
    }

    // Add aspect to content-type
    contentType.getMandatoryAspects().add(propertyName);

    // Add read-only field to form
    form.getFormFieldVisibility().addShowFieldElement(propertyName);

    FormField field = new FormField();
    form.getFormAppearance().addFormAppearanceElement(field);
    field.setId(propertyName);
    field.setLabelId(definition.getName());
    field.setSet(formSet);
    field.setControl(new FormFieldControl(AlfrescoConversionConstants.FORM_READONLY_TEMPLATE));
  }