From be94e872d9423501c688c84c6cb945a420a5cb18 Mon Sep 17 00:00:00 2001 From: Mili Verma Date: Tue, 10 Jan 2012 15:55:29 +0000 Subject: Update review comment related stuff This patch addresses some review comments: 1. Updates the Javadoc. 2. Disallows arguments from being null - throws NullPointerException. 3. Updates each test to use its own DummyEventLoop. Test-information: Unit tests pass. diff --git a/src/com/isode/stroke/adhoc/OutgoingAdHocCommandSession.java b/src/com/isode/stroke/adhoc/OutgoingAdHocCommandSession.java index a9db0b6..6b1d04c 100644 --- a/src/com/isode/stroke/adhoc/OutgoingAdHocCommandSession.java +++ b/src/com/isode/stroke/adhoc/OutgoingAdHocCommandSession.java @@ -53,15 +53,15 @@ public class OutgoingAdHocCommandSession { }; /** - * Emitted when the form for the next stage is available. The client should - * add a listener to this signal which will be called when the server sends + * Emitted when the form for the next stage is available. The caller should + * add a listener to this signal which will be invoked when the target sends * a form. */ public final Signal1 onNextStageReceived = new Signal1(); /** - * Emitted on error. The client should add a listener to this signal which - * will be called when the server sends an error. + * Emitted on error. The caller should add a listener to this signal which + * will be invoked when the target sends an error. */ public final Signal1 onError = new Signal1(); @@ -75,13 +75,13 @@ public class OutgoingAdHocCommandSession { /** * Create an Ad-Hoc command session. The initial command will be sent to the * server on calling {@link #start()}. - * - * @param to JID of the user for which the Ad-Hoc command is executed, must - * not be null + * + * @param to JID of the entity that the Ad-Hoc command is executed on (user + * JID, server JID, etc.), must not be null * @param commandNode Node part of the Ad-Hoc command as published by the - * server (e.g. "http://isode.com/xmpp/commands#test"), must not + * target (e.g. "http://isode.com/xmpp/commands#test"), must not * be null - * @param iqRouter TODO: not sure how to explain this, must not be null + * @param iqRouter IQ router to be used for the session, must not be null */ public OutgoingAdHocCommandSession(JID to, String commandNode, IQRouter iqRouter) { @@ -156,7 +156,7 @@ public class OutgoingAdHocCommandSession { public void start() { Action action = null; GenericRequest commandRequest = new GenericRequest( - IQ.Type.Set, to_, new Command(commandNode_, null, action), + IQ.Type.Set, to_, new Command(commandNode_, "", action), iqRouter_); commandRequest.onResponse.connect(new Slot2() { public void call(Command payload, ErrorPayload error) { diff --git a/src/com/isode/stroke/elements/Command.java b/src/com/isode/stroke/elements/Command.java index 75f3bf2..d82808f 100644 --- a/src/com/isode/stroke/elements/Command.java +++ b/src/com/isode/stroke/elements/Command.java @@ -85,9 +85,9 @@ public class Command extends Payload { /** * Get status from its string form. - * + * * @param stringForm String form of status, can be null - * + * * @return Corresponding status if match found, otherwise * {@link #NO_STATUS}. Will never be null. */ @@ -148,9 +148,9 @@ public class Command extends Payload { /** * Get action from its string form. - * + * * @param stringForm String form of action, can be null - * + * * @return Corresponding action if match found, otherwise * {@link Action#NO_ACTION}. Will never be null. */ @@ -176,7 +176,7 @@ public class Command extends Payload { /** * This class contains information about the current status of the command. - * TODO: I am not sure why this is not an immutable class. + * This is an immutable class. */ public static class Note { /** @@ -207,9 +207,9 @@ public class Command extends Payload { /** * Get type from its string form. - * + * * @param stringForm String form of type, can be null - * + * * @return Corresponding type if match found, otherwise * {@link Type#INFO}. Will never be null. */ @@ -235,15 +235,19 @@ public class Command extends Payload { /** * Create a note element for the Ad-Hoc command. - * - * @param note user-readable text, can be null which will be stored as - * an empty string - * @param type Severity of the note, can be null which will be stored as - * {@link Type#INFO} + * + * @param note user-readable text, must not be null + * @param type Severity of the note, must not be null */ public Note(String note, Type type) { - this.note = (note != null) ? note : ""; - this.type = (type != null) ? type : Type.INFO; + if (note == null) { + throw new NullPointerException("'note' must not be null"); + } + if (type == null) { + throw new NullPointerException("'type' must not be null"); + } + this.note = note; + this.type = type; } /** @@ -272,21 +276,20 @@ public class Command extends Payload { setSessionID(sessionID); setAction(action); setStatus(status); - setExecuteAction(null); + setExecuteAction(Action.NO_ACTION); } /** * Create an Ad-Hoc command with the given node, session ID, status and * {@link Action#NO_ACTION} action. - * - * @param node Command identification, can be null which will be stored as - * an empty string + * + * @param node Node, must not be null. Each command is identified by its + * 'node' attribute. This matches its 'node' attribute from the + * service discovery. * @param sessionID The ID of the session within which the command exists, - * can be null (which will be stored as an empty string) or empty - * if this is the first stage of the command and the client does - * not know it yet - * @param status Status of the command, can be null which will be stored as - * {@link Status#NO_STATUS} + * must not be null but can be empty if this is the first stage + * of the command and the client does not know it yet + * @param status Status of the command, must not be null */ public Command(String node, String sessionID, Status status) { assignData(node, sessionID, Action.NO_ACTION, status); @@ -295,18 +298,17 @@ public class Command extends Payload { /** * Create an Ad-Hoc command with the given node, session ID, action and * {@link Status#NO_STATUS} status. - * - * @param node Command identification, can be null which will be stored as - * an empty string + * + * @param node Node, must not be null. Each command is identified by its + * 'node' attribute. This matches its 'node' attribute from the + * service discovery. * @param sessionID The ID of the session within which the command exists, - * can be null (which will be stored as an empty string) or empty - * if this is the first stage of the command and the client does - * not know it yet - * @param action action of the command, can be null which will be stored as - * {@link Action#EXECUTE} + * must not be null but can be empty if this is the first stage + * of the command and the client does not know it yet + * @param action action of the command, must not be null */ public Command(String node, String sessionID, Action action) { - assignData(node, sessionID, action, null); + assignData(node, sessionID, action, Status.NO_STATUS); } /** @@ -314,24 +316,27 @@ public class Command extends Payload { * {@link Action#EXECUTE} action and {@link Status#NO_STATUS} status. */ public Command() { - this(null, null, (Action) null); + this("", "", Action.EXECUTE); } /** - * @return The command ID, will never be null + * @return Node, will never be null */ public String getNode() { return node_; } /** - * Set command ID. - * - * @param node Command identification, can be null which will be stored as - * an empty string + * Set command node. + * + * @param node Node, must not be null */ public void setNode(String node) { - node_ = (node != null) ? node : ""; + if (node == null) { + throw new NullPointerException("'node' must not be null"); + } + + node_ = node; } /** @@ -345,14 +350,17 @@ public class Command extends Payload { /** * Set session ID. - * + * * @param sessionID The ID of the session within which the command exists, - * can be null (which will be stored as an empty string) or empty - * if this is the first stage of the command and the client does - * not know it yet + * must not be null but can be empty if this is the first stage + * of the command and the client does not know it yet */ public void setSessionID(String sessionID) { - sessionID_ = (sessionID != null) ? sessionID : ""; + if (sessionID == null) { + throw new NullPointerException("'sessionID' must not be null"); + } + + sessionID_ = sessionID; } /** @@ -364,12 +372,15 @@ public class Command extends Payload { /** * Set action of the command. - * - * @param action action of the command, can be null which will be stored as - * {@link Action#EXECUTE} + * + * @param action action of the command, must not be null */ public void setAction(Action action) { - action_ = (action != null) ? action : Action.EXECUTE; + if (action == null) { + throw new NullPointerException("'action' must not be null"); + } + + action_ = action; } /** @@ -381,12 +392,15 @@ public class Command extends Payload { /** * Set execute action of the command. - * - * @param action execute action of the command, can be null which will be - * stored as {@link Action#NO_ACTION} + * + * @param action execute action of the command, must not be null */ public void setExecuteAction(Action action) { - executeAction_ = (action != null) ? action : Action.NO_ACTION; + if (action == null) { + throw new NullPointerException("'action' must not be null"); + } + + executeAction_ = action; } /** @@ -398,17 +412,21 @@ public class Command extends Payload { /** * Set status of the command. - * - * @param status Status of the command, can be null which will be stored as - * {@link Status#NO_STATUS} + * + * @param status Status of the command, must not be null */ public void setStatus(Status status) { - status_ = (status != null) ? status : Status.NO_STATUS; + if (status == null) { + throw new NullPointerException("'status' must not be null"); + } + + status_ = status; } /** * @return List of allowed actions for this stage of execution, will never - * be null + * be null. The instance of the list stored in the object is not + * returned, a copy is made. */ public List getAvailableActions() { return new ArrayList(availableActions_); @@ -416,18 +434,21 @@ public class Command extends Payload { /** * Add to the list of allowed actions for this stage of execution. - * - * @param action Action to add, can be null in which case it will be ignored + * + * @param action Action to add, must not be null */ public void addAvailableAction(Action action) { - if (action != null) { - availableActions_.add(action); + if (action == null) { + throw new NullPointerException("'action' must not be null"); } + + availableActions_.add(action); } /** * @return List of information elements for the current status of the - * command, will never be null + * command, will never be null. The instance of the list stored in + * the object is not returned, a copy is made. */ public List getNotes() { return new ArrayList(notes_); @@ -436,13 +457,15 @@ public class Command extends Payload { /** * Add to the list of information elements for the current status of the * command. - * - * @param note Note to add, can be null in which case it will be ignored + * + * @param note Note to add, must not be null */ public void addNote(Note note) { - if (note != null) { - notes_.add(note); + if (note == null) { + throw new NullPointerException("'note' must not be null"); } + + notes_.add(note); } /** @@ -455,7 +478,7 @@ public class Command extends Payload { /** * Set form for the command. - * + * * @param payload Form for the command, can be null. The instance of the * form is stored in the object, a copy is not made. */ diff --git a/src/com/isode/stroke/elements/Form.java b/src/com/isode/stroke/elements/Form.java index 1c2e830..362408a 100644 --- a/src/com/isode/stroke/elements/Form.java +++ b/src/com/isode/stroke/elements/Form.java @@ -73,9 +73,9 @@ public class Form extends Payload { /** * Get type from its string form. - * + * * @param stringForm String form of type, can be null - * + * * @return Corresponding type if match found, otherwise * {@link Type#FORM_TYPE}. Will never be null. */ @@ -106,8 +106,8 @@ public class Form extends Payload { /** * Create a form of the given type. - * - * @param type Form type, if null then {@link Type#FORM_TYPE} is assumed + * + * @param type Form type, must not be null */ public Form(Type type) { setType(type); @@ -117,26 +117,28 @@ public class Form extends Payload { * Create a form of {@link Type#FORM_TYPE}. */ public Form() { - this(null); + this(Type.FORM_TYPE); } /** * Add to the list of fields for the form. - * - * @param field Field to add, can be null in which case it will be ignored. - * The instance of the form field is stored in the object, a copy - * is not made. + * + * @param field Field to add, must not be null. The instance of the form + * field is stored in the object, a copy is not made. */ public void addField(FormField field) { - if (field != null) { - fields_.add(field); + if (field == null) { + throw new NullPointerException("'field' must not be null"); } + + fields_.add(field); } /** - * @return List of fields for the form, will never be null. The instances of - * the form fields stored in the object is returned, a copy is not - * made. + * @return List of fields for the form, will never be null. The instance of + * the list stored in the object is not returned, a copy is made. + * But the instances of the form fields stored in the list is the + * same as the list in the object, a copy is not made. */ public List getFields() { return new ArrayList(fields_); @@ -144,12 +146,15 @@ public class Form extends Payload { /** * Set title of the form. - * - * @param title title of the form, can be null in which case an empty string - * will be stored + * + * @param title title of the form, must not be null */ public void setTitle(String title) { - title_ = (title != null) ? title : ""; + if (title == null) { + throw new NullPointerException("'title' must not be null"); + } + + title_ = title; } /** @@ -161,12 +166,15 @@ public class Form extends Payload { /** * Set natural-language instructions for the form. - * - * @param instructions instructions for the form, can be null in which case - * an empty string will be stored + * + * @param instructions instructions for the form, must not be null */ public void setInstructions(String instructions) { - instructions_ = (instructions != null) ? instructions : ""; + if (instructions == null) { + throw new NullPointerException("'instructions' must not be null"); + } + + instructions_ = instructions; } /** @@ -178,11 +186,15 @@ public class Form extends Payload { /** * Set type of the form. - * - * @param type Form type, if null then {@link Type#FORM_TYPE} is assumed + * + * @param type Form type, must not be null */ public void setType(Type type) { - type_ = (type != null) ? type : Type.FORM_TYPE; + if (type == null) { + throw new NullPointerException("'type' must not be null"); + } + + type_ = type; } /** @@ -214,20 +226,21 @@ public class Form extends Payload { /** * Get form field for the given name. - * - * @param name Name of form field to retrieve, can be null in which case - * null will be returned - * + * + * @param name Name of form field to retrieve, must not be null + * * @return Form field with the given name if it is present in the form, null * otherwise. The instance of the form field stored in the object is * returned, a copy is not made. */ public FormField getField(String name) { - if (name != null) { - for (FormField field : fields_) { - if (field.getName().equals(name)) { - return field; - } + if (name == null) { + throw new NullPointerException("'name' must not be null"); + } + + for (FormField field : fields_) { + if (field.getName().equals(name)) { + return field; } } diff --git a/src/com/isode/stroke/elements/FormField.java b/src/com/isode/stroke/elements/FormField.java index 06b2ce6..aedc8fe 100644 --- a/src/com/isode/stroke/elements/FormField.java +++ b/src/com/isode/stroke/elements/FormField.java @@ -17,14 +17,15 @@ import com.isode.stroke.jid.JID; /** * This class implements the field element of a form. - * + * *

- * Data validation is the responsibility of the form-processing entity (commonly - * a server, service, or bot) rather than the form-submitting entity (commonly a - * client controlled by a human user). This helps to meet the requirement for - * keeping client implementations simple. If the form-processing entity - * determines that the data provided is not valid, it SHOULD return a - * "Not Acceptable" error, optionally providing a textual explanation. + * From http://xmpp.org/extensions/xep-0050.html: Data validation is the + * responsibility of the form-processing entity (commonly a server, service, or + * bot) rather than the form-submitting entity (commonly a client controlled by + * a human user). This helps to meet the requirement for keeping client + * implementations simple. If the form-processing entity determines that the + * data provided is not valid, it SHOULD return a "Not Acceptable" error, + * optionally providing a textual explanation. */ public class FormField { /** @@ -124,33 +125,35 @@ public class FormField { /** * This class defines the option element that can be used in - * {@link ListSingleFormField} and {@link ListMultiFormField}. TODO: This - * class should be immutable. + * {@link ListSingleFormField} and {@link ListMultiFormField}. This class is + * immutable. */ public static class Option { /** - * Human-readable name for the option, must not be null + * Human-readable name for the option, will not be null */ - public String label; + public final String label; /** - * Option value, must not be null + * Option value, will not be null */ - public String value; + public final String value; /** * Create an option element. - * - * @param label Human-readable name for the option, can be null in which - * case an empty string will be stored + * + * @param label Human-readable name for the option, must not be null * @param value Option value, must not be null */ public Option(String label, String value) { + if (label == null) { + throw new NullPointerException("'label' must not be null"); + } if (value == null) { throw new NullPointerException("'value' must not be null"); } - this.label = (label != null) ? label : ""; + this.label = label; this.value = value; } } @@ -168,12 +171,15 @@ public class FormField { /** * Set the unique identifier for the field in the form. - * - * @param name unique identifier for the field in the form, can be null in - * which case an empty string will be stored + * + * @param name unique identifier for the field in the form, must not be null */ public void setName(String name) { - this.name = (name != null) ? name : ""; + if (name == null) { + throw new NullPointerException("'name' must not be null"); + } + + this.name = name; } /** @@ -185,12 +191,15 @@ public class FormField { /** * Set the human-readable name for the field. - * - * @param label human-readable name for the field, can be null in which case - * an empty string will be stored + * + * @param label human-readable name for the field, must not be null */ public void setLabel(String label) { - this.label = (label != null) ? label : ""; + if (label == null) { + throw new NullPointerException("'label' must not be null"); + } + + this.label = label; } /** @@ -202,12 +211,16 @@ public class FormField { /** * Set the natural-language description for the field. - * - * @param description natural-language description for the field, can be - * null in which case an empty string will be stored + * + * @param description natural-language description for the field, must not + * be null */ public void setDescription(String description) { - this.description = (description != null) ? description : ""; + if (description == null) { + throw new NullPointerException("'description' must not be null"); + } + + this.description = description; } /** @@ -219,7 +232,7 @@ public class FormField { /** * Set if the field is required for the form to be considered valid. - * + * * @param required true if the field is required for the form to be * considered valid */ @@ -236,17 +249,20 @@ public class FormField { /** * Add to the list of options for this form field. - * - * @param option Option to add, can be null in which case it will be ignored + * + * @param option Option to add, must not be null */ public void addOption(Option option) { - if (option != null) { - options.add(option); + if (option == null) { + throw new NullPointerException("'option' must not be null"); } + + options.add(option); } /** - * @return List of options for this form, will never be null + * @return List of options for this form, will never be null. The instance + * of the list stored in the object is not returned, a copy is made. */ public List

{ protected GenericFormField field; public void addValue(String s) { + if (s == null) { + throw new NullPointerException("'s' must not be null"); + } + field.addRawValue(s); } @@ -48,47 +52,47 @@ public class FormParser extends GenericPayloadParser { private static class BoolFieldParseHelper extends FieldParseHelper { public void addValue(String s) { - field.setValue(((s.equals("1")) || (s.equals("true")))); super.addValue(s); + field.setValue(((s.equals("1")) || (s.equals("true")))); } } private static class StringFieldParseHelper extends FieldParseHelper { public void addValue(String s) { + super.addValue(s); if (field.getValue().isEmpty()) { field.setValue(s); } else { field.setValue(field.getValue() + "\n" + s); } - super.addValue(s); } }; private static class JIDFieldParseHelper extends FieldParseHelper { public void addValue(String s) { - field.setValue(new JID(s)); super.addValue(s); + field.setValue(new JID(s)); } }; private static class StringListFieldParseHelper extends FieldParseHelper> { public void addValue(String s) { + super.addValue(s); List l = field.getValue(); l.add(s); field.setValue(l); - super.addValue(s); } }; private static class JIDListFieldParseHelper extends FieldParseHelper> { public void addValue(String s) { + super.addValue(s); List l = field.getValue(); l.add(new JID(s)); field.setValue(l); - super.addValue(s); } }; @@ -208,7 +212,7 @@ public class FormParser extends GenericPayloadParser { private int level_; private String currentText_ = ""; - private String currentOptionLabel_; + private String currentOptionLabel_ = ""; private FieldParseHelper currentFieldParseHelper_ = null; /** @@ -221,7 +225,17 @@ public class FormParser extends GenericPayloadParser { } public void handleStartElement(String element, String ns, - AttributeMap attributes) { + final AttributeMap attributes) { + if (element == null) { + throw new NullPointerException("'element' must not be null"); + } + if (ns == null) { + throw new NullPointerException("'ns' must not be null"); + } + if (attributes == null) { + throw new NullPointerException("'attributes' must not be null"); + } + Form form = getPayloadInternal(); if (level_ == TopLevel) { @@ -296,6 +310,13 @@ public class FormParser extends GenericPayloadParser { } public void handleEndElement(String element, String ns) { + if (element == null) { + throw new NullPointerException("'element' must not be null"); + } + if (ns == null) { + throw new NullPointerException("'ns' must not be null"); + } + --level_; Form form = getPayloadInternal(); @@ -337,6 +358,10 @@ public class FormParser extends GenericPayloadParser { } public void handleCharacterData(String text) { + if (text == null) { + throw new NullPointerException("'text' must not be null"); + } + currentText_ += text; } diff --git a/src/com/isode/stroke/parser/payloadparsers/FormParserFactory.java b/src/com/isode/stroke/parser/payloadparsers/FormParserFactory.java index 228c093..0287cca 100644 --- a/src/com/isode/stroke/parser/payloadparsers/FormParserFactory.java +++ b/src/com/isode/stroke/parser/payloadparsers/FormParserFactory.java @@ -24,7 +24,18 @@ public class FormParserFactory implements PayloadParserFactory { public FormParserFactory() { } - public boolean canParse(String element, String ns, AttributeMap attributes) { + public boolean canParse(String element, String ns, + final AttributeMap attributes) { + if (element == null) { + throw new NullPointerException("'element' must not be null"); + } + if (ns == null) { + throw new NullPointerException("'ns' must not be null"); + } + if (attributes == null) { + throw new NullPointerException("'attributes' must not be null"); + } + return ns.equals("jabber:x:data"); } diff --git a/src/com/isode/stroke/queries/IQRouter.java b/src/com/isode/stroke/queries/IQRouter.java index 2f300d7..61c2221 100644 --- a/src/com/isode/stroke/queries/IQRouter.java +++ b/src/com/isode/stroke/queries/IQRouter.java @@ -8,13 +8,19 @@ */ package com.isode.stroke.queries; +import java.util.Vector; + import com.isode.stroke.elements.ErrorPayload; import com.isode.stroke.elements.IQ; import com.isode.stroke.signals.Slot1; -import java.util.Vector; /** - * Route IQs to handlers + * This class is responsible for routing all IQ stanzas to the handlers. It's + * needed because, unlike Message and Presence, there are strict rules about + * replying to IQ stanzas, replies need to be tracked, handled by the + * responsible bit of code, replied to, etc. and when it's an outgoing IQ, it + * needs to be tracked such that when the reply comes in, the callback is + * called. */ public class IQRouter { diff --git a/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java index 411e711..d4ec836 100644 --- a/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java +++ b/src/com/isode/stroke/serializer/payloadserializers/CommandSerializer.java @@ -30,6 +30,10 @@ public class CommandSerializer extends GenericPayloadSerializer { } public String serializePayload(Command command) { + if (command == null) { + throw new NullPointerException("'command' must not be null"); + } + XMLElement commandElement = new XMLElement("command", "http://jabber.org/protocol/commands"); commandElement.setAttribute(Command.COMMAND_ATTRIBUTE_NODE, command @@ -86,6 +90,10 @@ public class CommandSerializer extends GenericPayloadSerializer { } private String actionToString(Action action) { + if (action == null) { + throw new NullPointerException("'action' must not be null"); + } + return action.getStringForm(); } diff --git a/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java index 6a3760b..c2a2189 100644 --- a/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java +++ b/src/com/isode/stroke/serializer/payloadserializers/FormSerializer.java @@ -42,6 +42,10 @@ public class FormSerializer extends GenericPayloadSerializer { } public String serializePayload(Form form) { + if (form == null) { + throw new NullPointerException("'form' must not be null"); + } + XMLElement formElement = new XMLElement("x", "jabber:x:data"); String type = form.getType().getStringForm(); formElement.setAttribute(Form.FORM_ATTRIBUTE_TYPE, type); @@ -59,6 +63,10 @@ public class FormSerializer extends GenericPayloadSerializer { } private XMLElement fieldToXML(FormField field) { + if (field == null) { + throw new NullPointerException("'field' must not be null"); + } + XMLElement fieldElement = new XMLElement(Form.FORM_ELEMENT_FIELD); if (!field.getName().isEmpty()) { fieldElement.setAttribute(FormField.FORM_FIELD_ATTRIBUTE_VAR, field @@ -164,6 +172,13 @@ public class FormSerializer extends GenericPayloadSerializer { private void multiLineify(String text, String elementName, XMLElement element) { + if (text == null) { + throw new NullPointerException("'text' must not be null"); + } + if (elementName == null) { + throw new NullPointerException("'elementName' must not be null"); + } + String unRdText = text.replaceAll("\r", ""); String[] lines = unRdText.split("\n"); for (String line : lines) { diff --git a/src/com/isode/stroke/serializer/xml/XMLTextNode.java b/src/com/isode/stroke/serializer/xml/XMLTextNode.java index 22a6785..b6940c4 100644 --- a/src/com/isode/stroke/serializer/xml/XMLTextNode.java +++ b/src/com/isode/stroke/serializer/xml/XMLTextNode.java @@ -31,6 +31,10 @@ public class XMLTextNode implements XMLNode { * @return new object, will never be null */ public static XMLTextNode create(String text) { + if (text == null) { + throw new NullPointerException("'text' must not be null"); + } + return new XMLTextNode(text); } } diff --git a/test/com/isode/stroke/parser/payloadparsers/CommandParserTest.java b/test/com/isode/stroke/parser/payloadparsers/CommandParserTest.java index 4c9854b..53dc0b3 100644 --- a/test/com/isode/stroke/parser/payloadparsers/CommandParserTest.java +++ b/test/com/isode/stroke/parser/payloadparsers/CommandParserTest.java @@ -27,14 +27,12 @@ import com.isode.stroke.elements.Command.Note.Type; import com.isode.stroke.eventloop.DummyEventLoop; public class CommandParserTest { - private static DummyEventLoop eventLoop; - @BeforeClass public static void init() throws Exception { - eventLoop = new DummyEventLoop(); } private static Command parse(String xmlString) { + DummyEventLoop eventLoop = new DummyEventLoop(); PayloadsParserTester parser = new PayloadsParserTester(eventLoop); assertTrue(parser.parse(xmlString)); diff --git a/test/com/isode/stroke/parser/payloadparsers/FormParserTest.java b/test/com/isode/stroke/parser/payloadparsers/FormParserTest.java index b57e7d8..5dace99 100644 --- a/test/com/isode/stroke/parser/payloadparsers/FormParserTest.java +++ b/test/com/isode/stroke/parser/payloadparsers/FormParserTest.java @@ -30,14 +30,12 @@ import com.isode.stroke.eventloop.DummyEventLoop; import com.isode.stroke.jid.JID; public class FormParserTest { - private static DummyEventLoop eventLoop; - @BeforeClass public static void init() throws Exception { - eventLoop = new DummyEventLoop(); } private static Form parse(String xmlString) { + DummyEventLoop eventLoop = new DummyEventLoop(); PayloadsParserTester parser = new PayloadsParserTester(eventLoop); assertTrue(parser.parse(xmlString)); -- cgit v0.10.2-6-g49f6