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 if (p.getMessage() != null && !p.getMessage().trim().isEmpty()) {
63 templates.add(new PresenceTemplate(p.getStatus(), p.getMessage()));
64 }
65 }
66 return templates;
67 }
68 }
69
70 public boolean has(String presence) {
71 synchronized (this.presences) {
72 return presences.containsKey(presence);
73 }
74 }
75
76 public List<String> getStatusMessages() {
77 ArrayList<String> messages = new ArrayList<>();
78 synchronized (this.presences) {
79 for(Presence presence : this.presences.values()) {
80 String message = presence.getMessage() == null ? null : presence.getMessage().trim();
81 if (message != null && !message.isEmpty() && !messages.contains(message)) {
82 messages.add(message);
83 }
84 }
85 }
86 return messages;
87 }
88
89 public boolean allOrNonSupport(String namespace) {
90 synchronized (this.presences) {
91 for(Presence presence : this.presences.values()) {
92 ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
93 if (disco == null || !disco.getFeatures().contains(namespace)) {
94 return false;
95 }
96 }
97 }
98 return true;
99 }
100}