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(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		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		if (element == null) return null;
 85
 86		Data data = new Data();
 87		data.bindTo(element);
 88		return data;
 89	}
 90
 91	public void setFormType(String formType) {
 92		Field field = this.put(FORM_TYPE, formType);
 93		field.setAttribute("type","hidden");
 94	}
 95
 96	public String getFormType() {
 97		String type = getValue(FORM_TYPE);
 98		return type == null ? "" : type;
 99	}
100
101	public String getValue(String name) {
102		Field field = this.getFieldByName(name);
103		return field == null ? null : field.getValue();
104	}
105
106	public String getTitle() {
107		return findChildContent("title", "jabber:x:data");
108	}
109
110
111	public static Data create(String type, Bundle bundle) {
112		Data data = new Data();
113		data.setFormType(type);
114		data.setAttribute("type","submit");
115		for(String key : bundle.keySet()) {
116			data.put(key,bundle.getString(key));
117		}
118		return data;
119	}
120
121}