/**
* 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.components.editor;
import org.apache.commons.lang3.StringUtils;
import org.jbpm.formModeler.core.config.builders.dataHolder.RangedDataHolderBuilder;
import org.slf4j.Logger;
import org.jbpm.formModeler.core.config.DataHolderManager;
import org.jbpm.formModeler.core.config.FieldTypeManager;
import org.jbpm.formModeler.api.model.DataFieldHolder;
import org.jbpm.formModeler.api.model.DataHolder;
import org.jbpm.formModeler.api.model.FieldType;
import org.jbpm.formModeler.api.model.Form;
import org.jbpm.formModeler.core.config.builders.dataHolder.DataHolderBuilder;
import org.jbpm.formModeler.service.bb.mvc.taglib.formatter.Formatter;
import org.jbpm.formModeler.service.bb.mvc.taglib.formatter.FormatterException;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Named("DataHoldersFormFormatter")
public class DataHoldersFormFormatter extends Formatter {
private Logger log = LoggerFactory.getLogger(DataHoldersFormFormatter.class);
@Inject
private WysiwygFormEditor wysiwygFormEditor;
@Inject
private DataHolderManager dataHolderManager;
@Inject
private FieldTypeManager fieldTypeManager;
public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws FormatterException {
try {
if (WysiwygFormEditor.EDITION_OPTION_BINDINGS_FIELDS.equals(wysiwygFormEditor.getCurrentEditionOption())) {
renderPendingFields();
} else {
renderDataHolders();
}
} catch (Exception e) {
log.error(" DataHoldersFormFormatter rendering error");
}
}
public void renderDataHolders() {
try {
renderFragment("outputStartHeader");
for (DataHolderBuilder builder : dataHolderManager.getHolderBuilders()) {
if (builder instanceof RangedDataHolderBuilder) notifyHolderBuilder((RangedDataHolderBuilder)builder, wysiwygFormEditor.getCurrentEditionContext().getPath());
else notifyHolderBuilder(builder);
}
renderFragment("outputEndHeader");
renderFragment("outputStart");
Form form = wysiwygFormEditor.getCurrentForm();
Set<DataHolder> holders = form.getHolders();
String existingIds ="\"\"";
String existingInputIds ="\"\"";
String existingOutputIds ="\"\"";
for (DataHolder holder : holders) {
if (!StringUtils.isEmpty(holder.getInputId())) existingInputIds+= ", \""+holder.getInputId()+"\" ";
if (!StringUtils.isEmpty(holder.getOuputId())) existingOutputIds+= ", \""+holder.getOuputId()+"\" ";
if (!StringUtils.isEmpty(holder.getUniqeId())) existingIds+= ", \""+holder.getUniqeId()+"\" ";
}
setAttribute("existingIds", existingIds);
setAttribute("existingInputIds", existingInputIds);
setAttribute("existingOutputIds", existingOutputIds);
renderFragment("outputFormAddHolderStart");
Map<String, String> colors = dataHolderManager.getHolderColors();
for (Iterator it = colors.keySet().iterator(); it.hasNext();) {
String color = (String) it.next();
String name = colors.get(color);
setAttribute("color", color);
setAttribute("name", name);
renderFragment("color");
}
Map<String, String> builderNames = new HashMap<String, String>();
// Render source types sorted by value.
renderFragment("outputFormHolderTypes");
for (DataHolderBuilder builder : dataHolderManager.getHolderBuilders()) {
String holderName = builder.getDataHolderName(getLocale());
builderNames.put(builder.getId(), holderName);
setAttribute("holderType", builder.getId());
setAttribute("holderName", holderName);
renderFragment("outputHolderType");
}
renderFragment("outputEndHolderTypes");
renderFragment("outputStartBindings");
int i=0;
for (DataHolder holder : holders) {
setAttribute("id", StringUtils.defaultString(holder.getUniqeId()));
setAttribute("input_id", StringUtils.defaultString(holder.getInputId()));
setAttribute("outId", StringUtils.defaultString(holder.getOuputId()));
setAttribute("deleteId", StringUtils.defaultString(holder.getUniqeId()));
setAttribute("type", builderNames.get(StringUtils.defaultIfEmpty(holder.getSupportedType(), holder.getTypeCode())));
setAttribute("renderColor", holder.getRenderColor());
setAttribute("value", holder.getInfo());
setAttribute("rowStyle",i%2==1 ? "skn-even_row":"skn-odd_row" );
i++;
renderFragment("outputBindings");
}
renderFragment("outputEndBindings");
renderFragment("outputEnd");
} catch (Exception e) {
log.error("Error:", e);
}
}
public void notifyHolderBuilder(DataHolderBuilder builder) throws Exception {
setAttribute("id", builder.getId());
renderFragment("notifyHolderBuilder");
}
public void notifyHolderBuilder(RangedDataHolderBuilder builder, String path) throws Exception {
setAttribute("id", builder.getId());
Map<String, String> values = builder.getHolderSources(path);
StringBuffer comboJSON = new StringBuffer("[");
if (values!= null ) {
for (Iterator it = values.keySet().iterator(); it.hasNext();) {
if (comboJSON.length() > 1) comboJSON .append(",");
String key = (String) it.next();
String value = values.get(key);
comboJSON.append("{key:\"").append(key).append("\",").append("value:\"").append(value).append("\"}");
}
}
comboJSON.append("]");
setAttribute("comboValues", comboJSON.toString());
renderFragment("notifyComboHolderBuilder");
}
public void renderPendingFields() throws Exception {
WysiwygFormEditor wysiwygFormEditor = WysiwygFormEditor.lookup();
Form form = wysiwygFormEditor.getCurrentForm();
Set<DataHolder> holders = form.getHolders();
renderFragment("outputStart");
for (DataHolder dataHolder : holders) {
Set<DataFieldHolder> dataFieldHolders = getUnBindedFields(form, dataHolder);
if (dataFieldHolders != null && !dataFieldHolders.isEmpty()) {
if (dataHolder.canHaveChildren()) {
setAttribute("id", dataHolder.getUniqeId());
setAttribute("type", dataHolder.getTypeCode());
setAttribute("renderColor", dataHolder.getRenderColor());
if (dataHolder.getUniqeId() != null && dataHolder.getUniqeId().equals(wysiwygFormEditor.getLastDataHolderUsedId())) {
setAttribute("open", Boolean.TRUE);
} else {
setAttribute("open", Boolean.FALSE);
}
String holderName = "";
holderName=dataHolder.getUniqeId();
if (holderName.length() > 20) holderName = holderName.substring(0, 19) + "...";
setAttribute("showHolderName", holderName);
renderFragment("outputBinding");
}
for (DataFieldHolder dataFieldHolder : dataFieldHolders) {
String fieldName = dataFieldHolder.getId();
if (fieldName != null && !form.isFieldBinded(dataHolder, fieldName)) {
renderAddField(fieldName, dataFieldHolder, dataHolder);
}
}
if (dataHolder.canHaveChildren()) {
renderFragment("outputEndBinding");
}
}
}
renderFragment("outputEnd");
}
protected Set<DataFieldHolder> getUnBindedFields(Form form, DataHolder dataHolder) {
Set<DataFieldHolder> dataFieldHolders = dataHolder.getFieldHolders();
Set<DataFieldHolder> result = new TreeSet<DataFieldHolder>();
if (dataFieldHolders == null || dataFieldHolders.isEmpty()) return result;
for (DataFieldHolder dataFieldHolder : dataFieldHolders) {
String fieldName = dataFieldHolder.getId();
if (fieldName != null && !form.isFieldBinded(dataHolder, fieldName)) {
result.add(dataFieldHolder);
}
}
return result;
}
public void renderAddField(String fieldName, DataFieldHolder dataFieldHolder, DataHolder dataHolder) {
FieldType type = fieldTypeManager.getTypeByClass(dataFieldHolder.getClassName());
if (type == null) return;
setAttribute("renderColor", dataHolder.getRenderColor());
setAttribute("typeName", type.getCode());
setAttribute("bindingId", dataHolder.getUniqeId());
setAttribute("showFieldName", ((fieldName != null && fieldName.length() < 17) ? fieldName : fieldName.substring(0, 13) + "..."));
setAttribute("iconUri", fieldTypeManager.getIconPathForCode(type.getCode()));
setAttribute("fieldName", fieldName);
renderFragment("outputField");
}
}