Presences.java

  1package eu.siacs.conversations.entities;
  2
  3import java.util.ArrayList;
  4import java.util.Collections;
  5import java.util.Hashtable;
  6import java.util.Iterator;
  7import java.util.List;
  8import java.util.Map;
  9
 10import eu.siacs.conversations.xml.Element;
 11
 12public class Presences {
 13	private final Hashtable<String, Presence> presences = new Hashtable<>();
 14
 15	public Hashtable<String, Presence> getPresences() {
 16		return this.presences;
 17	}
 18
 19	public void updatePresence(String resource, Presence presence) {
 20		synchronized (this.presences) {
 21			this.presences.put(resource, presence);
 22		}
 23	}
 24
 25	public void removePresence(String resource) {
 26		synchronized (this.presences) {
 27			this.presences.remove(resource);
 28		}
 29	}
 30
 31	public void clearPresences() {
 32		synchronized (this.presences) {
 33			this.presences.clear();
 34		}
 35	}
 36
 37	public Presence.Status getShownStatus() {
 38		Presence.Status status = Presence.Status.OFFLINE;
 39		synchronized (this.presences) {
 40			for(Presence p : presences.values()) {
 41				if (p.getStatus() == Presence.Status.DND) {
 42					return p.getStatus();
 43				} else if (p.getStatus().compareTo(status) < 0){
 44					status = p.getStatus();
 45				}
 46			}
 47		}
 48		return status;
 49	}
 50
 51	public int size() {
 52		synchronized (this.presences) {
 53			return presences.size();
 54		}
 55	}
 56
 57	public String[] asStringArray() {
 58		synchronized (this.presences) {
 59			final String[] presencesArray = new String[presences.size()];
 60			presences.keySet().toArray(presencesArray);
 61			return presencesArray;
 62		}
 63	}
 64
 65	public List<PresenceTemplate> asTemplates() {
 66		synchronized (this.presences) {
 67			ArrayList<PresenceTemplate> templates = new ArrayList<>(presences.size());
 68			for(Presence p : presences.values()) {
 69				if (p.getMessage() != null && !p.getMessage().trim().isEmpty()) {
 70					templates.add(new PresenceTemplate(p.getStatus(), p.getMessage()));
 71				}
 72			}
 73			return templates;
 74		}
 75	}
 76
 77	public boolean has(String presence) {
 78		synchronized (this.presences) {
 79			return presences.containsKey(presence);
 80		}
 81	}
 82
 83	public List<String> getStatusMessages() {
 84		ArrayList<String> messages = new ArrayList<>();
 85		synchronized (this.presences) {
 86			for(Presence presence : this.presences.values()) {
 87				String message = presence.getMessage() == null ? null : presence.getMessage().trim();
 88				if (message != null && !message.isEmpty() && !messages.contains(message)) {
 89					messages.add(message);
 90				}
 91			}
 92		}
 93		return messages;
 94	}
 95
 96	public boolean allOrNonSupport(String namespace) {
 97		synchronized (this.presences) {
 98			for(Presence presence : this.presences.values()) {
 99				ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
100				if (disco == null || !disco.getFeatures().contains(namespace)) {
101					return false;
102				}
103			}
104		}
105		return true;
106	}
107}