Commit f90bd411 authored by Tom Evans's avatar Tom Evans Committed by tevans

OF-665: Propagate MUC room affiliation changes across cluster nodes

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/trunk@13633 b35dd754-fafc-0310-a699-88a17e54d16e
parent a738f60b
/**
* $RCSfile: $
* $Revision: $
* $Date: $
*
* Copyright (C) 2005-2008 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.muc.cluster;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.jivesoftware.openfire.muc.MUCRole;
import org.jivesoftware.openfire.muc.spi.LocalMUCRoom;
import org.jivesoftware.util.cache.ExternalizableUtil;
import org.xmpp.packet.JID;
/**
* Task that adds an affiliation for a room in the other cluster nodes.
*
* @author Tom Evans
*/
public class AddAffiliation extends MUCRoomTask {
private JID bareJID;
private MUCRole.Affiliation affiliation;
public AddAffiliation() {
super();
}
public AddAffiliation(LocalMUCRoom room, JID bareJID, MUCRole.Affiliation affiliation) {
super(room);
this.bareJID = bareJID.asBareJID();
this.affiliation = affiliation;
}
public AddAffiliation(LocalMUCRoom room, String bareJID, MUCRole.Affiliation affiliation) {
super(room);
this.bareJID = new JID(bareJID).asBareJID();
this.affiliation = affiliation;
}
public JID getBareJID() {
return bareJID;
}
public MUCRole.Affiliation getAffiliation() {
return affiliation;
}
public Object getResult() {
return null;
}
public void run() {
// Execute the operation considering that we may still be joining the cluster
execute(new Runnable() {
public void run() {
getRoom().affiliationAdded(AddAffiliation.this);
}
});
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
ExternalizableUtil.getInstance().writeSerializable(out, bareJID);
ExternalizableUtil.getInstance().writeSerializable(out, affiliation);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
super.readExternal(in);
bareJID = (JID) ExternalizableUtil.getInstance().readSerializable(in);
affiliation = (MUCRole.Affiliation) ExternalizableUtil.getInstance().readSerializable(in);
}
}
...@@ -57,6 +57,7 @@ import org.jivesoftware.openfire.muc.NotAllowedException; ...@@ -57,6 +57,7 @@ import org.jivesoftware.openfire.muc.NotAllowedException;
import org.jivesoftware.openfire.muc.RegistrationRequiredException; import org.jivesoftware.openfire.muc.RegistrationRequiredException;
import org.jivesoftware.openfire.muc.RoomLockedException; import org.jivesoftware.openfire.muc.RoomLockedException;
import org.jivesoftware.openfire.muc.ServiceUnavailableException; import org.jivesoftware.openfire.muc.ServiceUnavailableException;
import org.jivesoftware.openfire.muc.cluster.AddAffiliation;
import org.jivesoftware.openfire.muc.cluster.AddMember; import org.jivesoftware.openfire.muc.cluster.AddMember;
import org.jivesoftware.openfire.muc.cluster.BroadcastMessageRequest; import org.jivesoftware.openfire.muc.cluster.BroadcastMessageRequest;
import org.jivesoftware.openfire.muc.cluster.BroadcastPresenceRequest; import org.jivesoftware.openfire.muc.cluster.BroadcastPresenceRequest;
...@@ -1351,6 +1352,8 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1351,6 +1352,8 @@ public class LocalMUCRoom implements MUCRoom {
finally { finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
// Update other cluster nodes with new affiliation
CacheFactory.doClusterTask(new AddAffiliation(this, jid.toBareJID(), MUCRole.Affiliation.owner));
// Update the presence with the new affiliation and inform all occupants // Update the presence with the new affiliation and inform all occupants
try { try {
return changeOccupantAffiliation(jid, MUCRole.Affiliation.owner, return changeOccupantAffiliation(jid, MUCRole.Affiliation.owner,
...@@ -1406,6 +1409,8 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1406,6 +1409,8 @@ public class LocalMUCRoom implements MUCRoom {
finally { finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
// Update other cluster nodes with new affiliation
CacheFactory.doClusterTask(new AddAffiliation(this, jid.toBareJID(), MUCRole.Affiliation.admin));
// Update the presence with the new affiliation and inform all occupants // Update the presence with the new affiliation and inform all occupants
try { try {
return changeOccupantAffiliation(jid, MUCRole.Affiliation.admin, return changeOccupantAffiliation(jid, MUCRole.Affiliation.admin,
...@@ -1490,10 +1495,7 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1490,10 +1495,7 @@ public class LocalMUCRoom implements MUCRoom {
} }
private boolean removeMember(JID jid) { private boolean removeMember(JID jid) {
final JID bareJID = jid.asBareJID(); return members.remove(jid.asBareJID()) != null;
boolean answer = members.containsKey(bareJID);
members.remove(bareJID);
return answer;
} }
public List<Presence> addOutcast(JID jid, String reason, MUCRole senderRole) public List<Presence> addOutcast(JID jid, String reason, MUCRole senderRole)
...@@ -1539,6 +1541,8 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1539,6 +1541,8 @@ public class LocalMUCRoom implements MUCRoom {
finally { finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
// Update other cluster nodes with new affiliation
CacheFactory.doClusterTask(new AddAffiliation(this, jid.toBareJID(), MUCRole.Affiliation.outcast));
// Update the presence with the new affiliation and inform all occupants // Update the presence with the new affiliation and inform all occupants
// actorJID will be null if the room itself (ie. via admin console) made the request // actorJID will be null if the room itself (ie. via admin console) made the request
JID actorJID = senderRole.getUserAddress(); JID actorJID = senderRole.getUserAddress();
...@@ -1606,6 +1610,8 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1606,6 +1610,8 @@ public class LocalMUCRoom implements MUCRoom {
finally { finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
// Update other cluster nodes with new affiliation
CacheFactory.doClusterTask(new AddAffiliation(this, jid.toBareJID(), MUCRole.Affiliation.none));
// Update the presence with the new affiliation and inform all occupants // Update the presence with the new affiliation and inform all occupants
try { try {
MUCRole.Role newRole; MUCRole.Role newRole;
...@@ -1726,10 +1732,45 @@ public class LocalMUCRoom implements MUCRoom { ...@@ -1726,10 +1732,45 @@ public class LocalMUCRoom implements MUCRoom {
} }
public void memberAdded(AddMember addMember) { public void memberAdded(AddMember addMember) {
JID bareJID = addMember.getBareJID();
removeOwner(bareJID);
removeAdmin(bareJID);
removeOutcast(bareJID);
// Associate the reserved nickname with the bareJID // Associate the reserved nickname with the bareJID
members.put(addMember.getBareJID(), addMember.getNickname()); members.put(addMember.getBareJID(), addMember.getNickname());
} }
public void affiliationAdded(AddAffiliation affiliation) {
JID bareJID = affiliation.getBareJID();
switch(affiliation.getAffiliation()) {
case owner:
removeMember(bareJID);
removeAdmin(bareJID);
removeOutcast(bareJID);
owners.add(bareJID);
break;
case admin:
removeMember(bareJID);
removeOwner(bareJID);
removeOutcast(bareJID);
admins.add(bareJID);
break;
case outcast:
removeMember(bareJID);
removeAdmin(bareJID);
removeOwner(bareJID);
outcasts.add(bareJID);
break;
case none:
default:
removeMember(bareJID);
removeAdmin(bareJID);
removeOwner(bareJID);
removeOutcast(bareJID);
break;
}
}
public void nicknameChanged(MUCRole occupantRole, Presence newPresence, String oldNick, String newNick) { public void nicknameChanged(MUCRole occupantRole, Presence newPresence, String oldNick, String newNick) {
// Ask other cluster nodes to update the nickname of the occupant // Ask other cluster nodes to update the nickname of the occupant
ChangeNickname request = new ChangeNickname(this, oldNick, newNick, newPresence.createCopy()); ChangeNickname request = new ChangeNickname(this, oldNick, newNick, newPresence.createCopy());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment