protected void addAssociation(
      Form form,
      String formSet,
      ReferencePropertyDefinition referenceDefinition,
      M2Type contentType,
      WorkflowDefinitionConversion conversion) {

    M2Model model = AlfrescoConversionUtil.getContentModel(conversion);

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

    M2ClassAssociation association = new M2ClassAssociation();
    association.setName(propertyName);
    association.setTitle(referenceDefinition.getName());
    M2AssociationSource source = new M2AssociationSource();
    source.setMany(false);
    source.setMandatory(true);
    M2AssociationTarget target = new M2AssociationTarget();
    target.setClassName(referenceDefinition.getType());
    target.setMandatory(referenceDefinition.isMandatory());

    // Determine whether or not it's allowed to select multiple targets
    boolean isTargetMany =
        extractBooleanFromParameters(
            referenceDefinition.getParameters(),
            AlfrescoConversionConstants.PARAMETER_REFERENCE_MANY,
            false);
    target.setMany(isTargetMany);

    association.setTarget(target);
    association.setSource(source);

    M2Aspect aspect = model.getAspect(propertyName);
    if (aspect != null) {
      if (aspect.getAssociations().isEmpty()) {
        aspect.getAssociations().add(association);
      }
      contentType.getMandatoryAspects().add(propertyName);
    } else {
      contentType.getAssociations().add(association);
    }

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

    FormField field = new FormField();
    form.getFormAppearance().addFormAppearanceElement(field);
    field.setId(propertyName);
    field.setSet(formSet);
  }
  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));
  }