📄 sessionmanager.java
字号:
}
public boolean isActiveRoute(String username, String resource) {
boolean hasRoute = false;
// Check if there is an anonymous session
if (resource != null && resource.equals(username) &&
anonymousSessions.containsKey(resource)) {
hasRoute = true;
}
else {
// Check if there is a session for a registered user
Session session = null;
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
if (resource == null) {
hasRoute = !sessionMap.isEmpty();
}
else {
if (sessionMap.hasSession(resource)) {
session = sessionMap.getSession(resource);
}
}
}
// Makes sure the session is still active
// Must occur outside of the lock since validation can cause
// the socket to close - deadlocking on session removal
if (session != null && !session.getConnection().isClosed()) {
hasRoute = session.getConnection().validate();
}
}
return hasRoute;
}
/**
* Returns the session responsible for this JID.
*
* @param from the sender of the packet.
* @return the <code>Session</code> associated with the JID.
*/
public ClientSession getSession(JID from) {
// Return null if the JID is null
if (from == null) {
return null;
}
return getSession(from.getNode(), from.getDomain(), from.getResource());
}
/**
* Returns the session responsible for this JID data. The returned Session may have never sent
* an available presence (thus not have a route) or could be a Session that hasn't
* authenticated yet (i.e. preAuthenticatedSessions).
*
* @param username the username of the JID.
* @param domain the username of the JID.
* @param resource the username of the JID.
* @return the <code>Session</code> associated with the JID data.
*/
public ClientSession getSession(String username, String domain, String resource) {
// Return null if the JID's data belongs to a foreign server. If the server is
// shutting down then serverName will be null so answer null too in this case.
if (serverName == null || !serverName.equals(domain)) {
return null;
}
ClientSession session = null;
// Initially Check preAuthenticated Sessions
if (resource != null) {
session = preAuthenticatedSessions.get(resource);
if (session != null) {
return session;
}
}
if (resource == null || username == null) {
return null;
}
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
session = sessionMap.getSession(resource);
}
else if (!userManager.isRegisteredUser(username)) {
session = anonymousSessions.get(resource);
}
return session;
}
/**
* Returns a list that contains all client sessions connected to the server. The list
* contains sessions of anonymous and non-anonymous users.
*
* @return a list that contains all client sessions connected to the server.
*/
public Collection<ClientSession> getSessions() {
List<ClientSession> allSessions = new ArrayList<ClientSession>();
copyAllUserSessions(allSessions);
copyAnonSessions(allSessions);
return allSessions;
}
public Collection<ClientSession> getSessions(SessionResultFilter filter) {
List<ClientSession> results = new ArrayList<ClientSession>();
if (filter != null) {
// Grab all the possible matching sessions by user
if (filter.getUsername() == null) {
// No user id filtering
copyAnonSessions(results);
copyAllUserSessions(results);
}
else {
try {
copyUserSessions(userManager.getUser(filter.getUsername()).getUsername(),
results);
}
catch (UserNotFoundException e) {
// Ignore.
}
}
Date createMin = filter.getCreationDateRangeMin();
Date createMax = filter.getCreationDateRangeMax();
Date activityMin = filter.getLastActivityDateRangeMin();
Date activityMax = filter.getLastActivityDateRangeMax();
// Now we have a copy of the references so we can spend some time
// doing the rest of the filtering without locking out session access
// so let's iterate and filter each session one by one
List<ClientSession> filteredResults = new ArrayList<ClientSession>();
for (ClientSession session : results) {
// Now filter on creation date if needed
if (createMin != null || createMax != null) {
if (!isBetweenDates(session.getCreationDate(), createMin, createMax)) {
session = null;
}
}
// Now filter on activity date if needed
if ((activityMin != null || activityMax != null) && session != null) {
if (!isBetweenDates(session.getLastActiveDate(), activityMin, activityMax)) {
session = null;
}
}
if (session != null) {
if (!isBetweenPacketCount(session.getNumClientPackets(),
filter.getClientPacketRangeMin(),
filter.getClientPacketRangeMax())) {
session = null;
}
}
if (session != null) {
if (!isBetweenPacketCount(session.getNumServerPackets(),
filter.getServerPacketRangeMin(),
filter.getServerPacketRangeMax())) {
session = null;
}
}
if (session != null) {
filteredResults.add(session);
}
}
// Sort list.
Collections.sort(filteredResults, filter.getSortComparator());
int maxResults = filter.getNumResults();
if (maxResults == SessionResultFilter.NO_RESULT_LIMIT) {
maxResults = filteredResults.size();
}
// Now generate the final list. I believe it's faster to to build up a new
// list than it is to remove items from head and tail of the sorted tree
List<ClientSession> finalResults = new ArrayList<ClientSession>();
int startIndex = filter.getStartIndex();
Iterator<ClientSession> sortedIter = filteredResults.iterator();
for (int i = 0; sortedIter.hasNext() && finalResults.size() < maxResults; i++) {
ClientSession result = sortedIter.next();
if (i >= startIndex) {
finalResults.add(result);
}
}
return finalResults;
}
return results;
}
/**
* Returns the list of sessions that were originated by a remote server. The list will be
* ordered chronologically. IncomingServerSession can only receive packets from the remote
* server but are not capable of sending packets to the remote server.
*
* @param hostname the name of the remote server.
* @return the sessions that were originated by a remote server.
*/
public List<IncomingServerSession> getIncomingServerSessions(String hostname) {
List<IncomingServerSession> sessions = incomingServerSessions.get(hostname);
if (sessions == null) {
return Collections.emptyList();
}
else {
return Collections.unmodifiableList(sessions);
}
}
/**
* Returns a session that was originated from this server to a remote server.
* OutgoingServerSession an only send packets to the remote server but are not capable of
* receiving packets from the remote server.
*
* @param hostname the name of the remote server.
* @return a session that was originated from this server to a remote server.
*/
public OutgoingServerSession getOutgoingServerSession(String hostname) {
return outgoingServerSessions.get(hostname);
}
/**
* <p>Determines if the given date is before the min date, or after the max date.</p>
* <p>The check is complicated somewhat by the fact that min can be null indicating
* no earlier date, and max can be null indicating no upper limit.</p>
*
* @param date The date to check
* @param min The date must be after min, or any if min is null
* @param max The date must be before max, or any if max is null
* @return True if the date is between min and max
*/
private boolean isBetweenDates(Date date, Date min, Date max) {
boolean between = true;
if (min != null) {
if (date.before(min)) {
between = false;
}
}
if (max != null && between) {
if (date.after(max)) {
between = false;
}
}
return between;
}
/**
* <p>Determines if the given count is before the min count, or after the max count.</p>
* <p>The check is complicated somewhat by the fact that min or max
* can be SessionResultFilter.NO_PACKET_LIMIT indicating no limit.</p>
*
* @param count The count to check
* @param min The count must be over min, or any if min is SessionResultFilter.NO_PACKET_LIMIT
* @param max The count must be under max, or any if max is SessionResultFilter.NO_PACKET_LIMIT
* @return True if the count is between min and max
*/
private boolean isBetweenPacketCount(long count, long min, long max) {
boolean between = true;
if (min != SessionResultFilter.NO_PACKET_LIMIT) {
if (count < min) {
between = false;
}
}
if (max != SessionResultFilter.NO_PACKET_LIMIT && between) {
if (count > max) {
between = false;
}
}
return between;
}
private void copyAnonSessions(List<ClientSession> sessions) {
// Add anonymous sessions
sessions.addAll(anonymousSessions.values());
}
private void copyAllUserSessions(List<ClientSession> sessions) {
// Get a copy of the sessions from all users
for(SessionMap sessionMap : this.sessions.values()) {
if(sessionMap != null) {
sessions.addAll(sessionMap.getSessions());
}
}
}
private void copyUserSessions(String username, List<ClientSession> sessionList) {
// Get a copy of the sessions from all users
SessionMap sessionMap = sessions.get(username);
if (sessionMap != null) {
sessionList.addAll(sessionMap.getSessions());
}
}
public Iterator getAnonymousSessions() {
return Collections.unmodifiableCollection(anonymousSessions.values()).iterator();
}
public Collection<ClientSession> getSessions(String username) {
List<ClientSession> sessionList = new ArrayList<ClientSession>();
if (username != null) {
copyUserSessions(username, sessionList);
}
return sessionList;
}
/**
* Returns number of client sessions that are connected to the server. Anonymous users
* are included too.
*
* @return number of client sessions that are connected to the server.
*/
public int getSessionCount() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -