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
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')
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java96
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java191
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java6
3 files changed, 290 insertions, 3 deletions
diff --git a/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java
new file mode 100644
index 0000000..411e711
--- /dev/null
+++ b/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java
@@ -0,0 +1,96 @@
+/*
+ * 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 com.isode.stroke.elements.Command;
+import com.isode.stroke.elements.Form;
+import com.isode.stroke.elements.Command.Action;
+import com.isode.stroke.elements.Command.Note;
+import com.isode.stroke.serializer.GenericPayloadSerializer;
+import com.isode.stroke.serializer.xml.XMLElement;
+import com.isode.stroke.serializer.xml.XMLRawTextNode;
+import com.isode.stroke.serializer.xml.XMLTextNode;
+
+/**
+ * Serializer for {@link Command} element.
+ */
+public class CommandSerializer extends GenericPayloadSerializer<Command> {
+ /**
+ * Constructor
+ */
+ public CommandSerializer() {
+ super(Command.class);
+ }
+
+ public String serializePayload(Command command) {
+ XMLElement commandElement = new XMLElement("command",
+ "http://jabber.org/protocol/commands");
+ commandElement.setAttribute(Command.COMMAND_ATTRIBUTE_NODE, command
+ .getNode());
+
+ if (!command.getSessionID().isEmpty()) {
+ commandElement.setAttribute(Command.COMMAND_ATTRIBUTE_SESSION_ID,
+ command.getSessionID());
+ }
+
+ String action = actionToString(command.getAction());
+ if (!action.isEmpty()) {
+ commandElement.setAttribute(Command.COMMAND_ATTRIBUTE_ACTION,
+ action);
+ }
+
+ String status = command.getStatus().getStringForm();
+ if (!status.isEmpty()) {
+ commandElement.setAttribute(Command.COMMAND_ATTRIBUTE_STATUS,
+ status);
+ }
+
+ if (command.getAvailableActions().size() > 0) {
+ String actions = "<" + Command.COMMAND_ELEMENT_ACTIONS;
+ String executeAction = actionToString(command.getExecuteAction());
+ if (!executeAction.isEmpty()) {
+ actions += " " + Command.COMMAND_ATTRIBUTE_EXECUTE + "='"
+ + executeAction + "'";
+ }
+ actions += ">";
+ for (Action act : command.getAvailableActions()) {
+ actions += "<" + actionToString(act) + "/>";
+ }
+ actions += "</" + Command.COMMAND_ELEMENT_ACTIONS + ">";
+ commandElement.addNode(new XMLRawTextNode(actions));
+ }
+
+ for (Note note : command.getNotes()) {
+ XMLElement noteElement = new XMLElement(
+ Command.COMMAND_ELEMENT_NOTE);
+ String type = note.type.getStringForm();
+ noteElement.setAttribute(Command.COMMAND_ATTRIBUTE_TYPE, type);
+ noteElement.addNode(new XMLTextNode(note.note));
+ commandElement.addNode(noteElement);
+ }
+
+ Form form = command.getForm();
+ if (form != null) {
+ FormSerializer formSerializer = new FormSerializer();
+ commandElement.addNode(new XMLRawTextNode(formSerializer
+ .serialize(form)));
+ }
+ return commandElement.serialize();
+ }
+
+ private String actionToString(Action action) {
+ return action.getStringForm();
+ }
+
+ @Override
+ public String toString() {
+ return CommandSerializer.class.getSimpleName();
+ }
+}
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();
+ }
+}
diff --git a/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java
index ddd3391..f43a47e 100644
--- a/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java
+++ b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Isode Limited, London, England.
+ * Copyright (c) 2010-2012, Isode Limited, London, England.
* All rights reserved.
*/
/*
@@ -41,9 +41,9 @@ public class FullPayloadSerializerCollection extends PayloadSerializerCollection
addSerializer(new RawXMLPayloadSerializer());
//addSerializer(new StorageSerializer());
//addSerializer(new DelaySerializer());
- //addSerializer(new FormSerializer());
+ addSerializer(new FormSerializer());
//addSerializer(new PrivateStorageSerializer(this));
- //addSerializer(new CommandSerializer());
+ addSerializer(new CommandSerializer());
//addSerializer(new NicknameSerializer());
addSerializer(new SearchPayloadSerializer());
addSerializer(new LastSerializer());