📄 rosteritem.java
字号:
/**
* $RCSfile: RosterItem.java,v $
* $Revision: 3080 $
* $Date: 2005-11-15 01:28:23 -0300 (Tue, 15 Nov 2005) $
*
* Copyright (C) 2008 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution, or a commercial license
* agreement with Jive.
*/
package org.jivesoftware.openfire.roster;
import org.jivesoftware.openfire.SharedGroupException;
import org.jivesoftware.openfire.group.Group;
import org.jivesoftware.openfire.group.GroupManager;
import org.jivesoftware.openfire.group.GroupNotFoundException;
import org.jivesoftware.openfire.user.UserNameManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.IntEnum;
import org.jivesoftware.util.cache.CacheSizes;
import org.jivesoftware.util.cache.Cacheable;
import org.jivesoftware.util.cache.ExternalizableUtil;
import org.xmpp.packet.JID;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.*;
/**
* <p>Represents a single roster item for a User's Roster.</p>
* <p>The server doesn't need to know anything about roster groups so they are
* not stored with easy retrieval or manipulation in mind. The important data
* elements of a roster item (beyond the jid adddress of the roster entry) includes:</p>
* <p/>
* <ul>
* <li>nick - A nickname for the user when used in this roster</li>
* <li>sub - A subscription type: to, from, none, both</li>
* <li>ask - An optional subscription ask status: subscribe, unsubscribe</li>
* <li>groups - A list of groups to organize roster entries under (e.g. friends, co-workers, etc)</li>
* </ul>
*
* @author Gaston Dombiak
*/
public class RosterItem implements Cacheable, Externalizable {
public static class SubType extends IntEnum {
protected SubType(String name, int value) {
super(name, value);
register(this);
}
public static SubType getTypeFromInt(int value) {
return (SubType)getEnumFromInt(SubType.class, value);
}
}
public static class AskType extends IntEnum {
protected AskType(String name, int value) {
super(name, value);
register(this);
}
public static AskType getTypeFromInt(int value) {
return (AskType)getEnumFromInt(AskType.class, value);
}
}
public static class RecvType extends IntEnum {
protected RecvType(String name, int value) {
super(name, value);
register(this);
}
public static RecvType getTypeFromInt(int value) {
return (RecvType)getEnumFromInt(RecvType.class, value);
}
}
/**
* <p>Indicates the roster item should be removed.</p>
*/
public static final SubType SUB_REMOVE = new SubType("remove", -1);
/**
* <p>No subscription is established.</p>
*/
public static final SubType SUB_NONE = new SubType("none", 0);
/**
* <p>The roster owner has a subscription to the roster item's presence.</p>
*/
public static final SubType SUB_TO = new SubType("to", 1);
/**
* <p>The roster item has a subscription to the roster owner's presence.</p>
*/
public static final SubType SUB_FROM = new SubType("from", 2);
/**
* <p>The roster item and owner have a mutual subscription.</p>
*/
public static final SubType SUB_BOTH = new SubType("both", 3);
/**
* <p>The roster item has no pending subscription requests.</p>
*/
public static final AskType ASK_NONE = new AskType("", -1);
/**
* <p>The roster item has been asked for permission to subscribe to their presence
* but no response has been received.</p>
*/
public static final AskType ASK_SUBSCRIBE = new AskType("subscribe", 0);
/**
* <p>The roster owner has asked to the roster item to unsubscribe from it's
* presence but has not received confirmation.</p>
*/
public static final AskType ASK_UNSUBSCRIBE = new AskType("unsubscribe", 1);
/**
* <p>There are no subscriptions that have been received but not presented to the user.</p>
*/
public static final RecvType RECV_NONE = new RecvType("", -1);
/**
* <p>The server has received a subscribe request, but has not forwarded it to the user.</p>
*/
public static final RecvType RECV_SUBSCRIBE = new RecvType("sub", 1);
/**
* <p>The server has received an unsubscribe request, but has not forwarded it to the user.</p>
*/
public static final RecvType RECV_UNSUBSCRIBE = new RecvType("unsub", 2);
protected RecvType recvStatus;
protected JID jid;
protected String nickname;
protected List<String> groups;
protected Set<String> sharedGroups = new HashSet<String>();
protected Set<String> invisibleSharedGroups = new HashSet<String>();
protected SubType subStatus;
protected AskType askStatus;
/**
* Holds the ID that uniquely identifies the roster in the backend store. A value of
* zero means that the roster item is not persistent.
*/
private long rosterID;
/**
* Constructor added for Externalizable. Do not use this constructor.
*/
public RosterItem() {
}
public RosterItem(long id,
JID jid,
SubType subStatus,
AskType askStatus,
RecvType recvStatus,
String nickname,
List<String> groups) {
this(jid, subStatus, askStatus, recvStatus, nickname, groups);
this.rosterID = id;
}
public RosterItem(JID jid,
SubType subStatus,
AskType askStatus,
RecvType recvStatus,
String nickname,
List<String> groups) {
this.jid = jid;
this.subStatus = subStatus;
this.askStatus = askStatus;
this.recvStatus = recvStatus;
this.nickname = nickname;
this.groups = new LinkedList<String>();
if (groups != null) {
for (String group : groups) {
this.groups.add(group);
}
}
}
/**
* Create a roster item from the data in another one.
*
* @param item Item that contains the info of the roster item.
*/
public RosterItem(org.xmpp.packet.Roster.Item item) {
this(item.getJID(),
getSubType(item),
getAskStatus(item),
RosterItem.RECV_NONE,
item.getName(),
new LinkedList<String>(item.getGroups()));
}
private static RosterItem.AskType getAskStatus(org.xmpp.packet.Roster.Item item) {
if (item.getAsk() == org.xmpp.packet.Roster.Ask.subscribe) {
return RosterItem.ASK_SUBSCRIBE;
}
else if (item.getAsk() == org.xmpp.packet.Roster.Ask.unsubscribe) {
return RosterItem.ASK_UNSUBSCRIBE;
}
else {
return RosterItem.ASK_NONE;
}
}
private static RosterItem.SubType getSubType(org.xmpp.packet.Roster.Item item) {
if (item.getSubscription() == org.xmpp.packet.Roster.Subscription.to) {
return RosterItem.SUB_TO;
}
else if (item.getSubscription() == org.xmpp.packet.Roster.Subscription.from) {
return RosterItem.SUB_FROM;
}
else if (item.getSubscription() == org.xmpp.packet.Roster.Subscription.both) {
return RosterItem.SUB_BOTH;
}
else if (item.getSubscription() == org.xmpp.packet.Roster.Subscription.remove) {
return RosterItem.SUB_REMOVE;
}
else {
return RosterItem.SUB_NONE;
}
}
/**
* <p>Obtain the current subscription status of the item.</p>
*
* @return The subscription status of the item
*/
public SubType getSubStatus() {
return subStatus;
}
/**
* <p>Set the current subscription status of the item.</p>
*
* @param subStatus The subscription status of the item
*/
public void setSubStatus(SubType subStatus) {
// Optimization: Load user only if we need to set the nickname of the roster item
if ("".equals(nickname) && (subStatus == SUB_BOTH || subStatus == SUB_TO)) {
try {
nickname = UserNameManager.getUserName(jid);
}
catch (UserNotFoundException e) {
// Do nothing
}
}
this.subStatus = subStatus;
}
/**
* <p>Obtain the current ask status of the item.</p>
*
* @return The ask status of the item
*/
public AskType getAskStatus() {
if (isShared()) {
// Redefine the ask status since the item belongs to a shared group
return ASK_NONE;
}
else {
return askStatus;
}
}
/**
* <p>Set the current ask status of the item.</p>
*
* @param askStatus The ask status of the item
*/
public void setAskStatus(AskType askStatus) {
this.askStatus = askStatus;
}
/**
* <p>Obtain the current recv status of the item.</p>
*
* @return The recv status of the item
*/
public RecvType getRecvStatus() {
return recvStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -