package de.uni_passau.fim.pkjab.model; import java.util.Collection; import java.util.EventListener; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import javax.swing.event.EventListenerList; import de.uni_passau.fim.pkjab.model.messages.Message; import de.uni_passau.fim.pkjab.model.messages.TextMessage; import de.uni_passau.fim.pkjab.util.Jid; import de.uni_passau.fim.pkjab.util.Subscription; import de.uni_passau.fim.pkjab.util.UserState; import de.uni_passau.fim.pkjab.util.listener.ContactListener; import de.uni_passau.fim.pkjab.util.listener.ContactStateEvent; import de.uni_passau.fim.pkjab.util.listener.MessageReceivedEvent; public class Contact implements Comparable { protected EventListenerList listeners = new EventListenerList(); protected final Connection connection; private final Jid jid; private final Map resources = new TreeMap(); private String nick; private Subscription subscription = Subscription.NONE; public Contact(final Connection connection, final Jid jid) { if (jid.isQualified()) { this.jid = new Jid(jid.getUser(), jid.getDomain(), null); } else { this.jid = jid; } this.connection = connection; this.nick = jid.getBareJid(); fireStateChanged(); } public TextMessage sendMessage(String text) { TextMessage msg = new TextMessage(); msg.setTo(jid); msg.setBody(text); connection.sendMessage(msg); return msg; } public UserState getState() { Resource resource = null; for (Iterator it = resources.values().iterator(); it.hasNext(); ) { Resource r = (Resource) it.next(); if ((resource == null || r.getPriority() > resource.getPriority()) && (r.getState() != UserState.OFFLINE)) { resource = r; } } return (resource == null) ? UserState.OFFLINE : resource.getState(); } public String getStateText() { Resource resource = null; for (Iterator it = resources.values().iterator(); it.hasNext(); ) { Resource r = (Resource) it.next(); if ((resource == null || r.getPriority() > resource.getPriority()) && (r.getState() != UserState.OFFLINE)) { resource = r; } } return (resource == null) ? null : resource.getText(); } public void addResource(Resource resource) { resources.put(resource.getResource(), resource); fireStateChanged(); } public Resource getResource(String resource) { return (Resource) (resources.get(resource)); } public Resource removeResource(String resource) { return (Resource) resources.remove(resource); } protected Collection getResources() { return resources.values(); } public String getNick() { return nick; } public void setNick(String n) { if (n == null || n.equals("")) { nick = jid.getBareJid(); } else { nick = n; } } public Jid getBareJid() { return jid; } public void clear() { UserState oldState = getState(); resources.clear(); if (oldState != UserState.OFFLINE) { fireStateChanged(); } } public void setMessageReceived(Message msg) { fireMessageReceived(new MessageReceivedEvent(this, msg)); } // listener pattern public void addContactListener(ContactListener listener) { listeners.add(ContactListener.class, listener); } public void removeContactListener(ContactListener listener) { listeners.remove(ContactListener.class, listener); } public synchronized void fireStateChanged() { ContactStateEvent e = new ContactStateEvent(this, getState()); EventListener[] listener = listeners.getListeners(ContactListener.class); for (int i = 0; i < listener.length; i++ ) ((ContactListener) listener[i]).contactStateChanged(e); } private synchronized void fireMessageReceived(MessageReceivedEvent e) { EventListener[] listener = listeners.getListeners(ContactListener.class); for (int i = 0; i < listener.length; i++ ) ((ContactListener) listener[i]).messageReceived(e); } public boolean equals(final Object o) { return (this == o) || ((o != null && o instanceof Contact) ? jid.equals(((Contact)o).getBareJid()) : false); } public int compareTo(final Object o) { if (o == null || !(o instanceof Contact)) { throw new IllegalArgumentException(); } return jid.compareTo(((Contact)o).getBareJid()); } public Subscription getSubscription() { return subscription; } public void setSubscription(final Subscription newSubscription) { if (newSubscription == null) { subscription = Subscription.NONE; } else { subscription = newSubscription; } } public String toString() { return nick + "(" + jid + ")"; } }