[xdata] Ensure that hidden FROM_TYPE field is first

This commit is contained in:
Florian Schmaus 2021-03-02 21:40:52 +01:00
parent 687c4f35aa
commit 33f59fd7ed
2 changed files with 37 additions and 0 deletions

View File

@ -100,6 +100,9 @@ public final class DataForm implements ExtensionElement {
instructions = CollectionUtil.cloneAndSeal(builder.instructions);
reportedData = builder.reportedData;
items = CollectionUtil.cloneAndSeal(builder.items);
builder.orderFields();
fields = CollectionUtil.cloneAndSeal(builder.fields);
fieldsMap = CollectionUtil.cloneAndSeal(builder.fieldsMap);
extensionElements = CollectionUtil.cloneAndSeal(builder.extensionElements);
@ -382,6 +385,30 @@ public final class DataForm implements ExtensionElement {
extensionElements = CollectionUtil.newListWith(dataForm.getExtensionElements());
}
private void orderFields() {
Iterator<FormField> it = fields.iterator();
if (!it.hasNext()) {
return;
}
FormField hiddenFormTypeField = it.next().asHiddenFormTypeFieldIfPossible();
if (hiddenFormTypeField != null) {
// The hidden FROM_TYPE field is already in first position, nothing to do.
return;
}
while (it.hasNext()) {
hiddenFormTypeField = it.next().asHiddenFormTypeFieldIfPossible();
if (hiddenFormTypeField != null) {
// Remove the hidden FORM_TYPE field that is not on first position.
it.remove();
// And insert it again at first position.
fields.add(0, hiddenFormTypeField);
break;
}
}
}
/**
* Deprecated do not use.
*

View File

@ -153,4 +153,14 @@ public class DataFormTest extends SmackTestSuite {
DataForm df = pr.parse(PacketParserUtils.getParserFor(formWithFixedField));
assertEquals(Type.fixed, df.getFields().get(0).getType());
}
@Test
public void testReorderHiddenFormTypeFieldAtFirstPosition() {
DataForm dataForm = DataForm.builder()
.addField(FormField.textSingleBuilder("foo1").setValue("bar").build())
.addField(FormField.textSingleBuilder("foo2").setValue("baz").build())
.setFormType("my-form-type")
.build();
assertNotNull(dataForm.getFields().get(0).asHiddenFormTypeFieldIfPossible());
}
}