diff options
Diffstat (limited to 'src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java')
-rw-r--r-- | src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java new file mode 100644 index 0000000..6a3760b --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2012 Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010 Kevin Smith + * All rights reserved. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import java.util.List; + +import com.isode.stroke.elements.Form; +import com.isode.stroke.elements.FormField; +import com.isode.stroke.elements.FormField.BooleanFormField; +import com.isode.stroke.elements.FormField.FixedFormField; +import com.isode.stroke.elements.FormField.GenericFormField; +import com.isode.stroke.elements.FormField.HiddenFormField; +import com.isode.stroke.elements.FormField.JIDMultiFormField; +import com.isode.stroke.elements.FormField.JIDSingleFormField; +import com.isode.stroke.elements.FormField.ListMultiFormField; +import com.isode.stroke.elements.FormField.ListSingleFormField; +import com.isode.stroke.elements.FormField.Option; +import com.isode.stroke.elements.FormField.TextMultiFormField; +import com.isode.stroke.elements.FormField.TextPrivateFormField; +import com.isode.stroke.elements.FormField.TextSingleFormField; +import com.isode.stroke.jid.JID; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLTextNode; + +/** + * Serializer for {@link Form} element. + */ +public class FormSerializer extends GenericPayloadSerializer<Form> { + /** + * Constructor + */ + public FormSerializer() { + super(Form.class); + } + + public String serializePayload(Form form) { + XMLElement formElement = new XMLElement("x", "jabber:x:data"); + String type = form.getType().getStringForm(); + formElement.setAttribute(Form.FORM_ATTRIBUTE_TYPE, type); + if (!form.getTitle().isEmpty()) { + multiLineify(form.getTitle(), Form.FORM_ELEMENT_TITLE, formElement); + } + if (!form.getInstructions().isEmpty()) { + multiLineify(form.getInstructions(), + Form.FORM_ELEMENT_INSTRUCTIONS, formElement); + } + for (FormField field : form.getFields()) { + formElement.addNode(fieldToXML(field)); + } + return formElement.serialize(); + } + + private XMLElement fieldToXML(FormField field) { + XMLElement fieldElement = new XMLElement(Form.FORM_ELEMENT_FIELD); + if (!field.getName().isEmpty()) { + fieldElement.setAttribute(FormField.FORM_FIELD_ATTRIBUTE_VAR, field + .getName()); + } + if (!field.getLabel().isEmpty()) { + fieldElement.setAttribute(FormField.FORM_FIELD_ATTRIBUTE_LABEL, + field.getLabel()); + } + if (field.getRequired()) { + fieldElement.addNode(new XMLElement( + FormField.FORM_FIELD_ELEMENT_REQUIRED)); + } + if (!field.getDescription().isEmpty()) { + XMLElement descriptionElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_DESC); + descriptionElement.addNode(new XMLTextNode(field.getDescription())); + fieldElement.addNode(descriptionElement); + } + + // Set the value and type + String fieldType = ""; + if (field instanceof BooleanFormField) { + fieldType = FormField.FORM_FIELD_TYPE_BOOLEAN; + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_VALUE); + valueElement.addNode(XMLTextNode.create(((BooleanFormField) field) + .getValue() ? "1" : "0")); + fieldElement.addNode(valueElement); + } else if (field instanceof FixedFormField) { + fieldType = FormField.FORM_FIELD_TYPE_FIXED; + serializeValueAsString((FixedFormField) field, fieldElement); + } else if (field instanceof HiddenFormField) { + fieldType = FormField.FORM_FIELD_TYPE_HIDDEN; + serializeValueAsString((HiddenFormField) field, fieldElement); + } else if (field instanceof ListSingleFormField) { + fieldType = FormField.FORM_FIELD_TYPE_LIST_SINGLE; + serializeValueAsString((ListSingleFormField) field, fieldElement); + } else if (field instanceof TextPrivateFormField) { + fieldType = FormField.FORM_FIELD_TYPE_TEXT_PRIVATE; + serializeValueAsString((TextPrivateFormField) field, fieldElement); + } else if (field instanceof TextSingleFormField) { + fieldType = FormField.FORM_FIELD_TYPE_TEXT_SINGLE; + serializeValueAsString((TextSingleFormField) field, fieldElement); + } else if (field instanceof JIDMultiFormField) { + fieldType = FormField.FORM_FIELD_TYPE_JID_MULTI; + List<JID> jids = ((JIDMultiFormField) (field)).getValue(); + for (JID jid : jids) { + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_VALUE); + valueElement.addNode(XMLTextNode.create(jid.toString())); + fieldElement.addNode(valueElement); + } + } else if (field instanceof JIDSingleFormField) { + fieldType = FormField.FORM_FIELD_TYPE_JID_SINGLE; + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_VALUE); + JIDSingleFormField jidSingleFormField = (JIDSingleFormField) field; + valueElement.addNode(XMLTextNode.create(jidSingleFormField + .getValue().toString())); + fieldElement.addNode(valueElement); + } else if (field instanceof ListMultiFormField) { + fieldType = FormField.FORM_FIELD_TYPE_LIST_MULTI; + List<String> lines = ((ListMultiFormField) (field)).getValue(); + for (String line : lines) { + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_VALUE); + valueElement.addNode(XMLTextNode.create(line)); + fieldElement.addNode(valueElement); + } + } else if (field instanceof TextMultiFormField) { + fieldType = FormField.FORM_FIELD_TYPE_TEXT_MULTI; + multiLineify(((TextMultiFormField) field).getValue(), + FormField.FORM_FIELD_ELEMENT_VALUE, fieldElement); + } else { + assert (false); + } + + if (!fieldType.isEmpty()) { + fieldElement.setAttribute(FormField.FORM_FIELD_ATTRIBUTE_TYPE, + fieldType); + } + + for (Option option : field.getOptions()) { + XMLElement optionElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_OPTION); + if (!option.label.isEmpty()) { + optionElement.setAttribute( + FormField.FORM_FIELD_ATTRIBUTE_OPTION_LABEL, + option.label); + } + + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_OPTION_VALUE); + valueElement.addNode(XMLTextNode.create(option.value)); + optionElement.addNode(valueElement); + + fieldElement.addNode(optionElement); + } + + return fieldElement; + } + + private void multiLineify(String text, String elementName, + XMLElement element) { + String unRdText = text.replaceAll("\r", ""); + String[] lines = unRdText.split("\n"); + for (String line : lines) { + XMLElement lineElement = new XMLElement(elementName); + lineElement.addNode(new XMLTextNode(line)); + element.addNode(lineElement); + } + } + + private static void serializeValueAsString(GenericFormField<String> field, + XMLElement parent) { + String value = field.getValue(); + if (!value.isEmpty()) { + XMLElement valueElement = new XMLElement( + FormField.FORM_FIELD_ELEMENT_VALUE); + valueElement.addNode(XMLTextNode.create(value)); + parent.addNode(valueElement); + } + } + + @Override + public String toString() { + return FormSerializer.class.getSimpleName(); + } +} |