/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.vysper.xmpp.modules.extension.xep0045_muc.model; import java.util.EnumSet; import org.apache.vysper.compliance.SpecCompliant; /** * Roles are temporary in that they do not necessarily persist across a user's visits to the room and MAY * change during the course of an occupant's visit to the room. An implementation MAY persist roles across * visits and SHOULD do so for moderated rooms (since the distinction between visitor and participant is * critical to the functioning of a moderated room). * * There is no one-to-one mapping between roles and affiliations (e.g., a member could be a participant or * a visitor). * * A moderator is the most powerful occupant within the context of the room, and can to some extent manage * other occupants' roles in the room. A participant has fewer privileges than a moderator, although he or * she always has the right to speak. A visitor is a more restricted role within the context of a moderated * room, since visitors are not allowed to send messages to all occupants. * * Roles are granted, revoked, and maintained based on the occupant's room nickname or full JID rather than * bare JID. The privileges associated with these roles, as well as the actions that trigger changes in roles, * are defined below. * * Information about roles MUST be sent in all presence stanzas generated or reflected by the room and thus * sent to occupants. * * @author The Apache MINA Project (dev@mina.apache.org) */ @SpecCompliant(spec = "xep-0045", section = "5.1", status = SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE) public enum Role { Moderator, None, Participant, Visitor; @Override public String toString() { return name().toLowerCase(); } @SpecCompliant(spec = "xep-0045", section = "7.1.4", status = SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE) public static Role getRole(Affiliation affiliation, EnumSet<RoomType> roomTypes) { switch (affiliation) { case Owner: case Admin: return Moderator; case Member: return Participant; case None: if (roomTypes.contains(RoomType.MembersOnly)) { return None; } else if (roomTypes.contains(RoomType.Moderated)) { return Visitor; } else { return Participant; } default: // no role for Outcast return null; } } public static Role fromString(String value) { if (Moderator.toString().equals(value)) return Moderator; else if (None.toString().equals(value)) return None; else if (Participant.toString().equals(value)) return Participant; else if (Visitor.toString().equals(value)) return Visitor; else throw new IllegalArgumentException("Unknown role: " + value); } }