mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 22:32:06 +01:00
Improve data form API
Add DataForm.getField(String) DataForm.getHiddenFormTypeField()
This commit is contained in:
parent
64242ace72
commit
b71039660b
2 changed files with 60 additions and 8 deletions
|
@ -35,6 +35,11 @@ public class FormField {
|
||||||
|
|
||||||
public static final String ELEMENT = "field";
|
public static final String ELEMENT = "field";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constant String "FORM_TYPE"
|
||||||
|
*/
|
||||||
|
public static final String FORM_TYPE = "FORM_TYPE";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Form Field Types as defined in XEP-4 § 3.3.
|
* Form Field Types as defined in XEP-4 § 3.3.
|
||||||
*
|
*
|
||||||
|
@ -118,10 +123,11 @@ public class FormField {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final String variable;
|
||||||
|
|
||||||
private String description;
|
private String description;
|
||||||
private boolean required = false;
|
private boolean required = false;
|
||||||
private String label;
|
private String label;
|
||||||
private String variable;
|
|
||||||
private Type type;
|
private Type type;
|
||||||
private final List<Option> options = new ArrayList<Option>();
|
private final List<Option> options = new ArrayList<Option>();
|
||||||
private final List<String> values = new ArrayList<String>();
|
private final List<String> values = new ArrayList<String>();
|
||||||
|
@ -142,6 +148,7 @@ public class FormField {
|
||||||
* name.
|
* name.
|
||||||
*/
|
*/
|
||||||
public FormField() {
|
public FormField() {
|
||||||
|
this(null);
|
||||||
this.type = Type.fixed;
|
this.type = Type.fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +221,11 @@ public class FormField {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the variable name that the question is filling out.
|
* Returns the variable name that the question is filling out.
|
||||||
|
* <p>
|
||||||
|
* According to XEP-4 § 3.2 the variable name (the 'var' attribute)
|
||||||
|
* "uniquely identifies the field in the context of the form" (if the field is not of type 'fixed', in which case
|
||||||
|
* the field "MAY possess a 'var' attribute")
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @return the variable name of the question.
|
* @return the variable name of the question.
|
||||||
*/
|
*/
|
||||||
|
@ -270,11 +282,19 @@ public class FormField {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an indicative of the format for the data to answer.
|
* Sets an indicative of the format for the data to answer.
|
||||||
|
* <p>
|
||||||
|
* This method will throw an IllegalArgumentException if type is 'fixed'. To create FormFields of type 'fixed' use
|
||||||
|
* {@link #FormField()} instead.
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @param type an indicative of the format for the data to answer.
|
* @param type an indicative of the format for the data to answer.
|
||||||
* @see Type
|
* @see Type
|
||||||
|
* @throws IllegalArgumentException if type is 'fixed'.
|
||||||
*/
|
*/
|
||||||
public void setType(Type type) {
|
public void setType(Type type) {
|
||||||
|
if (type == Type.fixed) {
|
||||||
|
throw new IllegalArgumentException("Can not set type to fixed, use FormField constructor without arguments instead.");
|
||||||
|
}
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,24 @@ public class DataForm implements PacketExtension {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the form field with the given variable name or null.
|
||||||
|
*
|
||||||
|
* @param variableName
|
||||||
|
* @return the form field or null.
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public FormField getField(String variableName) {
|
||||||
|
synchronized (fields) {
|
||||||
|
for (FormField field : fields) {
|
||||||
|
if (variableName.equals(field.getVariable())) {
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public String getElementName() {
|
public String getElementName() {
|
||||||
return ELEMENT;
|
return ELEMENT;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +187,11 @@ public class DataForm implements PacketExtension {
|
||||||
* @param field the field to add to the form.
|
* @param field the field to add to the form.
|
||||||
*/
|
*/
|
||||||
public void addField(FormField field) {
|
public void addField(FormField field) {
|
||||||
|
String fieldVariableName = field.getVariable();
|
||||||
|
if (fieldVariableName != null && getField(fieldVariableName) != null) {
|
||||||
|
throw new IllegalArgumentException("This data form already contains a form field with the variable name '"
|
||||||
|
+ fieldVariableName + "'");
|
||||||
|
}
|
||||||
synchronized (fields) {
|
synchronized (fields) {
|
||||||
fields.add(field);
|
fields.add(field);
|
||||||
}
|
}
|
||||||
|
@ -206,6 +229,20 @@ public class DataForm implements PacketExtension {
|
||||||
return Collections.unmodifiableList(extensionElements);
|
return Collections.unmodifiableList(extensionElements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the hidden FORM_TYPE field or null if this data form has none.
|
||||||
|
*
|
||||||
|
* @return the hidden FORM_TYPE field or null.
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public FormField getHiddenFormTypeField() {
|
||||||
|
FormField field = getField(FormField.FORM_TYPE);
|
||||||
|
if (field != null && field.getType() == FormField.Type.hidden) {
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if this DataForm has at least one FORM_TYPE field which is
|
* Returns true if this DataForm has at least one FORM_TYPE field which is
|
||||||
* hidden. This method is used for sanity checks.
|
* hidden. This method is used for sanity checks.
|
||||||
|
@ -213,12 +250,7 @@ public class DataForm implements PacketExtension {
|
||||||
* @return true if there is at least one field which is hidden.
|
* @return true if there is at least one field which is hidden.
|
||||||
*/
|
*/
|
||||||
public boolean hasHiddenFormTypeField() {
|
public boolean hasHiddenFormTypeField() {
|
||||||
for (FormField f : fields) {
|
return getHiddenFormTypeField() != null;
|
||||||
if (f.getVariable().equals("FORM_TYPE") && f.getType() == FormField.Type.hidden) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue