package call;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ContactList {
private static Set<Contact> contacts = new HashSet<>();
private static List<ContactListUpdateListener> listeners = new ArrayList<>();
private static Map<Contact, Boolean> online = new HashMap<>();
private static Lock lock = new ReentrantLock();
public ContactList() {}
public static void clear() {
lock.lock();
contacts.clear();
online.clear();
notifyListeners();
lock.unlock();
}
public static List<Contact> getSortedContacts() {
lock.lock();
List<Contact> list = new ArrayList<>(contacts);
Collections.sort(list, new ContactListComparator());
lock.unlock();
return list;
}
public static List<Contact> getUnsortedContacts() {
lock.lock();
List<Contact> list = new ArrayList<>(contacts);
lock.unlock();
return list;
}
public static void addContact(Contact contact) {
lock.lock();
if (!contacts.contains(contact)) {
contacts.add(contact);
notifyListeners(contact);
}
lock.unlock();
}
public static void removeContact(Contact contact) {
lock.lock();
if (contacts.contains(contact)) {
contacts.remove(contact);
notifyListeners(contact);
}
lock.unlock();
}
public static Contact findContact(String host, int port, String user) {
for (Contact contact : contacts) {
if ((host == null || contact.isHost(host)) && (port == 0 || contact.isPort(port))
&& (user == null || contact.isUser(user))) {
return contact;
}
}
return null;
}
public static boolean containsContact(String host, int port, String user) {
for (Contact contact : contacts) {
if (contact.isHost(host) && contact.isPort(port) && contact.isUser(user)) {
return true;
}
}
return false;
}
public static boolean containsContact(Contact contact) {
return contacts.contains(contact);
}
public static boolean isOnline(Contact contact) {
return online.containsKey(contact) && online.get(contact);
}
public static void setOnline(Contact contact, boolean onlinestatus) {
lock.lock();
online.put(contact, onlinestatus);
notifyListeners(contact);
lock.unlock();
}
public static void update() {
lock.lock();
notifyListeners();
lock.unlock();
}
private static void notifyListeners() {
for (ContactListUpdateListener listener : listeners) {
listener.onAnyContactUpdate();
}
}
private static void notifyListeners(Contact contact) {
for (ContactListUpdateListener listener : listeners) {
listener.onContactUpdate(contact);
listener.onAnyContactUpdate();
}
}
@SuppressWarnings("unused")
private static void debugContactList() {
List<Contact> list = new ArrayList<Contact>(ContactList.getSortedContacts());
Util.log("contactlist:", "--------");
for (Contact c : list) {
if (list.size() > 2) {
Util.log("contactlist:", c.getId() + " comp(1) = " + c.compareTo(list.get(0))
+ ", comp(2) = " + c.compareTo(list.get(1)) + ", equal(1) = " + c.equals(list.get(0))
+ ", equal(2) = " + c.equals(list.get(1)));
} else {
Util.log("contactlist:", c.getId());
}
}
Util.log("contactlist:", "________");
}
public static void addListener(ContactListUpdateListener listener) {
listeners.add(listener);
}
public static Contact me() {
return new Contact("127.0.0.1", Config.CURRENT_PORT, Util.getUserName());
}
}