Commit 20afb484 authored by Gaston Dombiak's avatar Gaston Dombiak Committed by gaston

1) Changed to push display name instead of group name. JM-109

2) Shared groups in roster can now be turned on or off per group. JM-109


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@842 b35dd754-fafc-0310-a699-88a17e54d16e
parent e17c67aa
......@@ -74,6 +74,12 @@ public class Roster implements Cacheable {
try {
User rosterUser = UserManager.getInstance().getUser(getUsername());
sharedGroups = GroupManager.getInstance().getGroups(rosterUser);
// Remove groups that are not being shown in group members' rosters
for (Iterator<Group> it=sharedGroups.iterator(); it.hasNext();) {
if (!"true".equals(it.next().getProperties().get("showInRoster"))) {
it.remove();
}
}
}
catch (UserNotFoundException e) {
sharedGroups = new ArrayList<Group>();
......@@ -89,7 +95,7 @@ public class Roster implements Cacheable {
for (Group group : sharedGroups) {
if (group.isUser(item.getJid().getNode())) {
// TODO Group name conflicts are not being considered (do we need this?)
item.addSharedGroup(group.getName());
item.addSharedGroup(group.getProperties().get("displayName"));
}
}
rosterItems.put(item.getJid().toBareJID(), item);
......@@ -99,8 +105,9 @@ public class Roster implements Cacheable {
for (JID jid : sharedUsers.keySet()) {
try {
User user = UserManager.getInstance().getUser(jid.getNode());
String nickname = "".equals(user.getName()) ? jid.getNode() : user.getName();
RosterItem item = new RosterItem(jid, RosterItem.SUB_BOTH, RosterItem.ASK_NONE,
RosterItem.RECV_NONE, user.getName(), null);
RosterItem.RECV_NONE, nickname , null);
for (String group : sharedUsers.get(jid)) {
item.addSharedGroup(group);
}
......@@ -224,7 +231,7 @@ public class Roster implements Cacheable {
Collection<Group> sharedGroups = GroupManager.getInstance().getGroups();
for (String group : groups) {
for (Group sharedGroup : sharedGroups) {
if (sharedGroup.getName().equals(group)) {
if (group.equals(sharedGroup.getProperties().get("displayName"))) {
throw new SharedGroupException("Cannot add an item to a shared group");
}
}
......@@ -412,7 +419,7 @@ public class Roster implements Cacheable {
groups = new ArrayList<String>();
sharedGroupUsers.put(jid, groups);
}
groups.add(group.getName());
groups.add(group.getProperties().get("displayName"));
}
}
}
......@@ -477,14 +484,19 @@ public class Roster implements Cacheable {
try {
// Get the RosterItem for the *local* user to add
item = getRosterItem(jid);
// Do nothing if the item already includes the shared group
if (item.getSharedGroups().contains(sharedGroup)) {
return;
}
}
catch (UserNotFoundException e) {
try {
// Create a new RosterItem for this new user
User user = UserManager.getInstance().getUser(addedUser);
String nickname = "".equals(user.getName()) ? jid.getNode() : user.getName();
item =
new RosterItem(jid, RosterItem.SUB_BOTH, RosterItem.ASK_NONE,
RosterItem.RECV_NONE, user.getName(), null);
RosterItem.RECV_NONE, nickname, null);
// Add the new item to the list of items
rosterItems.put(item.getJid().toBareJID(), item);
}
......@@ -536,4 +548,34 @@ public class Roster implements Cacheable {
// Do nothing since the contact does not exist in the user's roster. (strange case!)
}
}
/**
* A shared group of the user has been renamed. Update the existing roster items with the new
* name of the shared group and make a roster push for all the available resources.
*
* @param oldName old name of the shared group.
* @param newName new name of the shared group.
* @param users group users of the renamed group.
*/
void shareGroupRenamed(String oldName, String newName, Collection<String> users) {
for (String user : users) {
if (username.equals(user)) {
continue;
}
RosterItem item = null;
JID jid = XMPPServer.getInstance().createJID(user, "");
try {
// Get the RosterItem for the *local* user to add
item = getRosterItem(jid);
// Update the shared group name in the list of shared groups
item.removeSharedGroup(oldName);
item.addSharedGroup(newName);
// Brodcast to all the user resources of the updated roster item
broadcast(item);
}
catch (UserNotFoundException e) {
// Do nothing since the contact does not exist in the user's roster. (strange case!)
}
}
}
}
\ No newline at end of file
......@@ -141,25 +141,93 @@ public class RosterManager extends BasicModule implements GroupEventListener {
}
public void groupModified(Group group, Map params) {
//TODO Implement this
// Do nothing if no group property has been modified
if (!"propertyModified".equals(params.get("type"))) {
return;
}
String originalValue = (String) params.get("originalValue");
if ("showInRoster".equals(params.get("propertyKey"))) {
String currentValue = group.getProperties().get("showInRoster");
// Nothing has changed so do nothing.
if (currentValue.equals(originalValue)) {
return;
}
// Get all the group users
Collection<String> users = new ArrayList<String>(group.getMembers());
users.addAll(group.getAdmins());
if ("true".equals(currentValue)) {
// We must show group in group members' rosters
// Iterate on all the group users and update their rosters
for (String addedUser : users) {
groupUserAdded(group, addedUser);
}
}
else {
// We must remove group from group members' rosters
// Iterate on all the group users and update their rosters
for (String deletedUser : users) {
groupUserDeleted(group, deletedUser);
}
}
}
else if ("displayName".equals(params.get("propertyKey"))) {
String currentValue = group.getProperties().get("displayName");
// Nothing has changed so do nothing.
if (currentValue.equals(originalValue)) {
return;
}
// Do nothing if the group is not being shown in group members' rosters
if (!"true".equals(group.getProperties().get("showInRoster"))) {
return;
}
// Get all the group users
Collection<String> users = new ArrayList<String>(group.getMembers());
users.addAll(group.getAdmins());
// Iterate on all the group users and update their rosters
for (String updatedUser : users) {
// Get the roster to update.
Roster roster = (Roster) CacheManager.getCache("username2roster").get(updatedUser);
if (roster != null) {
// Update the roster with the new group display name
roster.shareGroupRenamed(originalValue, currentValue, users);
}
}
}
}
public void memberAdded(Group group, Map params) {
// Do nothing if the group is not being shown in group members' rosters
if (!"true".equals(group.getProperties().get("showInRoster"))) {
return;
}
String addedUser = (String) params.get("member");
groupUserAdded(group, addedUser);
}
public void memberRemoved(Group group, Map params) {
// Do nothing if the group is not being shown in group members' rosters
if (!"true".equals(group.getProperties().get("showInRoster"))) {
return;
}
String addedUser = (String) params.get("member");
groupUserDeleted(group, addedUser);
}
public void adminAdded(Group group, Map params) {
// Do nothing if the group is not being shown in group members' rosters
if (!"true".equals(group.getProperties().get("showInRoster"))) {
return;
}
String addedUser = (String) params.get("admin");
groupUserAdded(group, addedUser);
}
public void adminRemoved(Group group, Map params) {
// Do nothing if the group is not being shown in group members' rosters
if (!"true".equals(group.getProperties().get("showInRoster"))) {
return;
}
String addedUser = (String) params.get("admin");
groupUserDeleted(group, addedUser);
}
......@@ -176,6 +244,8 @@ public class RosterManager extends BasicModule implements GroupEventListener {
users.addAll(group.getAdmins());
// Get the roster of the added user.
Roster addedUserRoster = (Roster) CacheManager.getCache("username2roster").get(addedUser);
// Get the display name of the group
String groupName = group.getProperties().get("displayName");
// Iterate on all the group users and update their rosters
for (String userToUpdate : users) {
......@@ -184,11 +254,11 @@ public class RosterManager extends BasicModule implements GroupEventListener {
Roster roster = (Roster)CacheManager.getCache("username2roster").get(userToUpdate);
// Only update rosters in memory
if (roster != null) {
roster.addSharedUser(group.getName(), addedUser);
roster.addSharedUser(groupName, addedUser);
}
// Update the roster of the newly added group user
if (addedUserRoster != null) {
addedUserRoster.addSharedUser(group.getName(), userToUpdate);
addedUserRoster.addSharedUser(groupName, userToUpdate);
}
}
}
......@@ -206,6 +276,8 @@ public class RosterManager extends BasicModule implements GroupEventListener {
users.addAll(group.getAdmins());
// Get the roster of the deleted user.
Roster deletedUserRoster = (Roster) CacheManager.getCache("username2roster").get(deletedUser);
// Get the display name of the group
String groupName = group.getProperties().get("displayName");
// Iterate on all the group users and update their rosters
for (String userToUpdate : users) {
......@@ -213,11 +285,11 @@ public class RosterManager extends BasicModule implements GroupEventListener {
Roster roster = (Roster)CacheManager.getCache("username2roster").get(userToUpdate);
// Only update rosters in memory
if (roster != null) {
roster.deleteSharedUser(group.getName(), deletedUser);
roster.deleteSharedUser(groupName, deletedUser);
}
// Update the roster of the newly deleted group user
if (deletedUserRoster != null) {
deletedUserRoster.deleteSharedUser(group.getName(), userToUpdate);
deletedUserRoster.deleteSharedUser(groupName, userToUpdate);
}
}
}
......
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