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