📄 presencemanagerimpl.java
字号:
/**
* $RCSfile: PresenceManagerImpl.java,v $
* $Revision: 3128 $
* $Date: 2005-11-30 15:31:54 -0300 (Wed, 30 Nov 2005) $
*
* Copyright (C) 2004 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.spi;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.Log;
import org.jivesoftware.wildfire.*;
import org.jivesoftware.wildfire.auth.UnauthorizedException;
import org.jivesoftware.wildfire.component.InternalComponentManager;
import org.jivesoftware.wildfire.container.BasicModule;
import org.jivesoftware.wildfire.handler.PresenceUpdateHandler;
import org.jivesoftware.wildfire.privacy.PrivacyList;
import org.jivesoftware.wildfire.privacy.PrivacyListManager;
import org.jivesoftware.wildfire.roster.Roster;
import org.jivesoftware.wildfire.roster.RosterItem;
import org.jivesoftware.wildfire.roster.RosterManager;
import org.jivesoftware.wildfire.user.User;
import org.jivesoftware.wildfire.user.UserManager;
import org.jivesoftware.wildfire.user.UserNotFoundException;
import org.xmpp.component.Component;
import org.xmpp.packet.JID;
import org.xmpp.packet.PacketError;
import org.xmpp.packet.Presence;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Simple in memory implementation of the PresenceManager interface.
*
* @author Iain Shigeoka
*/
public class PresenceManagerImpl extends BasicModule implements PresenceManager {
private static final String LAST_PRESENCE_PROP = "lastUnavailablePresence";
private static final String LAST_ACTIVITY_PROP = "lastActivity";
private SessionManager sessionManager;
private UserManager userManager;
private RosterManager rosterManager;
private XMPPServer server;
private PacketDeliverer deliverer;
private PresenceUpdateHandler presenceUpdateHandler;
private InternalComponentManager componentManager;
public PresenceManagerImpl() {
super("Presence manager");
// Use component manager for Presence Updates.
componentManager = InternalComponentManager.getInstance();
}
public boolean isAvailable(User user) {
return sessionManager.getSessionCount(user.getUsername()) > 0;
}
public Presence getPresence(User user) {
if (user == null) {
return null;
}
Presence presence = null;
for (ClientSession session : sessionManager.getSessions(user.getUsername())) {
if (presence == null) {
presence = session.getPresence();
}
else {
// Get the ordinals of the presences to compare. If no ordinal is available then
// assume a value of -1
int o1 = presence.getShow() != null ? presence.getShow().ordinal() : -1;
int o2 = session.getPresence().getShow() != null ?
session.getPresence().getShow().ordinal() : -1;
// Compare the presences' show ordinals
if (o1 > o2) {
presence = session.getPresence();
}
}
}
return presence;
}
public Collection<Presence> getPresences(String username) {
if (username == null) {
return null;
}
List<Presence> presences = new ArrayList<Presence>();
for (ClientSession session : sessionManager.getSessions(username)) {
presences.add(session.getPresence());
}
return Collections.unmodifiableCollection(presences);
}
public String getLastPresenceStatus(User user) {
String answer = null;
String presenceXML = user.getProperties().get(LAST_PRESENCE_PROP);
if (presenceXML != null) {
try {
// Parse the element
Document element = DocumentHelper.parseText(presenceXML);
answer = element.getRootElement().elementTextTrim("status");
}
catch (DocumentException e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
}
}
return answer;
}
public long getLastActivity(User user) {
long answer = -1;
String offline = user.getProperties().get(LAST_ACTIVITY_PROP);
if (offline != null) {
try {
answer = (System.currentTimeMillis() - Long.parseLong(offline));
}
catch (NumberFormatException e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
}
}
return answer;
}
public void userAvailable(Presence presence) {
// Delete the last unavailable presence of this user since the user is now
// available. Only perform this operation if this is an available presence sent to
// THE SERVER and the presence belongs to a local user.
if (presence.getTo() == null && server.isLocal(presence.getFrom())) {
String username = presence.getFrom().getNode();
if (username == null || !userManager.isRegisteredUser(username)) {
// Ignore anonymous users
return;
}
try {
User probeeUser = userManager.getUser(username);
probeeUser.getProperties().remove(LAST_PRESENCE_PROP);
}
catch (UserNotFoundException e) {
}
}
}
public void userUnavailable(Presence presence) {
// Only save the last presence status and keep track of the time when the user went
// offline if this is an unavailable presence sent to THE SERVER and the presence belongs
// to a local user.
if (presence.getTo() == null && server.isLocal(presence.getFrom())) {
String username = presence.getFrom().getNode();
if (username == null || !userManager.isRegisteredUser(username)) {
// Ignore anonymous users
return;
}
try {
User probeeUser = userManager.getUser(username);
if (!presence.getElement().elements().isEmpty()) {
// Save the last unavailable presence of this user if the presence contains any
// child element such as <status>
probeeUser.getProperties().put(LAST_PRESENCE_PROP, presence.toXML());
}
// Keep track of the time when the user went offline
probeeUser.getProperties().put(LAST_ACTIVITY_PROP,
String.valueOf(System.currentTimeMillis()));
}
catch (UserNotFoundException e) {
}
}
}
public void handleProbe(Presence packet) throws UnauthorizedException {
String username = packet.getTo().getNode();
try {
Roster roster = rosterManager.getRoster(username);
RosterItem item = roster.getRosterItem(packet.getFrom());
if (item.getSubStatus() == RosterItem.SUB_FROM
|| item.getSubStatus() == RosterItem.SUB_BOTH) {
probePresence(packet.getFrom(), packet.getTo());
}
else {
PacketError.Condition error = PacketError.Condition.not_authorized;
if ((item.getSubStatus() == RosterItem.SUB_NONE &&
item.getRecvStatus() != RosterItem.RECV_SUBSCRIBE) ||
(item.getSubStatus() == RosterItem.SUB_TO &&
item.getRecvStatus() != RosterItem.RECV_SUBSCRIBE)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -