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.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}