/*
* Copyright 2011 JBoss Inc
*
* 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.formapi.shared.form;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jbpm.formapi.shared.api.FormItemRepresentation;
import org.jbpm.formapi.shared.api.FormRepresentation;
import org.jbpm.formapi.shared.api.InputData;
import org.jbpm.formapi.shared.api.Mappable;
import org.jbpm.formapi.shared.api.OutputData;
import org.jbpm.formapi.shared.menu.MenuItemDescription;
public abstract class AbstractFormRepresentationEncoder implements FormRepresentationEncoder {
public static String getDateFormatString() {
return "yyyy-MM-dd'T'HH:mm:ssZ";
}
@Override
public String encode(FormRepresentation form) throws FormEncodingException {
StringBuilder builder = new StringBuilder();
builder.append("{\n");
builder.append(" \"name\": ").append(encodeString(form.getName())).append(",\n");
builder.append(" \"action\": ").append(encodeString(form.getAction())).append(",\n");
builder.append(" \"processName\": ").append(encodeString(form.getProcessName())).append(",\n");
builder.append(" \"taskId\": ").append(encodeString(form.getTaskId())).append(",\n");
builder.append(" \"documentation\": ").append(encodeString(form.getDocumentation())).append(",\n");
builder.append(" \"enctype\": ").append(encodeString(form.getEnctype())).append(",\n");
builder.append(" \"lastModified\": \"").append(form.getLastModified()).append("\",\n");
builder.append(" \"method\": ").append(encodeString(form.getMethod())).append(",\n");
builder.append(" \"formItems\": ").append(encodeList(form.getFormItems())).append(",\n");
builder.append(" \"formValidations\": ").append(encodeList(form.getFormValidations())).append(",\n");
builder.append(" \"inputs\": ").append(encodeInputs(form.getInputs())).append(",\n");
builder.append(" \"outputs\": ").append(encodeOutputs(form.getOutputs())).append(",\n");
builder.append(" \"onLoadScripts\": ").append(encodeList(form.getOnLoadScripts())).append(",\n");
builder.append(" \"onSubmitScripts\": ").append(encodeList(form.getOnSubmitScripts())).append("\n");
builder.append("}\n");
return builder.toString();
}
public String encodeString(String value) {
if (value == null) {
return "null";
}
return "\"" + value + "\"";
}
public String encodeLong(Long value) {
if (value == null) {
return "null";
}
return String.valueOf(value);
}
@Override
public String encodeMenuItemsMap(Map<String, List<MenuItemDescription>> items) throws FormEncodingException {
Map<String, Object> dataMap = new HashMap<String, Object>();
if (items == null) {
return "null";
}
for (Map.Entry<String, List<MenuItemDescription>> entry : items.entrySet()) {
List<Map<String, Object>> itemMap = new ArrayList<Map<String, Object>>();
for (MenuItemDescription desc : entry.getValue()) {
itemMap.add(desc.getDataMap());
}
dataMap.put(entry.getKey(), itemMap);
}
return jsonFromMap(dataMap);
}
@Override
public String encode(FormItemRepresentation item) throws FormEncodingException {
if (item == null) {
return "null";
}
return jsonFromMap(item.getDataMap());
}
public String encodeList(List<? extends Mappable> list) {
StringBuilder builder = new StringBuilder();
if (list == null) {
builder.append("null");
} else {
builder.append("[");
Iterator<? extends Mappable> iter = list.iterator();
while(iter.hasNext()) {
Mappable mappable = iter.next();
builder.append(toJson(mappable));
if (iter.hasNext()) {
builder.append(", \n");
}
}
builder.append("]");
}
return builder.toString();
}
public String encodeInputs(Map<String, InputData> inputs) {
StringBuilder builder = new StringBuilder();
if (inputs == null) {
builder.append("null");
} else {
builder.append("{");
Iterator<Map.Entry<String, InputData>> iter = inputs.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry<String, InputData> input = iter.next();
builder.append("\"").append(input.getKey()).append("\": ");
builder.append(asJsonValue(input.getValue()));
if (iter.hasNext()) {
builder.append(", \n");
}
}
builder.append("}");
}
return builder.toString();
}
public String encodeOutputs(Map<String, OutputData> outputs) {
StringBuilder builder = new StringBuilder();
if (outputs == null) {
builder.append("null");
} else {
builder.append("{");
Iterator<Map.Entry<String, OutputData>> iter = outputs.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry<String, OutputData> output = iter.next();
builder.append("\"").append(output.getKey()).append("\": ");
builder.append(asJsonValue(output.getValue()));
if (iter.hasNext()) {
builder.append(", \n");
}
}
builder.append("}");
}
return builder.toString();
}
private String toJson(Mappable obj) {
StringBuilder builder = new StringBuilder();
if (obj == null) {
builder.append("null");
} else {
Map<String, Object> data = obj.getDataMap();
if (data != null) {
builder.append(jsonFromMap(data));
}
}
return builder.toString();
}
private String jsonFromMap(Map<String, Object> data) {
StringBuilder builder = new StringBuilder();
if (data == null) {
builder.append("null");
} else {
builder.append("{\n");
Iterator<Map.Entry<String, Object>> iter = data.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Object> entry = iter.next();
builder.append("\"").append(entry.getKey()).append("\": ").append(asJsonValue(entry.getValue()));
if (iter.hasNext()) {
builder.append(",");
}
builder.append("\n");
}
builder.append("}\n");
}
return builder.toString();
}
@SuppressWarnings("unchecked")
private String asJsonValue(Object obj) {
StringBuilder builder = new StringBuilder();
if (obj == null) {
builder.append("null");
} else if (obj instanceof Mappable) {
builder.append(jsonFromMap(((Mappable) obj).getDataMap()));
} else if (obj instanceof Map) {
builder.append(jsonFromMap((Map<String, Object>) obj));
} else if (obj instanceof List) {
builder.append(jsonFromList((List<?>) obj));
} else {
builder.append(jsonFromValue(obj));
}
return builder.toString();
}
private String jsonFromValue(Object obj) {
StringBuilder builder = new StringBuilder();
if (obj instanceof String) {
StringBuilder string = new StringBuilder();
for (int index = 0; index < obj.toString().length(); index++) {
if (obj.toString().charAt(index) == '\"') {
string.append('\\');
}
string.append(obj.toString().charAt(index));
}
builder.append("\"").append(string.toString()).append("\"");
} else if (obj instanceof Date) {
builder.append("\"").append(formatDate((Date) obj)).append("\"");
} else {
builder.append(obj);
}
return builder.toString();
}
private String jsonFromList(List<?> list) {
StringBuilder builder = new StringBuilder();
builder.append("[");
if (list != null) {
for (Iterator<?> iter = list.iterator(); iter.hasNext(); ) {
Object obj = iter.next();
builder.append(asJsonValue(obj));
if (iter.hasNext()) {
builder.append(",");
}
builder.append("\n");
}
builder.append("]\n");
}
return builder.toString();
}
public abstract Object fromMap(Map<String, Object> map);
public abstract String formatDate(Date date);
}