📄 roster.java
字号:
/**
* $RCSfile$
* $Revision: 2624 $
* $Date: 2005-05-11 12:56:11 -0700 (Wed, 11 May 2005) $
*
* Copyright 2004 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.xmpp.packet;
import org.dom4j.*;
import java.util.*;
/**
* Roster packet. The roster is a list of JIDs (typically other users) that
* the user wishes to track the presence of. Each roster item is keyed by
* JID and contains a nickname (optional), subscription type, and list of
* groups (optional).
*
* @author Matt Tucker
*/
public class Roster extends IQ {
/**
* Constructs a new Roster with an automatically generated ID and a type
* of {@link IQ.Type#get}.
*/
public Roster() {
super();
element.addElement("query", "jabber:iq:roster");
}
/**
* Constructs a new Roster using the specified type. A packet ID will
* be automatically generated.
*
* @param type the IQ type.
*/
public Roster(Type type) {
super(type);
element.addElement("query", "jabber:iq:roster");
}
/**
* Constructs a new Roster using the specified type and ID.
*
* @param type the IQ type.
* @param ID the packet ID of the IQ.
*/
public Roster(Type type, String ID) {
super(type, ID);
element.addElement("query", "jabber:iq:roster");
}
/**
* Constructs a new Roster that is a copy of an existing Roster.
*
* @param roster the roster packet.
* @see #createCopy()
*/
private Roster(Roster roster) {
Element elementCopy = roster.element.createCopy();
docFactory.createDocument().add(elementCopy);
this.element = elementCopy;
}
/**
* Constructs a new Roster using an existing Element. This is useful
* for parsing incoming roster Elements into Roster objects.
*
* @param element the Roster Element.
*/
public Roster(Element element) {
super(element);
}
/**
* Adds a new item to the roster. The name and groups are set to <tt>null</tt>
* If the roster packet already contains an item using the same JID, the
* information in the existing item will be overwritten with the new information.<p>
*
* The XMPP specification recommends that if the roster item is associated with another
* instant messaging user (human), that the JID be in bare form (e.g. user@domain).
* Use the {@link JID#toBareJID() toBareJID()} method for a bare JID.
*
* @param jid the JID.
* @param subscription the subscription type.
* @return the newly created item.
*/
public Item addItem(String jid, Subscription subscription) {
if (getType() == IQ.Type.get || getType() == IQ.Type.error) {
throw new IllegalStateException("IQ type must be 'result' or 'set'");
}
if (jid == null) {
throw new NullPointerException("JID cannot be null");
}
return addItem(new JID(jid), null, null, subscription, null);
}
/**
* Adds a new item to the roster. The name and groups are set to <tt>null</tt>
* If the roster packet already contains an item using the same JID, the
* information in the existing item will be overwritten with the new information.<p>
*
* The XMPP specification recommends that if the roster item is associated with another
* instant messaging user (human), that the JID be in bare form (e.g. user@domain).
* Use the {@link JID#toBareJID() toBareJID()} method for a bare JID.
*
* @param jid the JID.
* @param subscription the subscription type.
* @return the newly created item.
*/
public Item addItem(JID jid, Subscription subscription) {
if (getType() != IQ.Type.result && getType() != IQ.Type.set) {
throw new IllegalStateException("IQ type must be 'result' or 'set'");
}
if (jid == null) {
throw new NullPointerException("JID cannot be null");
}
return addItem(jid, null, null, subscription, null);
}
/**
* Adds a new item to the roster. If the roster packet already contains an item
* using the same JID, the information in the existing item will be overwritten
* with the new information.<p>
*
* The XMPP specification recommends that if the roster item is associated with another
* instant messaging user (human), that the JID be in bare form (e.g. user@domain).
* Use the {@link JID#toBareJID() toBareJID()} method for a bare JID.
*
* @param jid the JID.
* @param name the nickname.
* @param ask the ask type.
* @param subscription the subscription type.
* @param groups a Collection of groups.
* @return the newly created item.
*/
public Item addItem(JID jid, String name, Ask ask, Subscription subscription,
Collection<String> groups)
{
if (jid == null) {
throw new NullPointerException("JID cannot be null");
}
if (subscription == null) {
throw new NullPointerException("Subscription cannot be null");
}
Element query = element.element(new QName("query", Namespace.get("jabber:iq:roster")));
if (query == null) {
query = element.addElement("query", "jabber:iq:roster");
}
Element item = null;
for (Iterator i=query.elementIterator("item"); i.hasNext(); ) {
Element el = (Element)i.next();
if (el.attributeValue("jid").equals(jid.toString())) {
item = el;
}
}
if (item == null) {
item = query.addElement("item");
}
item.addAttribute("jid", jid.toBareJID());
item.addAttribute("name", name);
if (ask != null) {
item.addAttribute("ask", ask.toString());
}
item.addAttribute("subscription", subscription.toString());
// Erase existing groups in case the item previously existed.
for (Iterator i=item.elementIterator("group"); i.hasNext(); ) {
item.remove((Element)i.next());
}
// Add in groups.
if (groups != null) {
for (String group : groups) {
item.addElement("group").setText(group);
}
}
return new Item(jid, name, ask, subscription, groups);
}
/**
* Removes an item from this roster.
*
* @param jid the JID of the item to remove.
*/
public void removeItem(JID jid) {
Element query = element.element(new QName("query", Namespace.get("jabber:iq:roster")));
if (query != null) {
for (Iterator i=query.elementIterator("item"); i.hasNext(); ) {
Element item = (Element)i.next();
if (item.attributeValue("jid").equals(jid.toString())) {
query.remove(item);
return;
}
}
}
}
/**
* Returns an unmodifiable copy of the {@link Item Items} in the roster packet.
*
* @return an unmodifable copy of the {@link Item Items} in the roster packet.
*/
public Collection<Item> getItems() {
Collection<Item> items = new ArrayList<Item>();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -