diff options
author | Mili Verma <mili.verma@isode.com> | 2012-01-06 15:00:55 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2012-01-09 15:54:52 (GMT) |
commit | cc760bfd15caadb56bfef477cb54dc94c25f7fa7 (patch) | |
tree | 05f5918b97488b05ca1266c0644a3874adb98129 /src/com/isode/stroke/serializer/payloadserializers | |
parent | 12b1d667965556002ea0fd300a71bcdf57634e90 (diff) | |
download | stroke-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')
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()); |