1package eu.siacs.conversations.xmpp.forms;
2
3import android.os.Bundle;
4
5import java.util.ArrayList;
6import java.util.Collection;
7import java.util.Iterator;
8import java.util.List;
9
10import eu.siacs.conversations.xml.Element;
11
12public class Data extends Element {
13
14 public static final String FORM_TYPE = "FORM_TYPE";
15
16 public Data() {
17 super("x");
18 this.setAttribute("xmlns","jabber:x:data");
19 }
20
21 public List<Field> getFields() {
22 ArrayList<Field> fields = new ArrayList<Field>();
23 for(Element child : getChildren()) {
24 if (child.getName().equals("field")
25 && !FORM_TYPE.equals(child.getAttribute("var"))) {
26 fields.add(Field.parse(child));
27 }
28 }
29 return fields;
30 }
31
32 public Field getFieldByName(String needle) {
33 for(Element child : getChildren()) {
34 if (child.getName().equals("field")
35 && needle.equals(child.getAttribute("var"))) {
36 return Field.parse(child);
37 }
38 }
39 return null;
40 }
41
42 public Field put(String name, String value) {
43 Field field = getFieldByName(name);
44 if (field == null) {
45 field = new Field(name);
46 this.addChild(field);
47 }
48 field.setValue(value);
49 return field;
50 }
51
52 public void put(String name, Collection<String> values) {
53 Field field = getFieldByName(name);
54 if (field == null) {
55 field = new Field(name);
56 this.addChild(field);
57 }
58 field.setValues(values);
59 }
60
61 public void submit(Bundle options) {
62 for (Field field : getFields()) {
63 if (options.containsKey(field.getFieldName())) {
64 field.setValue(options.getString(field.getFieldName()));
65 }
66 }
67 submit();
68 }
69
70 public void submit() {
71 this.setAttribute("type","submit");
72 removeUnnecessaryChildren();
73 for(Field field : getFields()) {
74 field.removeNonValueChildren();
75 }
76 }
77
78 private void removeUnnecessaryChildren() {
79 for(Iterator<Element> iterator = this.children.iterator(); iterator.hasNext();) {
80 Element element = iterator.next();
81 if (!element.getName().equals("field") && !element.getName().equals("title")) {
82 iterator.remove();
83 }
84 }
85 }
86
87 public static Data parse(Element element) {
88 Data data = new Data();
89 data.setAttributes(element.getAttributes());
90 data.setChildren(element.getChildren());
91 return data;
92 }
93
94 public void setFormType(String formType) {
95 Field field = this.put(FORM_TYPE, formType);
96 field.setAttribute("type","hidden");
97 }
98
99 public String getFormType() {
100 String type = getValue(FORM_TYPE);
101 return type == null ? "" : type;
102 }
103
104 public String getValue(String name) {
105 Field field = this.getFieldByName(name);
106 return field == null ? null : field.getValue();
107 }
108
109 public String getTitle() {
110 return findChildContent("title");
111 }
112
113
114 public static Data create(String type, Bundle bundle) {
115 Data data = new Data();
116 data.setFormType(type);
117 data.setAttribute("type","submit");
118 for(String key : bundle.keySet()) {
119 data.put(key,bundle.getString(key));
120 }
121 return data;
122 }
123
124}