From 2cba6a68ebc3102f796e2cb6ad9d8c24eaed19e8 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sun, 25 Jan 2015 15:45:56 +0100 Subject: [PATCH] Fix DataFormProvider parsing 'fixed' FormFields b71039660bf73fb537bfafe09f39c993ba84f1c1 made FormField.setType(Type) throw an illegal argument exception if type is fixed, but the DataFormProvider was not changed, so it still would call setType(Type.fixed). Change DataFormProvider so that the non-argument constructer of FormField is used when type == fixed. --- .../jivesoftware/smackx/xdata/FormField.java | 9 +++++++++ .../smackx/xdata/provider/DataFormProvider.java | 16 +++++++++++----- .../smackx/xdata/packet/DataFormTest.java | 17 ++++++++++------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java index 1b9b30bf3..df378978b 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java @@ -113,7 +113,16 @@ public class FormField implements NamedElement { } } + /** + * Get a form field type from the given string. If string is null, then null will be returned. + * + * @param string the string to transform or null. + * @return the type or null. + */ public static Type fromString(String string) { + if (string == null) { + return null; + } switch (string) { case "boolean": return bool; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java index 2b52a4404..e94775d00 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java @@ -94,12 +94,18 @@ public class DataFormProvider extends PacketExtensionProvider { private FormField parseField(XmlPullParser parser) throws XmlPullParserException, IOException { final int initialDepth = parser.getDepth(); - FormField formField = new FormField(parser.getAttributeValue("", "var")); - formField.setLabel(parser.getAttributeValue("", "label")); - String typeString = parser.getAttributeValue("", "type"); - if (typeString != null) { - formField.setType(FormField.Type.fromString(typeString)); + final String var = parser.getAttributeValue("", "var"); + final FormField.Type type = FormField.Type.fromString(parser.getAttributeValue("", "type")); + + final FormField formField; + if (type == FormField.Type.fixed) { + formField = new FormField(); + } else { + formField = new FormField(var); + formField.setType(type); } + formField.setLabel(parser.getAttributeValue("", "label")); + outerloop: while (true) { int eventType = parser.next(); switch (eventType) { diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/xdata/packet/DataFormTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/xdata/packet/DataFormTest.java index 0424dd7db..6e52115f6 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/xdata/packet/DataFormTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/xdata/packet/DataFormTest.java @@ -25,6 +25,7 @@ import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.packet.Element; import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smackx.xdata.FormField; +import org.jivesoftware.smackx.xdata.FormField.Type; import org.jivesoftware.smackx.xdata.provider.DataFormProvider; import org.jivesoftware.smackx.xdatalayout.packet.DataLayout; import org.jivesoftware.smackx.xdatalayout.packet.DataLayout.Fieldref; @@ -32,7 +33,6 @@ import org.jivesoftware.smackx.xdatalayout.packet.DataLayout.Section; import org.jivesoftware.smackx.xdatalayout.packet.DataLayout.Text; import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement; import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.RangeValidateElement; - import org.junit.Test; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -48,6 +48,8 @@ public class DataFormTest { private static final String TEST_OUTPUT_2 = "InstructionTest1
SectionText
PageText
"; private static final String TEST_OUTPUT_3 = "InstructionTest1"; + DataFormProvider pr = new DataFormProvider(); + @Test public void test() throws XmlPullParserException, IOException, SmackException { //Build a Form @@ -61,8 +63,6 @@ public class DataFormTest { String output = df.toXML().toString(); assertEquals(TEST_OUTPUT_1, output); - DataFormProvider pr = new DataFormProvider(); - XmlPullParser parser = PacketParserUtils.getParserFor(output); df = pr.parse(parser); @@ -101,8 +101,6 @@ public class DataFormTest { String output = df.toXML().toString(); assertEquals(TEST_OUTPUT_2, output); - DataFormProvider pr = new DataFormProvider(); - XmlPullParser parser = PacketParserUtils.getParserFor(output); df = pr.parse(parser); @@ -137,8 +135,6 @@ public class DataFormTest { String output = df.toXML().toString(); assertEquals(TEST_OUTPUT_3, output); - DataFormProvider pr = new DataFormProvider(); - XmlPullParser parser = PacketParserUtils.getParserFor(output); df = pr.parse(parser); @@ -156,4 +152,11 @@ public class DataFormTest { output = df.toXML().toString(); assertEquals(TEST_OUTPUT_3, output); } + + @Test + public void testFixedField() throws XmlPullParserException, IOException, SmackException { + final String formWithFixedField = "InstructionTest1"; + DataForm df = pr.parse(PacketParserUtils.getParserFor(formWithFixedField)); + assertEquals(Type.fixed, df.getFields().get(0).getType()); + } }