📄 sessionmanager.java
字号:
return usersSessionsCounter.get();
}
/**
* Returns number of client sessions that are available. Anonymous users
* are included too.
*
* @return number of client sessions that are available.
*/
public int getActiveSessionCount() {
int sessionCount = 0;
for (ClientSession session : getSessions()) {
if (session.getPresence().isAvailable()) {
sessionCount++;
}
}
return sessionCount;
}
public int getAnonymousSessionCount() {
return anonymousSessions.size();
}
public int getSessionCount(String username) {
if (username == null || !userManager.isRegisteredUser(username)) {
return 0;
}
int sessionCount = 0;
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
sessionCount = sessionMap.resources.size();
}
return sessionCount;
}
public Collection<String> getSessionUsers() {
return Collections.unmodifiableCollection(sessions.keySet());
}
/**
* Returns a collection with the established sessions from external components.
*
* @return a collection with the established sessions from external components.
*/
public Collection<ComponentSession> getComponentSessions() {
return Collections.unmodifiableCollection(componentsSessions);
}
/**
* Returns the session of the component whose domain matches the specified domain.
*
* @param domain the domain of the component session to look for.
* @return the session of the component whose domain matches the specified domain.
*/
public ComponentSession getComponentSession(String domain) {
for (ComponentSession session : componentsSessions) {
if (domain.equals(session.getAddress().getDomain())) {
return session;
}
}
return null;
}
/**
* Returns a collection with the hostnames of the remote servers that currently have an
* incoming server connection to this server.
*
* @return a collection with the hostnames of the remote servers that currently have an
* incoming server connection to this server.
*/
public Collection<String> getIncomingServers() {
return Collections.unmodifiableCollection(incomingServerSessions.keySet());
}
/**
* Returns a collection with the hostnames of the remote servers that currently may receive
* packets sent from this server.
*
* @return a collection with the hostnames of the remote servers that currently may receive
* packets sent from this server.
*/
public Collection<String> getOutgoingServers() {
return Collections.unmodifiableCollection(outgoingServerSessions.keySet());
}
/**
* Broadcasts the given data to all connected sessions. Excellent
* for server administration messages.
*
* @param packet The packet to be broadcast
*/
public void broadcast(Packet packet) throws UnauthorizedException {
for (SessionMap sessionMap : sessions.values()) {
sessionMap.broadcast(packet);
}
for (Session session : anonymousSessions.values()) {
session.process(packet);
}
}
/**
* Broadcasts the given data to all connected sessions for a particular
* user. Excellent for updating all connected resources for users such as
* roster pushes.
*
* @param packet The packet to be broadcast
*/
public void userBroadcast(String username, Packet packet) throws UnauthorizedException, PacketException {
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
sessionMap.broadcast(packet);
}
}
/**
* Removes a session.
*
* @param session the session.
* @return true if the requested session was successfully removed.
*/
public boolean removeSession(ClientSession session) {
// Do nothing if session is null or if the server is shutting down. Note: When the server
// is shutting down the serverName will be null.
if (session == null || serverName == null) {
return false;
}
boolean auth_removed = false;
if (anonymousSessions.remove(session.getAddress().getResource()) != null) {
// Fire session event.
SessionEventDispatcher.dispatchEvent(session,
SessionEventDispatcher.EventType.anonymous_session_destroyed);
// Set that the session was found and removed
auth_removed = true;
}
else {
// If this is a non-anonymous session then remove the session from the SessionMap
String username = session.getAddress().getNode();
if (username != null) {
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
synchronized (username.intern()) {
auth_removed = sessionMap.removeSession(session);
}
if (sessionMap.isEmpty()) {
sessions.remove(username);
}
}
if (auth_removed) {
// Fire session event.
SessionEventDispatcher.dispatchEvent(session,
SessionEventDispatcher.EventType.session_destroyed);
}
}
}
// Remove the session from the pre-Authenticated sessions list (if present)
boolean preauth_removed =
preAuthenticatedSessions.remove(session.getAddress().getResource()) != null;
// If the user is still available then send an unavailable presence
Presence presence = session.getPresence();
if (presence.isAvailable()) {
Presence offline = new Presence();
offline.setFrom(session.getAddress());
offline.setTo(new JID(null, serverName, null));
offline.setType(Presence.Type.unavailable);
router.route(offline);
}
if (auth_removed || preauth_removed) {
// Decrement the counter of user sessions
usersSessionsCounter.decrementAndGet();
return true;
}
return false;
}
public void addAnonymousSession(ClientSession session) {
anonymousSessions.put(session.getAddress().getResource(), session);
// Remove the session from the pre-Authenticated sessions list
preAuthenticatedSessions.remove(session.getAddress().getResource());
// Fire session event.
SessionEventDispatcher.dispatchEvent(session,
SessionEventDispatcher.EventType.anonymous_session_created);
}
public int getConflictKickLimit() {
return conflictLimit;
}
/**
* Returns the temporary keys used by the sessions that has not been authenticated yet. This
* is an utility method useful for debugging situations.
*
* @return the temporary keys used by the sessions that has not been authenticated yet.
*/
public Collection<String> getPreAuthenticatedKeys() {
return preAuthenticatedSessions.keySet();
}
public void setConflictKickLimit(int limit) {
conflictLimit = limit;
JiveGlobals.setProperty("xmpp.session.conflict-limit", Integer.toString(conflictLimit));
}
private class ClientSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
*
* @param handback The session that just closed
*/
public void onConnectionClose(Object handback) {
try {
ClientSession session = (ClientSession) handback;
try {
if (session.getPresence().isAvailable() || !session.wasAvailable()) {
// Send an unavailable presence to the user's subscribers
// Note: This gives us a chance to send an unavailable presence to the
// entities that the user sent directed presences
Presence presence = new Presence();
presence.setType(Presence.Type.unavailable);
presence.setFrom(session.getAddress());
presenceHandler.process(presence);
}
}
finally {
// Remove the session
removeSession(session);
}
}
catch (Exception e) {
// Can't do anything about this problem...
Log.error(LocaleUtils.getLocalizedString("admin.error.close"), e);
}
}
}
private class ComponentSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
*
* @param handback The session that just closed
*/
public void onConnectionClose(Object handback) {
ComponentSession session = (ComponentSession)handback;
try {
// Unbind registered domains for this external component
for (String domain : session.getExternalComponent().getSubdomains()) {
String subdomain = domain.substring(0, domain.indexOf(serverName) - 1);
InternalComponentManager.getInstance().removeComponent(subdomain);
}
}
catch (Exception e) {
// Can't do anything about this problem...
Log.error(LocaleUtils.getLocalizedString("admin.error.close"), e);
}
finally {
// Remove the session
componentsSessions.remove(session);
}
}
}
private class IncomingServerSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
*
* @param handback The session that just closed
*/
public void onConnectionClose(Object handback) {
IncomingServerSession session = (IncomingServerSession)handback;
// Remove all the hostnames that were registered for this server session
for (String hostname : session.getValidatedDomains()) {
unregisterIncomingServerSession(hostname, session);
}
}
}
private class OutgoingServerSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
*
* @param handback The session that just closed
*/
public void onConnectionClose(Object handback) {
OutgoingServerSession session = (OutgoingServerSession)handback;
// Remove all the hostnames that were registered for this server session
for (String hostname : session.getHostnames()) {
unregisterOutgoingServerSession(hostname);
// Remove the route to the session using the hostname
XMPPServer.getInstance().getRoutingTable().removeRoute(new JID(hostname));
}
}
}
private class ConnectionMultiplexerSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
*
* @param handback The session that just closed
*/
public void onConnectionClose(Object handback) {
ConnectionMultiplexerSession session = (ConnectionMultiplexerSession)handback;
// Remove all the hostnames that were registered for this server session
String domain = se
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -