diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Affiliate.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Affiliate.java index 72d842f17..8177a75c0 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Affiliate.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Affiliate.java @@ -28,15 +28,14 @@ import org.jivesoftware.smackx.muc.packet.MUCItem; */ public class Affiliate { // Fields that must have a value - private String jid; - private String affiliation; + private final String jid; + private final MUCAffiliation affiliation; // Fields that may have a value - private String role; - private String nick; + private final MUCRole role; + private final String nick; Affiliate(MUCItem item) { - super(); this.jid = item.getJid(); this.affiliation = item.getAffiliation(); this.role = item.getRole(); @@ -58,18 +57,18 @@ public class Affiliate { * * @return the affiliation of the afffiliated user. */ - public String getAffiliation() { + public MUCAffiliation getAffiliation() { return affiliation; } /** * Returns the current role of the affiliated user if the user is currently in the room. - * If the user is not present in the room then the answer will be null. + * If the user is not present in the room then the answer will be 'none'. * * @return the current role of the affiliated user in the room or null if the user is not in * the room. */ - public String getRole() { + public MUCRole getRole() { return role; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCAffiliation.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCAffiliation.java new file mode 100644 index 000000000..77fa3f647 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCAffiliation.java @@ -0,0 +1,41 @@ +/** + * + * Copyright © 2014 Florian Schmaus + * + * 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.jivesoftware.smackx.muc; + +import java.util.Locale; + +/** + * XEP-0045: Multi-User-Chat - 5.2 Affiliations + * + * @see XEP-0045: Multi-User-Chat - 5.2 Affiliations + */ +public enum MUCAffiliation { + + owner, + admin, + member, + outcast, + none; + + public static MUCAffiliation fromString(String string) { + if (string == null) { + return null; + } + return MUCAffiliation.valueOf(string.toLowerCase(Locale.US)); + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCRole.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCRole.java new file mode 100644 index 000000000..1f23bc360 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MUCRole.java @@ -0,0 +1,39 @@ +/** + * + * Copyright © 2014 Florian Schmaus + * + * 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.jivesoftware.smackx.muc; + +import java.util.Locale; + +/** + * XEP-0045: Multi User Chat - 5.1 Roles + * + * @see XEP-0045: Multi-User-Chat - 5.1 Roles + */ +public enum MUCRole { + + moderator, + none, + participant, + visitor; + + public static MUCRole fromString(String string) { + if (string == null) { + return null; + } + return MUCRole.valueOf(string.toLowerCase(Locale.US)); + } +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index d12e5f9bf..3267b74fe 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -1018,7 +1018,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void kickParticipant(String nickname, String reason) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nickname, "none", reason); + changeRole(nickname, MUCRole.none, reason); } /** @@ -1035,7 +1035,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantVoice(Collection nicknames) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nicknames, "participant"); + changeRole(nicknames, MUCRole.participant); } /** @@ -1052,7 +1052,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantVoice(String nickname) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nickname, "participant", null); + changeRole(nickname, MUCRole.participant, null); } /** @@ -1069,7 +1069,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeVoice(Collection nicknames) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nicknames, "visitor"); + changeRole(nicknames, MUCRole.visitor); } /** @@ -1086,7 +1086,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeVoice(String nickname) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nickname, "visitor", null); + changeRole(nickname, MUCRole.visitor, null); } /** @@ -1104,7 +1104,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void banUsers(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "outcast"); + changeAffiliationByAdmin(jids, MUCAffiliation.outcast); } /** @@ -1123,7 +1123,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void banUser(String jid, String reason) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "outcast", reason); + changeAffiliationByAdmin(jid, MUCAffiliation.outcast, reason); } /** @@ -1137,7 +1137,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantMembership(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "member"); + changeAffiliationByAdmin(jids, MUCAffiliation.member); } /** @@ -1151,7 +1151,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantMembership(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "member", null); + changeAffiliationByAdmin(jid, MUCAffiliation.member, null); } /** @@ -1166,7 +1166,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeMembership(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "none"); + changeAffiliationByAdmin(jids, MUCAffiliation.none); } /** @@ -1181,7 +1181,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeMembership(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "none", null); + changeAffiliationByAdmin(jid, MUCAffiliation.none, null); } /** @@ -1195,7 +1195,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantModerator(Collection nicknames) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nicknames, "moderator"); + changeRole(nicknames, MUCRole.moderator); } /** @@ -1209,7 +1209,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantModerator(String nickname) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nickname, "moderator", null); + changeRole(nickname, MUCRole.moderator, null); } /** @@ -1224,7 +1224,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeModerator(Collection nicknames) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nicknames, "participant"); + changeRole(nicknames, MUCRole.participant); } /** @@ -1239,7 +1239,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeModerator(String nickname) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeRole(nickname, "participant", null); + changeRole(nickname, MUCRole.participant, null); } /** @@ -1254,7 +1254,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantOwnership(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "owner"); + changeAffiliationByAdmin(jids, MUCAffiliation.owner); } /** @@ -1269,7 +1269,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantOwnership(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "owner", null); + changeAffiliationByAdmin(jid, MUCAffiliation.owner, null); } /** @@ -1283,7 +1283,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeOwnership(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "admin"); + changeAffiliationByAdmin(jids, MUCAffiliation.admin); } /** @@ -1297,7 +1297,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeOwnership(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "admin", null); + changeAffiliationByAdmin(jid, MUCAffiliation.admin, null); } /** @@ -1311,7 +1311,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantAdmin(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "admin"); + changeAffiliationByAdmin(jids, MUCAffiliation.admin); } /** @@ -1326,7 +1326,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void grantAdmin(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "admin"); + changeAffiliationByAdmin(jid, MUCAffiliation.admin); } /** @@ -1340,7 +1340,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeAdmin(Collection jids) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jids, "member"); + changeAffiliationByAdmin(jids, MUCAffiliation.admin); } /** @@ -1355,7 +1355,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public void revokeAdmin(String jid) throws XMPPErrorException, NoResponseException, NotConnectedException { - changeAffiliationByAdmin(jid, "member"); + changeAffiliationByAdmin(jid, MUCAffiliation.member); } /** @@ -1367,7 +1367,7 @@ public class MultiUserChat { * @throws NoResponseException * @throws NotConnectedException */ - private void changeAffiliationByAdmin(String jid, String affiliation) + private void changeAffiliationByAdmin(String jid, MUCAffiliation affiliation) throws NoResponseException, XMPPErrorException, NotConnectedException { changeAffiliationByAdmin(jid, affiliation, null); @@ -1383,56 +1383,50 @@ public class MultiUserChat { * @throws NoResponseException * @throws NotConnectedException */ - private void changeAffiliationByAdmin(String jid, String affiliation, String reason) throws NoResponseException, XMPPErrorException, NotConnectedException + private void changeAffiliationByAdmin(String jid, MUCAffiliation affiliation, String reason) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.set); // Set the new affiliation. - MUCItem item = new MUCItem(affiliation, null); - item.setJid(jid); - item.setReason(reason); + MUCItem item = new MUCItem(affiliation, jid, reason); iq.addItem(item); connection.createPacketCollectorAndSend(iq).nextResultOrThrow(); } - private void changeAffiliationByAdmin(Collection jids, String affiliation) + private void changeAffiliationByAdmin(Collection jids, MUCAffiliation affiliation) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.set); for (String jid : jids) { // Set the new affiliation. - MUCItem item = new MUCItem(affiliation, null); - item.setJid(jid); + MUCItem item = new MUCItem(affiliation, jid); iq.addItem(item); } connection.createPacketCollectorAndSend(iq).nextResultOrThrow(); } - private void changeRole(String nickname, String role, String reason) throws NoResponseException, XMPPErrorException, NotConnectedException { + private void changeRole(String nickname, MUCRole role, String reason) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.set); // Set the new role. - MUCItem item = new MUCItem(null, role); - item.setNick(nickname); - item.setReason(reason); + MUCItem item = new MUCItem(role, nickname, reason); iq.addItem(item); connection.createPacketCollectorAndSend(iq).nextResultOrThrow(); } - private void changeRole(Collection nicknames, String role) throws NoResponseException, XMPPErrorException, NotConnectedException { + private void changeRole(Collection nicknames, MUCRole role) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.set); for (String nickname : nicknames) { // Set the new role. - MUCItem item = new MUCItem(null, role); - item.setNick(nickname); + MUCItem item = new MUCItem(role, nickname); iq.addItem(item); } @@ -1532,7 +1526,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getOwners() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getAffiliatesByAdmin("owner"); + return getAffiliatesByAdmin(MUCAffiliation.owner); } /** @@ -1544,7 +1538,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getAdmins() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getAffiliatesByAdmin("admin"); + return getAffiliatesByAdmin(MUCAffiliation.admin); } /** @@ -1556,7 +1550,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getMembers() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getAffiliatesByAdmin("member"); + return getAffiliatesByAdmin(MUCAffiliation.member); } /** @@ -1568,7 +1562,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getOutcasts() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getAffiliatesByAdmin("outcast"); + return getAffiliatesByAdmin(MUCAffiliation.outcast); } /** @@ -1581,12 +1575,12 @@ public class MultiUserChat { * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ - private Collection getAffiliatesByAdmin(String affiliation) throws NoResponseException, XMPPErrorException, NotConnectedException { + private Collection getAffiliatesByAdmin(MUCAffiliation affiliation) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.get); // Set the specified affiliation. This may request the list of owners/admins/members/outcasts. - MUCItem item = new MUCItem(affiliation, null); + MUCItem item = new MUCItem(affiliation); iq.addItem(item); MUCAdmin answer = (MUCAdmin) connection.createPacketCollectorAndSend(iq).nextResultOrThrow(); @@ -1608,7 +1602,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getModerators() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getOccupants("moderator"); + return getOccupants(MUCRole.moderator); } /** @@ -1620,7 +1614,7 @@ public class MultiUserChat { * @throws NotConnectedException */ public Collection getParticipants() throws NoResponseException, XMPPErrorException, NotConnectedException { - return getOccupants("participant"); + return getOccupants(MUCRole.participant); } /** @@ -1633,12 +1627,12 @@ public class MultiUserChat { * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ - private Collection getOccupants(String role) throws NoResponseException, XMPPErrorException, NotConnectedException { + private Collection getOccupants(MUCRole role) throws NoResponseException, XMPPErrorException, NotConnectedException { MUCAdmin iq = new MUCAdmin(); iq.setTo(room); iq.setType(IQ.Type.get); // Set the specified role. This may request the list of moderators/participants. - MUCItem item = new MUCItem(null, role); + MUCItem item = new MUCItem(role); iq.addItem(item); MUCAdmin answer = (MUCAdmin) connection.createPacketCollectorAndSend(iq).nextResultOrThrow(); @@ -1945,12 +1939,12 @@ public class MultiUserChat { if (oldPresence != null) { // Get the previous occupant's affiliation & role MUCUser mucExtension = MUCUser.getFrom(packet); - String oldAffiliation = mucExtension.getItem().getAffiliation(); - String oldRole = mucExtension.getItem().getRole(); + MUCAffiliation oldAffiliation = mucExtension.getItem().getAffiliation(); + MUCRole oldRole = mucExtension.getItem().getRole(); // Get the new occupant's affiliation & role mucExtension = MUCUser.getFrom(packet); - String newAffiliation = mucExtension.getItem().getAffiliation(); - String newRole = mucExtension.getItem().getRole(); + MUCAffiliation newAffiliation = mucExtension.getItem().getAffiliation(); + MUCRole newRole = mucExtension.getItem().getRole(); // Fire role modification events checkRoleModifications(oldRole, newRole, isUserStatusModification, from); // Fire affiliation modification events @@ -2054,8 +2048,8 @@ public class MultiUserChat { * (e.g. room@conference.jabber.org/nick). */ private void checkRoleModifications( - String oldRole, - String newRole, + MUCRole oldRole, + MUCRole newRole, boolean isUserModification, String from) { // Voice was granted to a visitor @@ -2168,8 +2162,8 @@ public class MultiUserChat { * (e.g. room@conference.jabber.org/nick). */ private void checkAffiliationModifications( - String oldAffiliation, - String newAffiliation, + MUCAffiliation oldAffiliation, + MUCAffiliation newAffiliation, boolean isUserModification, String from) { // First check for revoked affiliation and then for granted affiliations. The idea is to diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Occupant.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Occupant.java index 07bcc3027..caa629d3d 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Occupant.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/Occupant.java @@ -30,11 +30,11 @@ import org.jxmpp.util.XmppStringUtils; */ public class Occupant { // Fields that must have a value - private String affiliation; - private String role; + private final MUCAffiliation affiliation; + private final MUCRole role; // Fields that may have a value - private String jid; - private String nick; + private final String jid; + private final String nick; Occupant(MUCItem item) { this.jid = item.getJid(); @@ -72,7 +72,7 @@ public class Occupant { * * @return the affiliation of the occupant. */ - public String getAffiliation() { + public MUCAffiliation getAffiliation() { return affiliation; } @@ -82,7 +82,7 @@ public class Occupant { * * @return the current role of the occupant in the room. */ - public String getRole() { + public MUCRole getRole() { return role; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCItem.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCItem.java index f032dce41..354f5ccc4 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCItem.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCItem.java @@ -19,6 +19,8 @@ package org.jivesoftware.smackx.muc.packet; import org.jivesoftware.smack.packet.Element; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.util.XmlStringBuilder; +import org.jivesoftware.smackx.muc.MUCAffiliation; +import org.jivesoftware.smackx.muc.MUCRole; /** * Item child that holds information about roles, affiliation, jids and nicks. @@ -28,20 +30,35 @@ import org.jivesoftware.smack.util.XmlStringBuilder; public class MUCItem implements Element { public static final String ELEMENT = IQ.ITEM; - private final String affiliation; - private String role; - private String actor; - private String reason; - private String jid; - private String nick; + private final MUCAffiliation affiliation; + private final MUCRole role; + private final String actor; + private final String reason; + private final String jid; + private final String nick; - /** - * Creates a new item child. - * - * @param affiliation the actor's affiliation to the room - */ - public MUCItem(String affiliation) { - this.affiliation = affiliation; + public MUCItem(MUCAffiliation affiliation) { + this(affiliation, null, null, null, null, null); + } + + public MUCItem(MUCRole role) { + this(null, role, null, null, null, null); + } + + public MUCItem(MUCRole role, String nick) { + this(null, role, null, null, null, nick); + } + + public MUCItem(MUCAffiliation affiliation, String jid, String reason) { + this(affiliation, null, null, reason, jid, null); + } + + public MUCItem(MUCAffiliation affiliation, String jid) { + this(affiliation, null, null, null, jid, null); + } + + public MUCItem(MUCRole role, String nick, String reason) { + this(null, role, null, reason, null, nick); } /** @@ -49,10 +66,19 @@ public class MUCItem implements Element { * * @param affiliation the actor's affiliation to the room * @param role the privilege level of an occupant within a room. + * @param actor + * @param reason + * @param jid + * @param nick */ - public MUCItem(String affiliation, String role) { - this(affiliation); + public MUCItem(MUCAffiliation affiliation, MUCRole role, String actor, + String reason, String jid, String nick) { + this.affiliation = affiliation; this.role = role; + this.actor = actor; + this.reason = reason; + this.jid = jid; + this.nick = nick; } /** @@ -82,7 +108,7 @@ public class MUCItem implements Element { * * @return the actor's affiliation to the room */ - public String getAffiliation() { + public MUCAffiliation getAffiliation() { return affiliation; } @@ -108,71 +134,23 @@ public class MUCItem implements Element { /** * Returns the temporary position or privilege level of an occupant within a room. The possible - * roles are "moderator", "participant", and "visitor" (it is also possible to have no defined + * roles are "moderator", "participant", "visitor" and "none" (it is also possible to have no defined * role). A role lasts only for the duration of an occupant's visit to a room. * * @return the privilege level of an occupant within a room. */ - public String getRole() { + public MUCRole getRole() { return role; } - /** - * Sets the actor (JID of an occupant in the room) that was kicked or banned. - * - * @param actor the actor (JID of an occupant in the room) that was kicked or banned. - */ - public void setActor(String actor) { - this.actor = actor; - } - - /** - * Sets the reason for the item child. The reason is optional and could be used to explain the - * reason why a user (occupant) was kicked or banned. - * - * @param reason the reason why a user (occupant) was kicked or banned. - */ - public void setReason(String reason) { - this.reason = reason; - } - - /** - * Sets the by which an occupant is identified within the context of a room. - * If the room is non-anonymous, the JID will be included in the item. - * - * @param jid the JID by which an occupant is identified within a room. - */ - public void setJid(String jid) { - this.jid = jid; - } - - /** - * Sets the new nickname of an occupant that is changing his/her nickname. The new nickname is - * sent as part of the unavailable presence. - * - * @param nick the new nickname of an occupant that is changing his/her nickname. - */ - public void setNick(String nick) { - this.nick = nick; - } - - /** - * Sets the temporary position or privilege level of an occupant within a room. The possible - * roles are "moderator", "participant", and "visitor" (it is also possible to have no defined - * role). A role lasts only for the duration of an occupant's visit to a room. - * - * @param role the new privilege level of an occupant within a room. - */ - public void setRole(String role) { - this.role = role; - } - public XmlStringBuilder toXML() { XmlStringBuilder xml = new XmlStringBuilder(this); xml.optAttribute("affiliation", getAffiliation()); xml.optAttribute("jid", getJid()); xml.optAttribute("nick", getNick()); - xml.optAttribute("role", getRole()); + if (role != MUCRole.none) { + xml.attribute("role", getRole()); + } xml.rightAngleBracket(); xml.optElement("reason", getReason()); if (getActor() != null) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/provider/MUCParserUtils.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/provider/MUCParserUtils.java index 39a3ab27b..51a6c5a39 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/provider/MUCParserUtils.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/provider/MUCParserUtils.java @@ -16,34 +16,42 @@ */ package org.jivesoftware.smackx.muc.provider; +import org.jivesoftware.smackx.muc.MUCAffiliation; +import org.jivesoftware.smackx.muc.MUCRole; import org.jivesoftware.smackx.muc.packet.Destroy; import org.jivesoftware.smackx.muc.packet.MUCItem; import org.xmlpull.v1.XmlPullParser; public class MUCParserUtils { public static MUCItem parseItem(XmlPullParser parser) throws Exception { - boolean done = false; - MUCItem item = new MUCItem(parser.getAttributeValue("", "affiliation")); - item.setNick(parser.getAttributeValue("", "nick")); - item.setRole(parser.getAttributeValue("", "role")); - item.setJid(parser.getAttributeValue("", "jid")); - while (!done) { + int initialDepth = parser.getDepth(); + MUCAffiliation affiliation = MUCAffiliation.fromString(parser.getAttributeValue("", "affiliation")); + String nick = parser.getAttributeValue("", "nick"); + MUCRole role = MUCRole.fromString(parser.getAttributeValue("", "role")); + String jid = parser.getAttributeValue("", "jid"); + String actor = null; + String reason = null; + outerloop: while (true) { int eventType = parser.next(); - if (eventType == XmlPullParser.START_TAG) { - if (parser.getName().equals("actor")) { - item.setActor(parser.getAttributeValue("", "jid")); + switch (eventType) { + case XmlPullParser.START_TAG: + String name = parser.getName(); + switch (name) { + case "actor": + actor = parser.getAttributeValue("", "jid"); + break; + case "reason": + reason = parser.nextText(); + break; } - if (parser.getName().equals("reason")) { - item.setReason(parser.nextText()); - } - } - else if (eventType == XmlPullParser.END_TAG) { - if (parser.getName().equals("item")) { - done = true; + case XmlPullParser.END_TAG: + if (parser.getDepth() == initialDepth) { + break outerloop; } + break; } } - return item; + return new MUCItem(affiliation, role, actor, reason, jid, nick); } public static Destroy parseDestroy(XmlPullParser parser) throws Exception {