1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.packet;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Collections;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.IQ;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * IQ packet that serves for kicking users, granting and revoking voice, banning users,
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * modifying the ban list, granting and revoking membership and granting and revoking
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * moderator privileges. All these operations are scoped by the
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 'http://jabber.org/protocol/muc#admin' namespace.
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class MUCAdmin extends IQ {
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private List<Item> items = new ArrayList<Item>();
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns an Iterator for item childs that holds information about roles, affiliation,
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * jids and nicks.
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return an Iterator for item childs that holds information about roles, affiliation,
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *          jids and nicks.
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public Iterator<Item> getItems() {
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        synchronized (items) {
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return Collections.unmodifiableList(new ArrayList<Item>(items)).iterator();
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Adds an item child that holds information about roles, affiliation, jids and nicks.
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param item the item child that holds information about roles, affiliation, jids and nicks.
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void addItem(Item item) {
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        synchronized (items) {
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            items.add(item);
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getChildElementXML() {
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buf = new StringBuilder();
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<query xmlns=\"http://jabber.org/protocol/muc#admin\">");
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        synchronized (items) {
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < items.size(); i++) {
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Item item = items.get(i);
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(item.toXML());
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Add packet extensions, if any are defined.
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append(getExtensionsXML());
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("</query>");
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return buf.toString();
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Item child that holds information about roles, affiliation, jids and nicks.
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @author Gaston Dombiak
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class Item {
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String actor;
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String reason;
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String affiliation;
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String jid;
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String nick;
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String role;
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Creates a new item child.
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param affiliation the actor's affiliation to the room
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param role the privilege level of an occupant within a room.
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Item(String affiliation, String role) {
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.affiliation = affiliation;
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.role = role;
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the actor (JID of an occupant in the room) that was kicked or banned.
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the JID of an occupant in the room that was kicked or banned.
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getActor() {
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return actor;
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the reason for the item child. The reason is optional and could be used to
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * explain the reason why a user (occupant) was kicked or banned.
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the reason for the item child.
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getReason() {
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return reason;
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the occupant's affiliation to the room. The affiliation is a semi-permanent
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * association or connection with a room. The possible affiliations are "owner", "admin",
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * "member", and "outcast" (naturally it is also possible to have no affiliation). An
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * affiliation lasts across a user's visits to a room.
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the actor's affiliation to the room
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getAffiliation() {
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return affiliation;
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the <room@service/nick> by which an occupant is identified within the context
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * of a room. If the room is non-anonymous, the JID will be included in the item.
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the room JID by which an occupant is identified within the room.
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getJid() {
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return jid;
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the new nickname of an occupant that is changing his/her nickname. The new
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * nickname is sent as part of the unavailable presence.
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the new nickname of an occupant that is changing his/her nickname.
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getNick() {
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return nick;
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the temporary position or privilege level of an occupant within a room. The
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * possible roles are "moderator", "participant", and "visitor" (it is also possible to
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * have no defined role). A role lasts only for the duration of an occupant's visit to
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * a room.
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the privilege level of an occupant within a room.
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getRole() {
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return role;
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the actor (JID of an occupant in the room) that was kicked or banned.
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param actor the actor (JID of an occupant in the room) that was kicked or banned.
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setActor(String actor) {
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.actor = actor;
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the reason for the item child. The reason is optional and could be used to
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * explain the reason why a user (occupant) was kicked or banned.
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param reason the reason why a user (occupant) was kicked or banned.
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setReason(String reason) {
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.reason = reason;
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the <room@service/nick> by which an occupant is identified within the context
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * of a room. If the room is non-anonymous, the JID will be included in the item.
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param jid the JID by which an occupant is identified within a room.
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setJid(String jid) {
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.jid = jid;
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the new nickname of an occupant that is changing his/her nickname. The new
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * nickname is sent as part of the unavailable presence.
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param nick the new nickname of an occupant that is changing his/her nickname.
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setNick(String nick) {
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.nick = nick;
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String toXML() {
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            StringBuilder buf = new StringBuilder();
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<item");
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getAffiliation() != null) {
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" affiliation=\"").append(getAffiliation()).append("\"");
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getJid() != null) {
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" jid=\"").append(getJid()).append("\"");
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getNick() != null) {
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" nick=\"").append(getNick()).append("\"");
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getRole() != null) {
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" role=\"").append(getRole()).append("\"");
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getReason() == null && getActor() == null) {
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("/>");
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else {
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(">");
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (getReason() != null) {
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    buf.append("<reason>").append(getReason()).append("</reason>");
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (getActor() != null) {
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    buf.append("<actor jid=\"").append(getActor()).append("\"/>");
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("</item>");
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return buf.toString();
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    };
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
238