/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.workflow.simple.alfresco.conversion.form;
import org.activiti.workflow.simple.alfresco.conversion.AlfrescoConversionConstants;
import org.activiti.workflow.simple.alfresco.conversion.AlfrescoConversionUtil;
import org.activiti.workflow.simple.alfresco.conversion.exception.AlfrescoSimpleWorkflowException;
import org.activiti.workflow.simple.alfresco.conversion.script.PropertyReference;
import org.activiti.workflow.simple.alfresco.model.M2Aspect;
import org.activiti.workflow.simple.alfresco.model.M2AssociationSource;
import org.activiti.workflow.simple.alfresco.model.M2AssociationTarget;
import org.activiti.workflow.simple.alfresco.model.M2ClassAssociation;
import org.activiti.workflow.simple.alfresco.model.M2Model;
import org.activiti.workflow.simple.alfresco.model.M2PropertyOverride;
import org.activiti.workflow.simple.alfresco.model.M2Type;
import org.activiti.workflow.simple.alfresco.model.config.Form;
import org.activiti.workflow.simple.alfresco.model.config.FormField;
import org.activiti.workflow.simple.alfresco.model.config.FormFieldControl;
import org.activiti.workflow.simple.alfresco.model.config.FormFieldControlParameter;
import org.activiti.workflow.simple.converter.WorkflowDefinitionConversion;
import org.activiti.workflow.simple.definition.form.FormPropertyDefinition;
import org.activiti.workflow.simple.definition.form.ReferencePropertyDefinition;
public class AlfrescoReferencePropertyConverter extends BaseAlfrescoFormPropertyConverter {
@Override
public Class<? extends FormPropertyDefinition> getConvertedClass() {
return ReferencePropertyDefinition.class;
}
@Override
public void convertProperty(M2Type contentType, String formSet, Form form, FormPropertyDefinition propertyDefinition,
WorkflowDefinitionConversion conversion) {
ReferencePropertyDefinition referenceDefinition = (ReferencePropertyDefinition) propertyDefinition;
if (AlfrescoConversionConstants.FORM_REFERENCE_DUEDATE.equals(referenceDefinition.getType())) {
addDueDateReference(form, formSet, referenceDefinition.isWritable());
} else if (AlfrescoConversionConstants.FORM_REFERENCE_PACKAGE_ITEMS.equals(referenceDefinition.getType())) {
addPackageReference(form, formSet, contentType, referenceDefinition);
} else if (AlfrescoConversionConstants.FORM_REFERENCE_EMAIL_NOTIFICATION.equals(referenceDefinition.getType())) {
addEmailNotificationReference(form, formSet, contentType, referenceDefinition);
} else if (AlfrescoConversionConstants.FORM_REFERENCE_PRIORITY.equals(referenceDefinition.getType())) {
addPriorityReference(form, formSet, referenceDefinition.isWritable());
} else if (AlfrescoConversionConstants.FORM_REFERENCE_WORKFLOW_DESCRIPTION.equals(referenceDefinition.getType())) {
addWorkflowDescriptionReference(form, formSet);
} else if (AlfrescoConversionConstants.FORM_REFERENCE_COMMENT.equals(referenceDefinition.getType())) {
addCommentReference(form, formSet);
} else if (AlfrescoConversionConstants.FORM_REFERENCE_FIELD.equals(referenceDefinition.getType())) {
addFieldReference(form, formSet, referenceDefinition, contentType, conversion);
} else {
addAssociation(form, formSet, referenceDefinition, contentType, conversion);
}
}
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);
// In case the reference references "cm:content", use a "package-items"
// template instead
// of the normal document picker, starting from the default location
if (AlfrescoConversionConstants.CONTENT_TYPE_CONTENT.equals(referenceDefinition.getType())) {
FormFieldControl control = new FormFieldControl(AlfrescoConversionConstants.FORM_PACKAGE_ITEMS_TEMPLATE);
control.addControlParameter(AlfrescoConversionConstants.FORM_PACKAGE_ITEMS_PARAM_ROOTNODE,
AlfrescoConversionConstants.FORM_PACKAGE_ITEMS_PARAM_ROOTNODE_DEFAULT);
field.setControl(control);
// Since we use the "package" template, we need to set the special action-parameters. This might
// impact the general package actions, but it's the bes we can do without custom coding/template
addOrAlterPackageItemActions(contentType, true, true);
}
// Wire in variable output to process, if needed
addOutputProperty(referenceDefinition, propertyName, contentType.getName(), conversion);
}
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");
}
// Check if model contains an aspect for the property
String propertyName = getPropertyName(definition, conversion);
// Add property-reference to the context to be validated
PropertyReference reference = new PropertyReference(definition.getName());
AlfrescoConversionUtil.getPropertyReferences(conversion).add(reference);
// 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));
}
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 addCommentReference(Form form, String formSet) {
form.getFormFieldVisibility().addShowFieldElement(AlfrescoConversionConstants.PROPERTY_COMMENT);
FormField commentField = new FormField();
commentField.setId(AlfrescoConversionConstants.PROPERTY_COMMENT);
commentField.setLabelId(AlfrescoConversionConstants.FORM_COMMENT_LABEL);
commentField.setSet(formSet);
commentField.setControl(new FormFieldControl(AlfrescoConversionConstants.FORM_MULTILINE_TEXT_TEMPLATE));
form.getFormAppearance().addFormAppearanceElement(commentField);
}
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);
addOrAlterPackageItemActions(contentType, allowAddingItems, allowRemovingItems);
}
}
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 addEmailNotificationReference(Form form, String formSet, M2Type type, ReferencePropertyDefinition def) {
// Only relevant on a start-form
if(form.isStartForm()) {
boolean forced = extractBooleanFromParameters(def.getParameters(), AlfrescoConversionConstants.PARAMETER_FORCE_NOTOFICATIONS, false);
if(forced) {
// Notifications are needed, add an override to the model
if(type.getPropertyOverride(AlfrescoConversionConstants.PROPERTY_SEND_EMAIL_NOTIFICATIONS) == null) {
M2PropertyOverride override = new M2PropertyOverride();
override.setName(AlfrescoConversionConstants.PROPERTY_SEND_EMAIL_NOTIFICATIONS);
override.setDefaultValue(Boolean.TRUE.toString());
type.getPropertyOverrides().add(override);
}
} else {
// Render a control to select whether notifications are needed or not
form.getFormFieldVisibility().addShowFieldElement(AlfrescoConversionConstants.PROPERTY_SEND_EMAIL_NOTIFICATIONS);
FormField formField = form.getFormAppearance().addFormField(AlfrescoConversionConstants.PROPERTY_SEND_EMAIL_NOTIFICATIONS,
null, formSet);
formField.setControl(new FormFieldControl(AlfrescoConversionConstants.FORM_EMAIL_NOTIFICATION_TEMPLATE));
form.getFormAppearance().addFormAppearanceElement(formField);
}
}
}
protected void addOrAlterPackageItemActions(M2Type contentType, boolean allowAdd, boolean allowRemove) {
if(allowAdd) {
M2PropertyOverride addOverride = contentType.getPropertyOverride(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ACTION_GROUP);
if(addOverride == null) {
addOverride = new M2PropertyOverride();
addOverride.setName(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ACTION_GROUP);
contentType.getPropertyOverrides().add(addOverride);
}
addOverride.setDefaultValue(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ACTION_GROUP_ADD);
}
M2PropertyOverride removeOverride = contentType.getPropertyOverride(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP);
if(removeOverride == null) {
removeOverride = new M2PropertyOverride();
removeOverride.setName(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP);
contentType.getPropertyOverrides().add(removeOverride);
}
if(allowRemove) {
removeOverride.setDefaultValue(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP_REMOVE);
} else {
removeOverride.setDefaultValue(AlfrescoConversionConstants.PROPERTY_PACKAGEITEMS_ITEM_ACTION_GROUP_EDIT);
}
}
}