/* 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 java.util.HashMap;
import java.util.Map;
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.form.AlfrescoTransitionsPropertyDefinition;
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.FormSet;
import org.activiti.workflow.simple.converter.WorkflowDefinitionConversion;
import org.activiti.workflow.simple.definition.form.FormDefinition;
import org.activiti.workflow.simple.definition.form.FormPropertyDefinition;
import org.activiti.workflow.simple.definition.form.FormPropertyGroup;
/**
* Populates content-model and form-config based on a {@link FormDefinition}.
*
* @author Frederik Heremans
*/
public class AlfrescoFormCreator {
private Map<Class<? extends FormPropertyDefinition>, AlfrescoFormPropertyConverter> propertyConverters;
public AlfrescoFormCreator() {
propertyConverters = new HashMap<Class<? extends FormPropertyDefinition>, AlfrescoFormPropertyConverter>();
registerConverter(new AlfrescoTextPropertyConverter());
registerConverter(new AlfrescoDatePropertyConverter());
registerConverter(new AlfrescoNumberPropertyConverter());
registerConverter(new AlfrescoListPropertyConverter());
registerConverter(new AlfrescoReferencePropertyConverter());
registerConverter(new AlfrescoBooleanPropertyConverter());
registerConverter(new AlfrescoTransitionsPropertyConverter());
}
public void createForm(M2Type contentType, Form formConfig, FormDefinition formDefinition, WorkflowDefinitionConversion conversion) {
if(formDefinition != null && formDefinition.getFormGroups() != null) {
for(FormPropertyGroup group : formDefinition.getFormGroups()) {
// Create a group in the form-config
String groupId = null;
if(group.getId() != null) {
groupId = AlfrescoConversionUtil.getValidIdString(group.getId());
} else {
groupId = AlfrescoConversionUtil.getValidIdString(group.getTitle());
}
FormSet formSet = formConfig.getFormAppearance().addFormSet(groupId, getAppearanceForGroup(group), group.getTitle(), getTemplateForGroup(group));
// Convert all properties
AlfrescoFormPropertyConverter converter = null;
for(FormPropertyDefinition property : group.getFormPropertyDefinitions()) {
converter = propertyConverters.get(property.getClass());
if(converter == null) {
throw new AlfrescoSimpleWorkflowException("Unsupported property type: " + property.getClass().getName());
}
converter.convertProperty(contentType, formSet.getId(), formConfig, property, conversion);
}
}
}
if(formDefinition != null && formDefinition.getFormPropertyDefinitions() != null && !formDefinition.getFormPropertyDefinitions().isEmpty()) {
for(FormPropertyDefinition def : formDefinition.getFormPropertyDefinitions()) {
if(def instanceof AlfrescoTransitionsPropertyDefinition) {
AlfrescoFormPropertyConverter converter = propertyConverters.get(def.getClass());
if(converter != null) {
converter.convertProperty(contentType, null, formConfig, def, conversion);
}
}
}
}
// Finally, add default "transitions" if not already added to the model
if(formConfig.getFormAppearance().getFormSet(AlfrescoConversionConstants.FORM_SET_RESPONSE) == null) {
formConfig.getFormAppearance().addFormSet(AlfrescoConversionConstants.FORM_SET_RESPONSE, null, null, null);
formConfig.getFormFieldVisibility().addShowFieldElement(AlfrescoConversionConstants.FORM_FIELD_TRANSITIONS);
formConfig.getFormAppearance().addFormField(AlfrescoConversionConstants.FORM_FIELD_TRANSITIONS, null, AlfrescoConversionConstants.FORM_SET_RESPONSE);
}
}
protected String getTemplateForGroup(FormPropertyGroup group) {
String template = null;
if(group.getType() != null) {
if(AlfrescoConversionConstants.FORM_GROUP_LAYOUT_2_COLUMNS.equals(group.getType())) {
template = AlfrescoConversionConstants.FORM_SET_TEMPLATE_2_COLUMN;
} else if (AlfrescoConversionConstants.FORM_GROUP_LAYOUT_3_COLUMNS.equals(group.getType())) {
template = AlfrescoConversionConstants.FORM_SET_TEMPLATE_3_COLUMN;
}
}
return template;
}
protected String getAppearanceForGroup(FormPropertyGroup group) {
if(group.getTitle() != null && !group.getTitle().isEmpty()) {
return AlfrescoConversionConstants.FORM_SET_APPEARANCE_TITLE;
} else {
return null;
}
}
protected void registerConverter(AlfrescoFormPropertyConverter converter) {
propertyConverters.put(converter.getConvertedClass(), converter);
}
}