📄 multiuserchatserverimpl.java
字号:
for (int index = 0; index <= log_batch_size && !logQueue.isEmpty(); index++) {
entry = logQueue.poll();
if (entry != null) {
success = MUCPersistenceManager.saveConversationLogEntry(entry);
if (!success) {
logQueue.add(entry);
}
}
}
}
/**
* Logs all the remaining conversation log entries to the database. Use this method to force
* saving all the conversation log entries before the service becomes unavailable.
*/
private void logAllConversation() {
ConversationLogEntry entry;
while (!logQueue.isEmpty()) {
entry = logQueue.poll();
if (entry != null) {
MUCPersistenceManager.saveConversationLogEntry(entry);
}
}
}
/**
* Removes from memory rooms that have been without activity for a period of time. A room is
* considered without activity when no occupants are present in the room for a while.
*/
private class CleanupTask extends TimerTask {
public void run() {
if (ClusterManager.isClusteringStarted() && !ClusterManager.isSeniorClusterMember()) {
// Do nothing if we are in a cluster and this JVM is not the senior cluster member
return;
}
try {
cleanupRooms();
}
catch (Throwable e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
}
}
}
private void cleanupRooms() {
for (MUCRoom room : rooms.values()) {
if (room.getEmptyDate() != null && room.getEmptyDate().before(getCleanupDate())) {
removeChatRoom(room.getName());
}
}
}
public MUCRoom getChatRoom(String roomName, JID userjid) throws NotAllowedException {
LocalMUCRoom room;
boolean loaded = false;
boolean created = false;
synchronized (roomName.intern()) {
room = rooms.get(roomName);
if (room == null) {
room = new LocalMUCRoom(this, roomName, router);
// If the room is persistent load the configuration values from the DB
try {
// Try to load the room's configuration from the database (if the room is
// persistent but was added to the DB after the server was started up or the
// room may be an old room that was not present in memory)
MUCPersistenceManager.loadFromDB((LocalMUCRoom) room);
loaded = true;
}
catch (IllegalArgumentException e) {
// The room does not exist so check for creation permissions
// Room creation is always allowed for sysadmin
if (isRoomCreationRestricted() &&
!sysadmins.contains(userjid.toBareJID())) {
// The room creation is only allowed for certain JIDs
if (!allowedToCreate.contains(userjid.toBareJID())) {
// The user is not in the list of allowed JIDs to create a room so raise
// an exception
throw new NotAllowedException();
}
}
room.addFirstOwner(userjid.toBareJID());
created = true;
}
rooms.put(roomName, room);
}
}
if (created) {
// Fire event that a new room has been created
for (MUCEventListener listener : listeners) {
listener.roomCreated(room.getRole().getRoleAddress());
}
}
if (loaded || created) {
// Notify other cluster nodes that a new room is available
CacheFactory.doClusterTask(new RoomAvailableEvent(room));
for (MUCRole role : room.getOccupants()) {
if (role instanceof LocalMUCRole) {
CacheFactory.doClusterTask(new OccupantAddedEvent(room, role));
}
}
}
return room;
}
public MUCRoom getChatRoom(String roomName) {
boolean loaded = false;
LocalMUCRoom room = rooms.get(roomName);
if (room == null) {
// Check if the room exists in the database and was not present in memory
synchronized (roomName.intern()) {
room = rooms.get(roomName);
if (room == null) {
room = new LocalMUCRoom(this, roomName, router);
// If the room is persistent load the configuration values from the DB
try {
// Try to load the room's configuration from the database (if the room is
// persistent but was added to the DB after the server was started up or the
// room may be an old room that was not present in memory)
MUCPersistenceManager.loadFromDB((LocalMUCRoom) room);
loaded = true;
rooms.put(roomName, room);
}
catch (IllegalArgumentException e) {
// The room does not exist so do nothing
room = null;
}
}
}
}
if (loaded) {
// Notify other cluster nodes that a new room is available
CacheFactory.doClusterTask(new RoomAvailableEvent(room));
}
return room;
}
public List<MUCRoom> getChatRooms() {
return new ArrayList<MUCRoom>(rooms.values());
}
public boolean hasChatRoom(String roomName) {
return getChatRoom(roomName) != null;
}
public void removeChatRoom(String roomName) {
removeChatRoom(roomName, true);
}
/**
* Notification message indicating that the specified chat room was
* removed from some other cluster member.
*
* @param roomName the name of the room removed from the cluster.
*/
public void chatRoomRemoved(String roomName) {
removeChatRoom(roomName, false);
}
/**
* Notification message indicating that a chat room has been created
* in another cluster member.
*
* @param room the created room in another cluster node.
*/
public void chatRoomAdded(LocalMUCRoom room) {
rooms.put(room.getName(), room);
}
private void removeChatRoom(String roomName, boolean notify) {
MUCRoom room = rooms.remove(roomName);
if (room != null) {
totalChatTime += room.getChatLength();
if (notify) {
// Notify other cluster nodes that a room has been removed
CacheFactory.doClusterTask(new RoomRemovedEvent(roomName));
}
}
}
public String getServiceName() {
return chatServiceName;
}
public HistoryStrategy getHistoryStrategy() {
return historyStrategy;
}
/**
* Removes a user from all chat rooms.
*
* @param jabberID The user's normal jid, not the chat nickname jid.
*/
private void removeUser(JID jabberID) {
LocalMUCUser user = users.remove(jabberID);
if (user != null) {
for (LocalMUCRole role : user.getRoles()) {
try {
role.getChatRoom().leaveRoom(role);
}
catch (Exception e) {
Log.error(e);
}
}
}
}
/**
* Obtain a chat user by XMPPAddress. Only returns users that are connected to this JVM.
*
* @param userjid The XMPPAddress of the user.
* @param roomName name of the room to receive the packet.
* @return The chatuser corresponding to that XMPPAddress.
*/
private MUCUser getChatUser(JID userjid, String roomName) {
if (router == null) {
throw new IllegalStateException("Not initialized");
}
LocalMUCUser user;
synchronized (userjid.toString().intern()) {
user = users.get(userjid);
if (user == null) {
if (roomName != null) {
// Check if the JID belong to a user hosted in another cluster node
LocalMUCRoom localMUCRoom = rooms.get(roomName);
if (localMUCRoom != null) {
MUCRole occupant = localMUCRoom.getOccupantByFullJID(userjid);
if (occupant != null && !occupant.isLocal()) {
return new RemoteMUCUser(userjid, localMUCRoom);
}
}
}
user = new LocalMUCUser(this, router, userjid);
users.put(userjid, user);
}
}
return user;
}
public Collection<MUCRole> getMUCRoles(JID user) {
List<MUCRole> userRoles = new ArrayList<MUCRole>();
for (LocalMUCRoom room : rooms.values()) {
MUCRole role = room.getOccupantByFullJID(user);
if (role != null) {
userRoles.add(role);
}
}
return userRoles;
}
public void setServiceName(String name) {
JiveGlobals.setProperty("xmpp.muc.service", name);
}
/**
* Returns the limit date after which rooms without activity will be removed from memory.
*
* @return the limit date after which rooms without activity will be removed from memory.
*/
private Date getCleanupDate() {
return new Date(System.currentTimeMillis() - (emptyLimit * 3600000));
}
public void setKickIdleUsersTimeout(int timeout) {
if (this.user_timeout == timeout) {
return;
}
// Cancel the existing task because the timeout has changed
if (userTimeoutTask != null) {
userTimeoutTask.cancel();
}
this.user_timeout = timeout;
// Create a new task and schedule it with the new timeout
userTimeoutTask = new UserTimeoutTask();
timer.schedule(userTimeoutTask, user_timeout, user_timeout);
// Set the new property value
JiveGlobals.setProperty("xmpp.muc.tasks.user.timeout", Integer.toString(timeout));
}
public int getKickIdleUsersTimeout() {
return user_timeout;
}
public void setUserIdleTime(int idleTime) {
if (this.user_idle == idleTime) {
return;
}
this.user_idle = idleTime;
// Set the new property value
JiveGlobals.setProperty("xmpp.muc.tasks.user.idle", Integer.toString(idleTime));
}
public int getUserIdleTime() {
return user_idle;
}
public void setLogConversationsTimeout(int timeout) {
if (this.log_timeout == timeout) {
return;
}
// Cancel the existing task because the timeout has changed
if (logConversationTask != null) {
logConversationTask.cancel();
}
this.log_timeout = timeout;
// Create a new task and schedule it with the new timeout
logConversationTask = new LogConversationTask();
timer.schedule(logConversationTask, log_timeout, log_timeout);
// Set the new property value
JiveGlobals.setProperty("xmpp.muc.tasks.log.timeout", Integer.toString(timeout));
}
public int getLogConversationsTimeout() {
return log_timeout;
}
public void setLogConversationBatchSize(int size) {
if (this.log_batch_size == size) {
return;
}
this.log_batch_size = size;
// Set the new property value
JiveGlobals.setProperty("xmpp.muc.tasks.log.batchsize", Integer.toString(size));
}
public int getLogConversationBatchSize() {
return log_batch_size;
}
public Collection<String> getUsersAllowedToCreate() {
return allowedToCreate;
}
public Collection<String> getSysadmins() {
return sysadmins;
}
public void addSysadmin(String userJID) {
sysadmins.add(userJID.trim().toLowerCase());
// CopyOnWriteArray does not allow sorting, so do sorting in temp list.
ArrayList<String> tempList = new ArrayList<String>(sysadmins);
Collections.sort(tempList);
sysadmins = new CopyOnWriteArrayList<String>(tempList);
// Update the config.
String[] jids = new String[sysadmins.size()];
jids = sysadmins.toArray(jids);
JiveGlobals.setProperty("xmpp.muc.sysadmin.jid", fromArray(jids));
}
public void removeSysadmin(String userJID) {
sysadmins.remove(userJID.trim().toLowerCase());
// Update the config.
String[] jids = new String[sysadmins.size()];
jids = sysadmins.toArray(jids);
JiveGlobals.setProperty("xmpp.muc.sysadmin.jid", fromArray(jids));
}
/**
* Returns the flag that indicates if the service should provide information about locked rooms
* when handling service discovery requests.
*
* @return true if the service should provide information about locked rooms.
*/
public boolean isAllowToDiscoverLockedRooms() {
return allowToDiscoverLockedRooms;
}
/**
* Sets the flag that indicates if the service should provide information about locked rooms
* when handling service discovery requests.
* Note: Setting this flag in false is not compliant with the spec. A user may try to join a
* locked room thinking that the room doesn't exist because the user didn't discover it before.
*
* @param allowToDiscoverLockedRooms if the service should provide information about locked
* rooms.
*/
public void setAllowToDiscoverLockedRooms(boolean allowToDiscoverLockedRooms) {
this.allowToDiscoverLockedRooms = allowToDiscoverLockedRooms;
JiveGlobals.setProperty("xmpp.muc.discover.locked",
Boolean.toString(allowToDiscoverLockedRooms));
}
public boolean isRoomCreationRestricted() {
return roomCreationRestricted;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -