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;
8
9import eu.siacs.conversations.xml.Element;
10
11public class Presences {
12 private final Hashtable<String, Presence> presences = new Hashtable<>();
13
14 public Hashtable<String, Presence> getPresences() {
15 return this.presences;
16 }
17
18 public void updatePresence(String resource, Presence presence) {
19 synchronized (this.presences) {
20 this.presences.put(resource, presence);
21 }
22 }
23
24 public void removePresence(String resource) {
25 synchronized (this.presences) {
26 this.presences.remove(resource);
27 }
28 }
29
30 public void clearPresences() {
31 synchronized (this.presences) {
32 this.presences.clear();
33 }
34 }
35
36 public Presence getMostAvailablePresence() {
37 synchronized (this.presences) {
38 if (presences.size() < 1) { return null; }
39 return Collections.min(presences.values());
40 }
41 }
42
43 public int size() {
44 synchronized (this.presences) {
45 return presences.size();
46 }
47 }
48
49 public String[] asStringArray() {
50 synchronized (this.presences) {
51 final String[] presencesArray = new String[presences.size()];
52 presences.keySet().toArray(presencesArray);
53 return presencesArray;
54 }
55 }
56
57 public boolean has(String presence) {
58 synchronized (this.presences) {
59 return presences.containsKey(presence);
60 }
61 }
62
63 public List<String> getStatusMessages() {
64 ArrayList<String> messages = new ArrayList<>();
65 synchronized (this.presences) {
66 for(Presence presence : this.presences.values()) {
67 String message = presence.getMessage();
68 if (message != null && !message.trim().isEmpty()) {
69 messages.add(message.trim());
70 }
71 }
72 }
73 return messages;
74 }
75
76 public boolean allOrNonSupport(String namespace) {
77 synchronized (this.presences) {
78 for(Presence presence : this.presences.values()) {
79 ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
80 if (disco == null || !disco.getFeatures().contains(namespace)) {
81 return false;
82 }
83 }
84 }
85 return true;
86 }
87}