Data.java

  1package eu.siacs.conversations.xmpp.forms;
  2
  3import android.os.Bundle;
  4
  5import java.util.ArrayList;
  6import java.util.Collection;
  7import java.util.List;
  8import java.util.stream.Collectors;
  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(Bundle options) {
 63		for (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		replaceChildren(getChildren().stream().filter(element -> element.getName().equals("field") || element.getName().equals("title")).collect(Collectors.toList()));
 81	}
 82
 83	public static Data parse(Element element) {
 84		Data data = new Data();
 85		data.bindTo(element);
 86		return data;
 87	}
 88
 89	public void setFormType(String formType) {
 90		Field field = this.put(FORM_TYPE, formType);
 91		field.setAttribute("type","hidden");
 92	}
 93
 94	public String getFormType() {
 95		String type = getValue(FORM_TYPE);
 96		return type == null ? "" : type;
 97	}
 98
 99	public String getValue(String name) {
100		Field field = this.getFieldByName(name);
101		return field == null ? null : field.getValue();
102	}
103
104	public String getTitle() {
105		return findChildContent("title", "jabber:x:data");
106	}
107
108
109	public static Data create(String type, Bundle bundle) {
110		Data data = new Data();
111		data.setFormType(type);
112		data.setAttribute("type","submit");
113		for(String key : bundle.keySet()) {
114			data.put(key,bundle.getString(key));
115		}
116		return data;
117	}
118
119}