summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMili Verma <mili.verma@isode.com>2012-01-06 15:00:55 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-01-09 15:54:52 (GMT)
commitcc760bfd15caadb56bfef477cb54dc94c25f7fa7 (patch)
tree05f5918b97488b05ca1266c0644a3874adb98129 /src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java
parent12b1d667965556002ea0fd300a71bcdf57634e90 (diff)
downloadstroke-cc760bfd15caadb56bfef477cb54dc94c25f7fa7.zip
stroke-cc760bfd15caadb56bfef477cb54dc94c25f7fa7.tar.bz2
Port Adhoc commands to Stroke
This patch ports the Adhoc commands from Swiften to Stroke. It also ports their unit tests. Test-information: Unit tests pass. MLC able to use the ad-hoc command fine.
Diffstat (limited to 'src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java')
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java191
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();
+ }
+}