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 getMostAvailablePresence() {
38 synchronized (this.presences) {
39 if (presences.size() < 1) { return null; }
40 return Collections.min(presences.values());
41 }
42 }
43
44 public int size() {
45 synchronized (this.presences) {
46 return presences.size();
47 }
48 }
49
50 public String[] asStringArray() {
51 synchronized (this.presences) {
52 final String[] presencesArray = new String[presences.size()];
53 presences.keySet().toArray(presencesArray);
54 return presencesArray;
55 }
56 }
57
58 public List<PresenceTemplate> asTemplates() {
59 synchronized (this.presences) {
60 ArrayList<PresenceTemplate> templates = new ArrayList<>(presences.size());
61 for(Presence p : presences.values()) {
62 templates.add(new PresenceTemplate(p.getStatus(),p.getMessage()));
63 }
64 return templates;
65 }
66 }
67
68 public boolean has(String presence) {
69 synchronized (this.presences) {
70 return presences.containsKey(presence);
71 }
72 }
73
74 public List<String> getStatusMessages() {
75 ArrayList<String> messages = new ArrayList<>();
76 synchronized (this.presences) {
77 for(Presence presence : this.presences.values()) {
78 String message = presence.getMessage();
79 if (message != null && !message.trim().isEmpty()) {
80 messages.add(message.trim());
81 }
82 }
83 }
84 return messages;
85 }
86
87 public boolean allOrNonSupport(String namespace) {
88 synchronized (this.presences) {
89 for(Presence presence : this.presences.values()) {
90 ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
91 if (disco == null || !disco.getFeatures().contains(namespace)) {
92 return false;
93 }
94 }
95 }
96 return true;
97 }
98}