package org.limewire.xmpp.client.impl; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.feature.FeatureEvent; import org.limewire.friend.impl.AbstractFriend; import org.limewire.friend.impl.AbstractFriendPresence; import org.limewire.listener.EventBroadcaster; class PresenceImpl extends AbstractFriendPresence implements FriendPresence { private final AbstractFriend friend; private final String jid; private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); private Type type; private String status; private int priority; private Mode mode; PresenceImpl(org.jivesoftware.smack.packet.Presence presence, AbstractFriend friend, EventBroadcaster<FeatureEvent> featureBroadcaster) { super(featureBroadcaster); this.friend = friend; this.jid = presence.getFrom(); update(presence); } public void update(org.jivesoftware.smack.packet.Presence presence) { rwLock.writeLock().lock(); try { this.type = Type.valueOf(presence.getType().toString()); this.status = presence.getStatus(); this.priority = presence.getPriority(); this.mode = presence.getMode() != null ? Mode.valueOf(presence.getMode().toString()) : Mode.available; } finally { rwLock.writeLock().unlock(); } } @Override public String getPresenceId() { return jid; } @Override public Type getType() { rwLock.readLock().lock(); try { return type; } finally { rwLock.readLock().unlock(); } } @Override public String getStatus() { rwLock.readLock().lock(); try { return status; } finally { rwLock.readLock().unlock(); } } @Override public int getPriority() { rwLock.readLock().lock(); try { return priority; } finally { rwLock.readLock().unlock(); } } @Override public Mode getMode() { rwLock.readLock().lock(); try { return mode; } finally { rwLock.readLock().unlock(); } } @Override public String toString() { return getPresenceId() + " for " + friend.toString(); } @Override public AbstractFriend getFriend() { return friend; } }