package org.jbpm.gd.jpdl.taskform; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Iterator; import java.util.List; public class FormGenerator { public static final int BUFFERSIZE = 4096; public static final String NEWLINE = System.getProperty("line.separator"); public static String getForm(List fields, List buttons) { String form = getTemplateString(); String fieldRowsText = buildFieldRows(fields); form = insert(form, "<!-- TASKFORM ROWS -->", fieldRowsText); String buttonsText = buildButtons(buttons); form = insert(form, "<!-- TASKFORM BUTTONS -->", buttonsText); return form.toString(); } /** * add value after marker in source. */ public static String insert(String source, String marker, String value) { int index = source.indexOf(marker); if (index==-1) { return source; } index = index+marker.length(); StringBuffer buffer = new StringBuffer(); buffer.append(source.substring(0, index)); buffer.append(value); buffer.append(source.substring(index+1)); return buffer.toString(); } private static String buildFieldRows(List fields) { if (fields==null) { return ""; } StringBuffer buffer = new StringBuffer(); buffer.append(NEWLINE); Iterator iter = fields.iterator(); while (iter.hasNext()) { Field field = (Field) iter.next(); buffer.append(" <jbpm:datacell>"); buffer.append(NEWLINE); buffer.append(" <f:facet name=\"header\">"); buffer.append(NEWLINE); buffer.append(" <h:outputText value=\""); buffer.append(field.getLabel()); buffer.append("\"/>"); buffer.append(NEWLINE); buffer.append(" </f:facet>"); buffer.append(NEWLINE); buffer.append(" " + field.getFieldType().render(field)); buffer.append(NEWLINE); buffer.append(" </jbpm:datacell>"); buffer.append(NEWLINE); } return buffer.toString(); } private static String buildButtons(List buttons) { if (buttons==null) { return ""; } StringBuffer buffer = new StringBuffer(); buffer.append(NEWLINE); Iterator iter = buttons.iterator(); while (iter.hasNext()) { Button button = (Button) iter.next(); buffer.append(" "); buffer.append(button.getXhtml()); if (iter.hasNext()) { buffer.append(NEWLINE); } } return buffer.toString(); } public static String getTemplateString() { StringBuffer formTemplate = new StringBuffer(); String resource = "form.template.xhtml"; InputStream inputStream = FormGenerator.class.getResourceAsStream(resource); if (inputStream==null) { throw new RuntimeException("couldn't get resource "+resource+" for form template"); } try { Reader reader = new InputStreamReader(inputStream); char[] chars = new char[BUFFERSIZE]; int charsRead = reader.read( chars ); while ( charsRead != -1 ) { formTemplate.append( chars, 0, charsRead ); charsRead = reader.read( chars ); } } catch (IOException e) { throw new RuntimeException("couldn't read form template", e); } return formTemplate.toString(); } }