/** * Copyright (C) 2012 Red Hat, Inc. and/or its affiliates. * * 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.jbpm.formModeler.core.processing.fieldHandlers.multipleSubform; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jbpm.formModeler.api.model.Field; import org.jbpm.formModeler.api.model.Form; import org.jbpm.formModeler.core.processing.FormNamespaceData; import org.jbpm.formModeler.core.processing.FormProcessor; import org.jbpm.formModeler.core.processing.fieldHandlers.DefaultFieldHandlerFormatter; import org.jbpm.formModeler.core.processing.fieldHandlers.FieldHandlerParametersReader; import org.jbpm.formModeler.core.processing.fieldHandlers.subform.checkers.FormCheckResult; import org.jbpm.formModeler.core.processing.fieldHandlers.subform.checkers.SubformChecker; import org.jbpm.formModeler.core.processing.fieldHandlers.subform.utils.SubFormHelper; import org.jbpm.formModeler.core.processing.formRendering.FieldI18nResourceObtainer; import org.jbpm.formModeler.service.bb.mvc.taglib.formatter.FormatterException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Array; import java.util.*; @Named("CreateDynamicObjectFieldFormatter") public class CreateDynamicObjectFieldFormatter extends DefaultFieldHandlerFormatter { private static transient Logger log = LoggerFactory.getLogger(CreateDynamicObjectFieldFormatter.class); public static final String PARAM_DISPLAYPAGE = "displayPage"; public static final String PROPERTY_DISALLOW_CREATE_NEW = "disallowCreateNew"; public static final String PROPERTY_MODIFICABLE = "modificable"; public static final String PROPERTY_DELETEABLE = "deleteable"; public static final String PROPERTY_VISUALIZABLE = "visualizable"; public static final String PROPERTY_PREVIEW_ITEMS = "previewItems"; public static final String PROPERTY_SEPARATOR = "htmlContent"; @Inject protected FieldI18nResourceObtainer fieldI18nResourceObtainer; @Inject protected SubFormHelper helper; protected Boolean isReadonly; protected String renderMode; protected String fieldUID; protected String fieldNS; public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws FormatterException { Boolean displayPage = Boolean.valueOf((String) getParameter(PARAM_DISPLAYPAGE)); FieldHandlerParametersReader paramsReader = new FieldHandlerParametersReader(httpServletRequest); Field field = paramsReader.getCurrentField(); Form form = paramsReader.getCurrentForm(); String currentNamespace = paramsReader.getCurrentNamespace(); Object value = paramsReader.getCurrentFieldValue(); fieldNS = paramsReader.getCurrentFieldName(); renderMode = paramsReader.getCurrentRenderMode(); isReadonly = paramsReader.isFieldReadonly(); fieldUID = namespaceManager.squashInputName(fieldNS); CreateDynamicObjectFieldHandler fHandler = (CreateDynamicObjectFieldHandler) getFieldHandlersManager().getHandler(field.getFieldType()); Form createForm = fHandler.getCreateForm(field, currentNamespace); Set checkers = fHandler.getSubformCheckers(); for(Iterator it = checkers.iterator(); it.hasNext();) { SubformChecker checker = (SubformChecker) it.next(); FormCheckResult result = checker.checkForm(createForm); if (!result.isValid()) { setAttribute("error", result.getMessageKey()); renderFragment("renderError"); return; } } if (!fHandler.checkSubformDepthAllowed(form, currentNamespace)) return; if (!displayPage.booleanValue() && field != null && Boolean.TRUE.equals(field.getReadonly())) { includePage(fHandler.getPageToIncludeForDisplaying()); return; } FormNamespaceData rootNamespaceData = namespaceManager.getRootNamespace( fieldNS ); Integer previewIndex = helper.getPreviewFieldPosition( fieldNS ); Integer editIndex = helper.getEditFieldPosition( fieldNS ); setDefaultAttributes(field, form, currentNamespace); String height = (field.getHeight() != null && !"".equals(field.getHeight())) ? field.getHeight() : "100"; setAttribute("uid", fieldUID); setAttribute("tableEnterMode", Boolean.TRUE.equals(field.getEnableTableEnterData())); int count = 0; if (value != null) { count = ((Object[]) value).length; } setAttribute("count", count); setAttribute("name", fieldNS); setAttribute("heightDesired", height); renderFragment("outputStart"); if (previewIndex != null) { renderFragment( "previewItem" ); } else if (editIndex != null) { renderFragment( "editItem" ); } else { //First render the table. renderFragment("beforeItemsTable"); renderExistingItemsTable(form, currentNamespace, field, value); renderFragment("afterItemsTable"); boolean disableCreateNew = Boolean.TRUE.equals(field.getHideCreateItem()); if ( !disableCreateNew ) { //Then render a new item formulary setAttribute("fieldName", fieldNS); setAttribute("namespace", currentNamespace); setAttribute("field", field); setAttribute("renderMode", renderMode); setAttribute("readOnly", isReadonly); renderFragment("outputEnterDataForm"); } } renderFragment("outputEnd"); } protected void renderExistingItemsTable(Form parentForm, String currentNamespace, Field field, Object value) { Boolean displayPage = Boolean.valueOf((String) getParameter(PARAM_DISPLAYPAGE)); CreateDynamicObjectFieldHandler fieldHandler = (CreateDynamicObjectFieldHandler) getFieldHandlersManager().getHandler(field.getFieldType()); Form form; form = fieldHandler.calculateFieldForm(field, field.getTableSubform(), currentNamespace); if (value != null) { //If it is an array, convert it to a List. if (value.getClass().isArray()) { List l = new ArrayList(); for (int i = 0; i < Array.getLength(value); i++) { l.add(Array.get(value, i)); } value = l; } } List values = (List) value; if (values != null && !values.isEmpty()) { setAttribute("className", "skn-table_border"); setAttribute("uid", fieldUID); renderFragment("tableStart"); boolean modificable = !isReadonly && Boolean.TRUE.equals(field.getUpdateItems()); boolean deleteable = !isReadonly && Boolean.TRUE.equals(field.getDeleteItems()); boolean visualizable = Boolean.TRUE.equals(field.getVisualizeItem()); int colspan = 0; if (modificable) colspan++; if (deleteable) colspan++; if (visualizable) colspan++; setAttribute("colspan", colspan); renderFragment("headerStart"); Set<Field> formFields = form.getFormFields(); List<Field> sortedFields = new ArrayList(formFields); Collections.sort(sortedFields, new Field.Comparator()); for (Field formField : sortedFields) { String colLabel = StringEscapeUtils.escapeHtml4(fieldI18nResourceObtainer.getFieldLabel(formField)); setAttribute("colLabel", StringUtils.defaultString(colLabel, formField.getFieldName())); String colName = formField.getFieldName(); setAttribute("colName", colName); renderFragment("outputColumnName"); } renderFragment("headerEnd"); try { for (int i = 0; i < values.size(); i++) { setAttribute("index", i); setAttribute("deleteable", deleteable); setAttribute("modificable", modificable); setAttribute("visualizable", visualizable); setAttribute("uid", fieldUID); setAttribute("parentFormId", parentForm.getId()); setAttribute("parentNamespace", currentNamespace); setAttribute("field", field.getFieldName()); setAttribute( "namespace", fieldNS ); renderFragment("outputSubformActions"); Object o = values.get(i); setAttribute("formValues", o); setAttribute("form", form); String rowNamespace = fieldNS + FormProcessor.CUSTOM_NAMESPACE_SEPARATOR + i; getFormProcessor().read(form, rowNamespace, (Map) o); setAttribute("namespace", rowNamespace); if (Boolean.TRUE.equals(field.getEnableTableEnterData())) setAttribute("renderMode", renderMode); else setAttribute("renderMode", Form.RENDER_MODE_DISPLAY); if (isReadonly) setAttribute("readonly", isReadonly); setAttribute("labelMode", Form.LABEL_MODE_HIDDEN); renderFragment("tableRow"); } } catch (Exception e) { log.error("Error: ", e); } renderFragment("tableEnd"); } } }