根据openfire源码的提供,其中SubscriptionPlugin这个插件已经实现了自动添加了好友的功能,但好我项目的的要求还是有些不一样,我根据源码中的内容自己编写了一个插件,关键代码如下:
public static void acceptSubscription(Packet packet ,PresenceRouter router) throws PacketRejectedException {
String serverName = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
if (getSubscriptionLevel().equals(LOCAL)) {
String toDomain = packet.getTo().getDomain();
String fromDomain = packet.getFrom().getDomain();
if (!toDomain.equals(serverName) || !fromDomain.equals(serverName)) {
return;
}
}
Presence presence = new Presence();
presence.setType(Presence.Type.subscribed);
presence.setTo(packet.getTo());
presence.setFrom(packet.getFrom());
router.route(presence);
String toUserName = packet.getTo().getNode();
try {
// 获取昵称
String nickName = UserManager.getInstance().getUser(toUserName).getName();
if (nickName == null || nickName.trim().length() == 0){
nickName = packet.getFrom().getNode();
}
// 添加一个分组为fans的名
List<String> groups = new ArrayList<String>();
groups.add("fans");
RosterItem item = new RosterItem(packet.getFrom(), RosterItem.SUB_BOTH, RosterItem.ASK_NONE, RosterItem.RECV_NONE, nickName, groups);
RosterManager.getRosterItemProvider().createItem(toUserName, item);
// 将状态设置为 “相互为好友”
Iterator<RosterItem> rosterItemIterator= RosterManager.getRosterItemProvider().getItems(packet.getFrom().getNode());
if (rosterItemIterator != null){
while (rosterItemIterator.hasNext()) {
RosterItem rosterItem = (RosterItem) rosterItemIterator.next();
if (toUserName.equals(rosterItem.getJid().getNode())){
rosterItem.setSubStatus(RosterItem.SUB_BOTH);
RosterManager.getRosterItemProvider().updateItem(toUserName, rosterItem);
break;
}
}
}
Cache cache[] = CacheFactory.getAllCaches();
if (cache != null){
for (Cache cache2 : cache) {
if("Roster".equals(cache2.getName())){
cache2.clear();
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
throw new PacketRejectedException();
}
而在其中,缓存的刷新尤其重要,不然,只有重启服务器,你才能看到两个好友之间才是真正的订阅关系的!