blob: 27acfdf829a730dc167e425d5fdc469502da1208 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.vysper.console;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jivesoftware.smackx.FormField;
import org.jivesoftware.smackx.FormField.Option;
import org.jivesoftware.smackx.packet.DataForm;
/**
* Builds an HTML form from a {@link DataForm}
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/
public class HtmlFormBuilder {
/**
* Builds an HTML form from a {@link DataForm}
* @param form
* @return
*/
public String build(DataForm form) {
if (form == null)
return "";
StringBuilder sb = new StringBuilder();
Iterator<String> instructions = form.getInstructions();
while (instructions.hasNext()) {
sb.append("<p class='instruction'>" + instructions.next() + "</p>");
}
Iterator<FormField> fields = form.getFields();
while (fields.hasNext()) {
FormField field = fields.next();
String type = field.getType();
sb.append("<p>");
if ("hidden".equals(type)) {
sb.append(hiddenFieldToHtml(field));
} else if ("fixed".equals(type)) {
sb.append(fixedFieldToHtml(field));
} else if ("jid-single".equals(type)) {
sb.append(jidSingleFieldToHtml(field));
} else if ("text-single".equals(type) || type == null) {
sb.append(textSingleFieldToHtml(field));
} else if ("text-private".equals(type)) {
sb.append(textPrivateFieldToHtml(field));
} else if ("text-multi".equals(type)) {
sb.append(textMultiFieldToHtml(field));
} else if ("list-single".equals(type)) {
sb.append(listSingleFieldToHtml(field));
} else if ("list-multi".equals(type)) {
sb.append(listMultiFieldToHtml(field));
} else if ("jid-multi".equals(type)) {
// for now, do jid-multi as a textarea
sb.append(textMultiFieldToHtml(field));
} else if ("boolean".equals(type)) {
sb.append(booleanFieldToHtml(field));
} else {
throw new RuntimeException("Unknown field type: " + type);
}
sb.append(descToHtml(field));
sb.append("</p>");
}
return sb.toString();
}
private String labelToHtml(FormField field) {
StringBuilder sb = new StringBuilder();
if (field.getLabel() != null) {
sb.append("<label for='");
sb.append(varToId(field.getVariable()));
sb.append("'>");
sb.append(field.getLabel());
sb.append("</label>");
}
return sb.toString();
}
private String descToHtml(FormField field) {
StringBuilder sb = new StringBuilder();
if (field.getDescription() != null) {
sb.append("<img src='resources/info.png' title='");
sb.append(field.getDescription());
sb.append("' />");
}
return sb.toString();
}
private String fixedFieldToHtml(FormField field) {
StringBuilder sb = new StringBuilder();
if (field.getLabel() != null)
sb.append(field.getLabel());
sb.append(" <span>" + field.getValues().next() + "</span>");
return sb.toString();
}
private String hiddenFieldToHtml(FormField field) {
return singleValueFieldToHtml(field, "hidden", null);
}
private String jidSingleFieldToHtml(FormField field) {
return singleValueFieldToHtml(field, "email", "example@vysper.org");
}
private String textSingleFieldToHtml(FormField field) {
return singleValueFieldToHtml(field, null, null);
}
private String textPrivateFieldToHtml(FormField field) {
return singleValueFieldToHtml(field, "password", null);
}
private String textMultiFieldToHtml(FormField field) {
StringBuilder sb = new StringBuilder();
sb.append(labelToHtml(field));
sb.append("<textarea id='");
sb.append(varToId(field.getVariable()));
sb.append("' name='");
sb.append(field.getVariable());
sb.append("'>");
boolean first = true;
Iterator<String> values = field.getValues();
while(values.hasNext()) {
if(!first) sb.append("\r\n");
sb.append(values.next());
first = false;
}
sb.append("</textarea>");
return sb.toString();
}
private String listSingleFieldToHtml(FormField field) {
Iterator<String> fieldValues = field.getValues();
List<String> values = new ArrayList<String>();
if(fieldValues.hasNext()) values.add(fieldValues.next());
return listFieldToHtml(field, values, false);
}
private String listMultiFieldToHtml(FormField field) {
Iterator<String> fieldValues = field.getValues();
List<String> values = new ArrayList<String>();
while(fieldValues.hasNext()) {
values.add(fieldValues.next());
}
return listFieldToHtml(field, values, true);
}
private String listFieldToHtml(FormField field, List<String> values, boolean multiple) {
StringBuilder sb = new StringBuilder();
sb.append(labelToHtml(field));
sb.append("<select id='");
sb.append(varToId(field.getVariable()));
sb.append("' name='");
sb.append(field.getVariable());
sb.append("'");
if(multiple) {
sb.append(" multiple");
}
sb.append(">");
Iterator<Option> options = field.getOptions();
while(options.hasNext()) {
Option option = options.next();
sb.append("<option value='");
sb.append(option.getValue());
sb.append("'");
if(values.contains(option.getValue())) {
sb.append(" selected");
}
sb.append(">");
if(option.getLabel() != null) {
sb.append(option.getLabel());
} else {
sb.append(option.getValue());
}
sb.append("</option>");
}
sb.append("</select>");
return sb.toString();
}
private String booleanFieldToHtml(FormField field) {
StringBuilder sb = new StringBuilder();
boolean value = (field.getValues().hasNext() && "true".equals(field.getValues().next()));
sb.append(labelToHtml(field));
sb.append("<input name='");
sb.append(field.getVariable());
sb.append("' value='true' type='radio' ");
if(value) sb.append("selected ");
sb.append("/> Yes ");
sb.append("<input name='");
sb.append(field.getVariable());
sb.append("' value='false' type='radio' ");
if(!value) sb.append("selected ");
sb.append("/> No");
return sb.toString();
}
private String singleValueFieldToHtml(FormField field, String type, String placeholder) {
StringBuilder sb = new StringBuilder();
sb.append(labelToHtml(field));
sb.append("<input id='");
sb.append(varToId(field.getVariable()));
sb.append("' name='");
sb.append(field.getVariable());
sb.append("' value='");
sb.append(getSingleValue(field));
sb.append("'");
if(type != null) {
sb.append(" type='" + type + "'");
}
if(placeholder != null) {
sb.append(" placeholder='" + placeholder + "'");
}
sb.append(required(field));
sb.append(" />");
return sb.toString();
}
private String required(FormField field) {
return field.isRequired() ? "required" : "";
}
private String getSingleValue(FormField field) {
if (field.getValues().hasNext()) {
return field.getValues().next();
} else {
return "";
}
}
private String varToId(String var) {
return var.replaceAll("[^A-Za-z0-9]", "-");
}
}