📄 mucpersistencemanager.java
字号:
pstmt.executeUpdate();
}
else {
pstmt = con.prepareStatement(ADD_ROOM);
pstmt.setLong(1, room.getID());
pstmt.setString(2, StringUtils.dateToMillis(room.getCreationDate()));
pstmt.setString(3, StringUtils.dateToMillis(room.getModificationDate()));
pstmt.setString(4, room.getName());
pstmt.setString(5, room.getNaturalLanguageName());
pstmt.setString(6, room.getDescription());
pstmt.setString(7, StringUtils.dateToMillis(room.getLockedDate()));
Date emptyDate = room.getEmptyDate();
if (emptyDate == null) {
pstmt.setString(8, null);
}
else {
pstmt.setString(8, StringUtils.dateToMillis(emptyDate));
}
pstmt.setInt(9, (room.canOccupantsChangeSubject() ? 1 : 0));
pstmt.setInt(10, room.getMaxUsers());
pstmt.setInt(11, (room.isPublicRoom() ? 1 : 0));
pstmt.setInt(12, (room.isModerated() ? 1 : 0));
pstmt.setInt(13, (room.isMembersOnly() ? 1 : 0));
pstmt.setInt(14, (room.canOccupantsInvite() ? 1 : 0));
pstmt.setString(15, room.getPassword());
pstmt.setInt(16, (room.canAnyoneDiscoverJID() ? 1 : 0));
pstmt.setInt(17, (room.isLogEnabled() ? 1 : 0));
pstmt.setString(18, room.getSubject());
pstmt.setInt(19, marshallRolesToBroadcast(room));
pstmt.setInt(20, (room.isLoginRestrictedToNickname() ? 1 : 0));
pstmt.setInt(21, (room.canChangeNickname() ? 1 : 0));
pstmt.setInt(22, (room.isRegistrationEnabled() ? 1 : 0));
pstmt.executeUpdate();
}
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
try { if (pstmt != null) pstmt.close(); }
catch (Exception e) { Log.error(e); }
try { if (con != null) con.close(); }
catch (Exception e) { Log.error(e); }
}
}
/**
* Removes the room configuration and its affiliates from the database.
*
* @param room the room to remove from the database.
*/
public static void deleteFromDB(MUCRoom room) {
if (!room.isPersistent() || !room.wasSavedToDB()) {
return;
}
Connection con = null;
PreparedStatement pstmt = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
pstmt = con.prepareStatement(DELETE_AFFILIATIONS);
pstmt.setLong(1, room.getID());
pstmt.executeUpdate();
pstmt.close();
pstmt = con.prepareStatement(DELETE_MEMBERS);
pstmt.setLong(1, room.getID());
pstmt.executeUpdate();
pstmt.close();
pstmt = con.prepareStatement(DELETE_ROOM);
pstmt.setLong(1, room.getID());
pstmt.executeUpdate();
// Update the room (in memory) to indicate the it's no longer in the database.
room.setSavedToDB(false);
}
catch (SQLException sqle) {
Log.error(sqle);
abortTransaction = true;
}
finally {
try { if (pstmt != null) pstmt.close(); }
catch (Exception e) { Log.error(e); }
DbConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
/**
* Loads all the rooms that had occupants after a given date from the database. This query
* will be executed only when the service is starting up.
*
* @param chatserver the chat server that will hold the loaded rooms.
* @param emptyDate rooms that hadn't been used before this date won't be loaded.
* @param packetRouter the PacketRouter that loaded rooms will use to send packets.
* @return a collection with all the persistent rooms.
*/
public static Collection<LocalMUCRoom> loadRoomsFromDB(MultiUserChatServer chatserver,
Date emptyDate, PacketRouter packetRouter) {
Connection con = null;
PreparedStatement pstmt = null;
Map<Long, LocalMUCRoom> rooms = new HashMap<Long, LocalMUCRoom>();
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_ALL_ROOMS);
pstmt.setString(1, StringUtils.dateToMillis(emptyDate));
ResultSet rs = pstmt.executeQuery();
LocalMUCRoom room = null;
while (rs.next()) {
room = new LocalMUCRoom(chatserver, rs.getString(4), packetRouter);
room.setID(rs.getLong(1));
room.setCreationDate(new Date(Long.parseLong(rs.getString(2).trim()))); // creation date
room.setModificationDate(new Date(Long.parseLong(rs.getString(3).trim()))); // modification date
room.setNaturalLanguageName(rs.getString(5));
room.setDescription(rs.getString(6));
room.setLockedDate(new Date(Long.parseLong(rs.getString(7).trim())));
if (rs.getString(8) != null) {
room.setEmptyDate(new Date(Long.parseLong(rs.getString(8).trim())));
}
else {
room.setEmptyDate(null);
}
room.setCanOccupantsChangeSubject(rs.getInt(9) == 1 ? true : false);
room.setMaxUsers(rs.getInt(10));
room.setPublicRoom(rs.getInt(11) == 1 ? true : false);
room.setModerated(rs.getInt(12) == 1 ? true : false);
room.setMembersOnly(rs.getInt(13) == 1 ? true : false);
room.setCanOccupantsInvite(rs.getInt(14) == 1 ? true : false);
room.setPassword(rs.getString(15));
room.setCanAnyoneDiscoverJID(rs.getInt(16) == 1 ? true : false);
room.setLogEnabled(rs.getInt(17) == 1 ? true : false);
room.setSubject(rs.getString(18));
List<String> rolesToBroadcast = new ArrayList<String>();
String roles = Integer.toBinaryString(rs.getInt(19));
if (roles.charAt(0) == '1') {
rolesToBroadcast.add("moderator");
}
if (roles.length() > 1 && roles.charAt(1) == '1') {
rolesToBroadcast.add("participant");
}
if (roles.length() > 2 && roles.charAt(2) == '1') {
rolesToBroadcast.add("visitor");
}
room.setRolesToBroadcastPresence(rolesToBroadcast);
room.setLoginRestrictedToNickname(rs.getInt(20) == 1 ? true : false);
room.setChangeNickname(rs.getInt(21) == 1 ? true : false);
room.setRegistrationEnabled(rs.getInt(22) == 1 ? true : false);
room.setPersistent(true);
rooms.put(room.getID(), room);
}
rs.close();
pstmt.close();
pstmt = con.prepareStatement(LOAD_ALL_HISTORY);
// Recreate the history until two days ago
long from = System.currentTimeMillis() - (86400000 * 2);
pstmt.setString(1, StringUtils.dateToMillis(new Date(from)));
// Load the rooms conversations from the last two days
rs = pstmt.executeQuery();
while (rs.next()) {
room = (LocalMUCRoom) rooms.get(rs.getLong(1));
// Skip to the next position if the room does not exist
if (room == null) {
continue;
}
String senderJID = rs.getString(2);
String nickname = rs.getString(3);
Date sentDate = new Date(Long.parseLong(rs.getString(4).trim()));
String subject = rs.getString(5);
String body = rs.getString(6);
try {
// Recreate the history only for the rooms that have the conversation logging
// enabled
if (room.isLogEnabled()) {
room.getRoomHistory().addOldMessage(senderJID, nickname, sentDate, subject,
body);
}
}
catch (Exception e) {
Log.error(e);
}
}
rs.close();
pstmt.close();
// Add the last known room subject to the room history only for those rooms that still
// don't have in their histories the last room subject
for (MUCRoom loadedRoom : rooms.values()) {
if (!loadedRoom.getRoomHistory().hasChangedSubject() &&
loadedRoom.getSubject() != null &&
loadedRoom.getSubject().length() > 0) {
loadedRoom.getRoomHistory().addOldMessage(loadedRoom.getRole().getRoleAddress()
.toString(), null,
loadedRoom.getModificationDate(), loadedRoom.getSubject(), null);
}
}
pstmt = con.prepareStatement(LOAD_ALL_AFFILIATIONS);
rs = pstmt.executeQuery();
while (rs.next()) {
long roomID = rs.getLong(1);
String jid = rs.getString(2);
MUCRole.Affiliation affiliation = MUCRole.Affiliation.valueOf(rs.getInt(3));
room = (LocalMUCRoom) rooms.get(roomID);
// Skip to the next position if the room does not exist
if (room == null) {
continue;
}
try {
switch (affiliation) {
case owner:
room.addOwner(jid, room.getRole());
break;
case admin:
room.addAdmin(jid, room.getRole());
break;
case outcast:
room.addOutcast(jid, null, room.getRole());
break;
default:
Log.error("Unkown affiliation value " + affiliation + " for user "
+ jid + " in persistent room " + room.getID());
}
}
catch (Exception e) {
Log.error(e);
}
}
rs.close();
pstmt.close();
pstmt = con.prepareStatement(LOAD_ALL_MEMBERS);
rs = pstmt.executeQuery();
while (rs.next()) {
room = (LocalMUCRoom) rooms.get(rs.getLong(1));
// Skip to the next position if the room does not exist
if (room == null) {
continue;
}
try {
room.addMember(rs.getString(2), rs.getString(3), room.getRole());
}
catch (Exception e) {
Log.error(e);
}
}
rs.close();
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
try { if (pstmt != null) pstmt.close(); }
catch (Exception e) { Log.error(e); }
try { if (con != null) con.close(); }
catch (Exception e) { Log.error(e); }
}
// Set now that the room's configuration is updated in the database. Note: We need to
// set this now since otherwise the room's affiliations will be saved to the database
// "again" while adding them to the room!
for (MUCRoom room : rooms.values()) {
room.setSavedToDB(true);
if (room.getEmptyDate() == null) {
// The service process was killed somehow while the room was being used. Since
// the room won't have occupants at this time we need to set the best date when
// the last occupant left the room that we can
room.setEmptyDate(new Date());
}
}
return rooms.values();
}
/**
* Updates the room's subject in the database.
*
* @param room the room to update its subject in the database.
*/
public static void updateRoomSubject(MUCRoom room) {
if (!room.isPersistent() || !room.wasSavedToDB()) {
return;
}
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(UPDATE_SUBJECT);
pstmt.setString(1, room.getSubject());
pstmt.setLong(2, room.getID());
pstmt.executeUpdate();
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
try { if (pstmt != null) pstmt.close(); }
catch (Exception e) { Log.error(e); }
try { if (con != null) con.close(); }
catch (Exception e) { Log.error(e); }
}
}
/**
* Updates the room's lock status in the database.
*
* @param room the room to update its lock status in the database.
*/
public static void updateRoomLock(LocalMUCRoom room) {
if (!room.isPersistent() || !room.wasSavedToDB()) {
return;
}
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(UPDATE_LOCK);
pstmt.setString(1, StringUtils.dateToMillis(room.getLockedDate()));
pstmt.setLong(2, room.getID());
pstmt.executeUpdate();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -