Class MultiUserChatServiceImpl

  • All Implemented Interfaces:
    DiscoInfoProvider, DiscoItemsProvider, ServerItemsProvider, MultiUserChatService, XMPPServerListener, org.xmpp.component.Component

    public class MultiUserChatServiceImpl
    extends Object
    implements org.xmpp.component.Component, MultiUserChatService, ServerItemsProvider, DiscoInfoProvider, DiscoItemsProvider, XMPPServerListener
    Implements the chat server as a cached memory resident chat server. The server is also responsible for responding Multi-User Chat disco requests as well as removing inactive users from the rooms after a period of time and to maintain a log of the conversation in the rooms that require to log their conversations. The conversations log is saved to the database using a separate process.

    Temporary rooms are held in memory as long as they have occupants. They will be destroyed after the last occupant left the room. On the other hand, persistent rooms are always present in memory even after the last occupant left the room. In order to keep memory clean of persistent rooms that have been forgotten or abandoned this class includes a clean up process. The clean up process will remove from memory rooms that haven't had occupants for a while. Moreover, forgotten or abandoned rooms won't be loaded into memory when the Multi-User Chat service starts up.

    Author:
    Gaston Dombiak
    • Constructor Detail

      • MultiUserChatServiceImpl

        public MultiUserChatServiceImpl​(String subdomain,
                                        String description,
                                        Boolean isHidden)
        Create a new group chat server.
        Parameters:
        subdomain - Subdomain portion of the conference services (for example, conference for conference.example.org)
        description - Short description of service for disco and such. If null or empty, a default value will be used.
        isHidden - True if this service should be hidden from services views.
        Throws:
        IllegalArgumentException - if the provided subdomain is an invalid, according to the JID domain definition.
    • Method Detail

      • addIQHandler

        public void addIQHandler​(IQHandler iqHandler)
        Description copied from interface: MultiUserChatService
        Add a IQHandler to MUC rooms and services. If the IQHandler only supports one or other, it should quietly ignore it.
        Specified by:
        addIQHandler in interface MultiUserChatService
        Parameters:
        iqHandler - the IQ handler to add
      • getDescription

        public String getDescription()
        Specified by:
        getDescription in interface org.xmpp.component.Component
      • setDescription

        public void setDescription​(String desc)
      • processPacket

        public void processPacket​(org.xmpp.packet.Packet packet)
        Specified by:
        processPacket in interface org.xmpp.component.Component
      • initialize

        public void initialize​(org.xmpp.packet.JID jid,
                               org.xmpp.component.ComponentManager componentManager)
        Specified by:
        initialize in interface org.xmpp.component.Component
      • shutdown

        public void shutdown()
        Specified by:
        shutdown in interface org.xmpp.component.Component
      • getServiceDomain

        public String getServiceDomain()
        Description copied from interface: MultiUserChatService
        Returns the fully-qualifed domain name of this chat service. The domain is composed by the service name and the name of the XMPP server where the service is running.
        Specified by:
        getServiceDomain in interface MultiUserChatService
        Returns:
        the chat server domain (service name + host name).
      • getAddress

        public org.xmpp.packet.JID getAddress()
      • serverStarted

        public void serverStarted()
        Description copied from interface: XMPPServerListener
        Notification message indicating that the server has been started. At this point all server modules have been initialized and started. Message sending and receiving is now possible. However, some plugins may still be pending to be loaded.
        Specified by:
        serverStarted in interface XMPPServerListener
      • serverStopping

        public void serverStopping()
        Description copied from interface: XMPPServerListener
        Notification message indication that the server is about to be stopped. At this point all modules are still running so all services are still available.
        Specified by:
        serverStopping in interface XMPPServerListener
      • getChatRoom

        public MUCRoom getChatRoom​(String roomName,
                                   org.xmpp.packet.JID userjid)
                            throws NotAllowedException
        Description copied from interface: MultiUserChatService
        Obtains a chatroom by name. A chatroom is created for that name if none exists and the user has permission. The user that asked for the chatroom will be the room's owner if the chatroom was created.
        Specified by:
        getChatRoom in interface MultiUserChatService
        Parameters:
        roomName - Name of the room to get.
        userjid - The user's normal jid, not the chat nickname jid.
        Returns:
        The chatroom for the given name.
        Throws:
        NotAllowedException - If the caller doesn't have permission to create a new room.
      • getChatRoom

        public MUCRoom getChatRoom​(String roomName)
        Description copied from interface: MultiUserChatService
        Obtains a chatroom by name. If the chatroom does not exists then null will be returned.
        Specified by:
        getChatRoom in interface MultiUserChatService
        Parameters:
        roomName - Name of the room to get.
        Returns:
        The chatroom for the given name or null if the room does not exists.
      • refreshChatRoom

        public void refreshChatRoom​(String roomName)
        Description copied from interface: MultiUserChatService
        Forces a re-read of the room. Useful when a change occurs externally.
        Specified by:
        refreshChatRoom in interface MultiUserChatService
        Parameters:
        roomName - Name of the room to refresh.
      • getChatRooms

        public List<MUCRoom> getChatRooms()
        Description copied from interface: MultiUserChatService
        Retuns a list with a snapshot of all the rooms in the server (i.e. persistent or not, in memory or not).
        Specified by:
        getChatRooms in interface MultiUserChatService
        Returns:
        a list with a snapshot of all the rooms.
      • hasChatRoom

        public boolean hasChatRoom​(String roomName)
        Description copied from interface: MultiUserChatService
        Returns true if the server includes a chatroom with the requested name.
        Specified by:
        hasChatRoom in interface MultiUserChatService
        Parameters:
        roomName - the name of the chatroom to check.
        Returns:
        true if the server includes a chatroom with the requested name.
      • chatRoomRemoved

        public void chatRoomRemoved​(LocalMUCRoom room)
        Notification message indicating that the specified chat room was removed from some other cluster member.
        Specified by:
        chatRoomRemoved in interface MultiUserChatService
        Parameters:
        room - the removed room in another cluster node.
      • chatRoomAdded

        public void chatRoomAdded​(LocalMUCRoom room)
        Notification message indicating that a chat room has been created in another cluster member.
        Specified by:
        chatRoomAdded in interface MultiUserChatService
        Parameters:
        room - the created room in another cluster node.
      • getName

        public String getName()
        Specified by:
        getName in interface org.xmpp.component.Component
      • getMUCRoles

        public Collection<MUCRole> getMUCRoles​(org.xmpp.packet.JID user)
        Description copied from interface: MultiUserChatService
        Returns the list of MUCRole in all rooms for the specified user's session. When running in a cluster the list will include LocalMUCRole and RemoteMUCRole.
        Specified by:
        getMUCRoles in interface MultiUserChatService
        Parameters:
        user - the full JID that identifies the session of the user.
        Returns:
        the list of MUCRoles in all rooms for the specified user's session.
      • setKickIdleUsersTimeout

        public void setKickIdleUsersTimeout​(int timeout)
        Description copied from interface: MultiUserChatService
        Sets the time to elapse between clearing of idle chat users. A TimerTask will be added to a Timer scheduled for repeated fixed-delay execution whose main responsibility is to kick users that have been idle for a certain time. A user is considered idle if he/she didn't send any message to any group chat room for a certain amount of time. See MultiUserChatService.setUserIdleTime(int).
        Specified by:
        setKickIdleUsersTimeout in interface MultiUserChatService
        Parameters:
        timeout - the time to elapse between clearing of idle chat users.
      • setUserIdleTime

        public void setUserIdleTime​(int idleTime)
        Description copied from interface: MultiUserChatService
        Sets the number of milliseconds a user must be idle before he/she gets kicked from all the rooms. By idle we mean that the user didn't send any message to any group chat room.
        Specified by:
        setUserIdleTime in interface MultiUserChatService
        Parameters:
        idleTime - the amount of time to wait before considering a user idle.
      • getUserIdleTime

        public int getUserIdleTime()
        Description copied from interface: MultiUserChatService
        Returns the number of milliseconds a user must be idle before he/she gets kicked from all the rooms. By idle we mean that the user didn't send any message to any group chat room.
        Specified by:
        getUserIdleTime in interface MultiUserChatService
        Returns:
        the amount of time to wait before considering a user idle.
      • getUsersAllowedToCreate

        public Collection<org.xmpp.packet.JID> getUsersAllowedToCreate()
        Description copied from interface: MultiUserChatService
        Returns the collection of JIDs that are allowed to create MUC rooms. When isAllRegisteredUsersAllowedToCreate, this method will not return a JID of every user in the system.
        Specified by:
        getUsersAllowedToCreate in interface MultiUserChatService
        Returns:
        a list of user/group JIDs.
      • getSysadmins

        public Collection<org.xmpp.packet.JID> getSysadmins()
        Description copied from interface: MultiUserChatService
        Returns the collection of JIDs that are system administrators of the MUC service. A sysadmin has the same permissions as a room owner.
        Specified by:
        getSysadmins in interface MultiUserChatService
        Returns:
        a list of user/group JIDs.
      • isSysadmin

        public boolean isSysadmin​(org.xmpp.packet.JID bareJID)
        Description copied from interface: MultiUserChatService
        Validates the given JID as a MUC service administrator.
        Specified by:
        isSysadmin in interface MultiUserChatService
        Parameters:
        bareJID - the bare JID of the user
        Returns:
        true if the given JID is a MUC service administrator
      • addSysadmins

        public void addSysadmins​(Collection<org.xmpp.packet.JID> userJIDs)
        Description copied from interface: MultiUserChatService
        Adds multiple system administrators for the MUC service. A sysadmin has the same permissions as a room owner.
        Specified by:
        addSysadmins in interface MultiUserChatService
        Parameters:
        userJIDs - the JIDs of the new users/groups to add as a system administrator.
      • addSysadmin

        public void addSysadmin​(org.xmpp.packet.JID userJID)
        Description copied from interface: MultiUserChatService
        Adds a new system administrator of the MUC service. A sysadmin has the same permissions as a room owner.
        Specified by:
        addSysadmin in interface MultiUserChatService
        Parameters:
        userJID - the bare JID of the new user/group to add as a system administrator.
      • removeSysadmin

        public void removeSysadmin​(org.xmpp.packet.JID userJID)
        Description copied from interface: MultiUserChatService
        Removes a system administrator of the MUC service.
        Specified by:
        removeSysadmin in interface MultiUserChatService
        Parameters:
        userJID - the bare JID of the user/group to remove from the list.
      • isAllowToDiscoverMembersOnlyRooms

        public boolean isAllowToDiscoverMembersOnlyRooms()
        Returns the flag that indicates if the service should provide information about non-public members-only rooms when handling service discovery requests.
        Returns:
        true if the service should provide information about non-public members-only rooms.
      • setAllowToDiscoverMembersOnlyRooms

        public void setAllowToDiscoverMembersOnlyRooms​(boolean allowToDiscoverMembersOnlyRooms)
        Sets the flag that indicates if the service should provide information about non-public members-only rooms when handling service discovery requests.
        Parameters:
        allowToDiscoverMembersOnlyRooms - if the service should provide information about non-public members-only rooms.
      • isAllowToDiscoverLockedRooms

        public boolean isAllowToDiscoverLockedRooms()
        Returns the flag that indicates if the service should provide information about locked rooms when handling service discovery requests.
        Returns:
        true if the service should provide information about locked rooms.
      • setAllowToDiscoverLockedRooms

        public void setAllowToDiscoverLockedRooms​(boolean allowToDiscoverLockedRooms)
        Sets the flag that indicates if the service should provide information about locked rooms when handling service discovery requests. Note: Setting this flag in false is not compliant with the spec. A user may try to join a locked room thinking that the room doesn't exist because the user didn't discover it before.
        Parameters:
        allowToDiscoverLockedRooms - if the service should provide information about locked rooms.
      • isRoomCreationRestricted

        public boolean isRoomCreationRestricted()
        Description copied from interface: MultiUserChatService
        Returns false if anyone can create rooms or true if only the returned JIDs in getUsersAllowedToCreate are allowed to create rooms.
        Specified by:
        isRoomCreationRestricted in interface MultiUserChatService
        Returns:
        true if only some JIDs are allowed to create rooms.
      • setRoomCreationRestricted

        public void setRoomCreationRestricted​(boolean roomCreationRestricted)
        Description copied from interface: MultiUserChatService
        Sets if anyone can create rooms. When set to true, users are allowed to create rooms only when isAllRegisteredUsersAllowedToCreate or getUsersAllowedToCreate (or both) allow them to.
        Specified by:
        setRoomCreationRestricted in interface MultiUserChatService
        Parameters:
        roomCreationRestricted - whether anyone can create rooms or not.
      • isAllRegisteredUsersAllowedToCreate

        public boolean isAllRegisteredUsersAllowedToCreate()
        Description copied from interface: MultiUserChatService
        Sets if all registered users of Openfire are allowed to create rooms. When true, anonymous users and users from other domains (through federation) are initially prohibited from creating rooms, but can still be allowed by registering their JIDs in addUserAllowedToCreate.
        Specified by:
        isAllRegisteredUsersAllowedToCreate in interface MultiUserChatService
        Returns:
        true if all registered users are allowed to create rooms.
      • setAllRegisteredUsersAllowedToCreate

        public void setAllRegisteredUsersAllowedToCreate​(boolean allow)
        Description copied from interface: MultiUserChatService
        Sets if all registered users of Openfire are allowed to create rooms.
        Specified by:
        setAllRegisteredUsersAllowedToCreate in interface MultiUserChatService
        Parameters:
        allow - whether all registered users can create rooms.
      • addUsersAllowedToCreate

        public void addUsersAllowedToCreate​(Collection<org.xmpp.packet.JID> userJIDs)
        Description copied from interface: MultiUserChatService
        Adds new users/groups to the list of JIDs that are allowed to create MUC rooms.
        Specified by:
        addUsersAllowedToCreate in interface MultiUserChatService
        Parameters:
        userJIDs - collection of JIDs for users/groups to add to list.
      • addUserAllowedToCreate

        public void addUserAllowedToCreate​(org.xmpp.packet.JID userJID)
        Description copied from interface: MultiUserChatService
        Adds a new user/group to the list of JIDs that are allowed to create MUC rooms.
        Specified by:
        addUserAllowedToCreate in interface MultiUserChatService
        Parameters:
        userJID - the JID of the new user/group to add to list.
      • removeUsersAllowedToCreate

        public void removeUsersAllowedToCreate​(Collection<org.xmpp.packet.JID> userJIDs)
        Description copied from interface: MultiUserChatService
        Removes users/groups from list of JIDs that are allowed to create MUC rooms.
        Specified by:
        removeUsersAllowedToCreate in interface MultiUserChatService
        Parameters:
        userJIDs - collection of JIDs of users/groups to remove from the list.
      • removeUserAllowedToCreate

        public void removeUserAllowedToCreate​(org.xmpp.packet.JID userJID)
        Description copied from interface: MultiUserChatService
        Removes a user/group from list of JIDs that are allowed to create MUC rooms.
        Specified by:
        removeUserAllowedToCreate in interface MultiUserChatService
        Parameters:
        userJID - the JID of the user/group to remove from the list.
      • initialize

        public void initialize​(XMPPServer server)
      • initializeSettings

        public void initializeSettings()
      • setLogMaxConversationBatchSize

        public void setLogMaxConversationBatchSize​(int size)
      • getLogMaxConversationBatchSize

        public int getLogMaxConversationBatchSize()
      • setLogMaxBatchInterval

        public void setLogMaxBatchInterval​(Duration interval)
      • getLogMaxBatchInterval

        public Duration getLogMaxBatchInterval()
      • setLogBatchGracePeriod

        public void setLogBatchGracePeriod​(Duration period)
      • start

        public void start()
        Specified by:
        start in interface org.xmpp.component.Component
      • enableService

        public void enableService​(boolean enabled,
                                  boolean persistent)
        Description copied from interface: MultiUserChatService
        Enables or disables the MUC service. When disabled the MUC service will disappear from the disco#items list. Moreover, service discovery features will be disabled.
        Specified by:
        enableService in interface MultiUserChatService
        Parameters:
        enabled - true if the service is enabled.
        persistent - true if the new setting will persist across restarts.
      • getNumberChatRooms

        public int getNumberChatRooms()
        Retuns the number of existing rooms in the server (i.e. persistent or not, in memory or not).
        Specified by:
        getNumberChatRooms in interface MultiUserChatService
        Returns:
        the number of existing rooms in the server.
      • getNumberConnectedUsers

        public int getNumberConnectedUsers​(boolean onlyLocal)
        Retuns the total number of occupants in all rooms in the server.
        Specified by:
        getNumberConnectedUsers in interface MultiUserChatService
        Parameters:
        onlyLocal - true if only users connected to this JVM will be considered. Otherwise count cluster wise.
        Returns:
        the number of existing rooms in the server.
      • getNumberRoomOccupants

        public int getNumberRoomOccupants()
        Retuns the total number of users that have joined in all rooms in the server.
        Specified by:
        getNumberRoomOccupants in interface MultiUserChatService
        Returns:
        the number of existing rooms in the server.
      • getIncomingMessageCount

        public long getIncomingMessageCount​(boolean resetAfter)
        Returns the total number of incoming messages since last reset.
        Specified by:
        getIncomingMessageCount in interface MultiUserChatService
        Parameters:
        resetAfter - True if you want the counter to be reset after results returned.
        Returns:
        the number of incoming messages through the service.
      • getOutgoingMessageCount

        public long getOutgoingMessageCount​(boolean resetAfter)
        Returns the total number of outgoing messages since last reset.
        Specified by:
        getOutgoingMessageCount in interface MultiUserChatService
        Parameters:
        resetAfter - True if you want the counter to be reset after results returned.
        Returns:
        the number of outgoing messages through the service.
      • logConversation

        public void logConversation​(MUCRoom room,
                                    org.xmpp.packet.Message message,
                                    org.xmpp.packet.JID sender)
        Description copied from interface: MultiUserChatService
        Logs that a given message was sent to a room as part of a conversation. Every message sent to the room that is allowed to be broadcasted and that was sent either from the room itself or from an occupant will be logged.

        Note: For performane reasons, the logged message won't be immediately saved. Instead we keep the logged messages in memory until the logging process saves them to the database. It's possible to configure the logging process to run every X milliseconds and also the number of messages to log on each execution.

        Specified by:
        logConversation in interface MultiUserChatService
        Parameters:
        room - the room that received the message.
        message - the message to log as part of the conversation in the room.
        sender - the real XMPPAddress of the sender (e.g. john@example.org).
        See Also:
        initialize(org.jivesoftware.openfire.XMPPServer)
      • messageBroadcastedTo

        public void messageBroadcastedTo​(int numOccupants)
        Description copied from interface: MultiUserChatService
        Notification message indicating the server that an incoming message was broadcasted to a given number of occupants.
        Specified by:
        messageBroadcastedTo in interface MultiUserChatService
        Parameters:
        numOccupants - number of occupants that received the message.
      • getItems

        public Iterator<DiscoServerItem> getItems()
        Description copied from interface: ServerItemsProvider
        Returns an Iterator (of DiscoServerItem) with the items associated with the server or null if none.
        Specified by:
        getItems in interface ServerItemsProvider
        Returns:
        an Iterator (of DiscoServerItem) with the items associated with the server or null if none.
      • getIdentities

        public Iterator<org.dom4j.Element> getIdentities​(String name,
                                                         String node,
                                                         org.xmpp.packet.JID senderJID)
        Description copied from interface: DiscoInfoProvider
        Returns an Iterator (of Element) with the target entity's identities. Each Element must include the categoty, type and name attributes of the entity.
        Specified by:
        getIdentities in interface DiscoInfoProvider
        Parameters:
        name - the recipient JID's name.
        node - the requested disco node.
        senderJID - the XMPPAddress of user that sent the disco info request.
        Returns:
        an Iterator (of Element) with the target entity's identities.
      • getFeatures

        public Iterator<String> getFeatures​(String name,
                                            String node,
                                            org.xmpp.packet.JID senderJID)
        Description copied from interface: DiscoInfoProvider
        Returns an Iterator (of String) with the supported features. The features to include are the features offered and supported protocols by the target entity identified by the requested name and node.
        Specified by:
        getFeatures in interface DiscoInfoProvider
        Parameters:
        name - the recipient JID's name.
        node - the requested disco node.
        senderJID - the XMPPAddress of user that sent the disco info request.
        Returns:
        an Iterator (of String) with the supported features.
      • getExtendedInfo

        public org.xmpp.forms.DataForm getExtendedInfo​(String name,
                                                       String node,
                                                       org.xmpp.packet.JID senderJID)
        Description copied from interface: DiscoInfoProvider
        Returns an XDataForm with the extended information about the entity or null if none. Each bit of information about the entity must be included as a value of a field of the form.
        Specified by:
        getExtendedInfo in interface DiscoInfoProvider
        Parameters:
        name - the recipient JID's name.
        node - the requested disco node.
        senderJID - the XMPPAddress of user that sent the disco info request.
        Returns:
        an XDataForm with the extended information about the entity or null if none.
      • addExtraFeature

        public void addExtraFeature​(String feature)
        Adds an extra Disco feature to the list of features returned for the conference service.
        Specified by:
        addExtraFeature in interface MultiUserChatService
        Parameters:
        feature - Feature to add.
      • removeExtraFeature

        public void removeExtraFeature​(String feature)
        Removes an extra Disco feature from the list of features returned for the conference service.
        Specified by:
        removeExtraFeature in interface MultiUserChatService
        Parameters:
        feature - Feature to remove.
      • addExtraIdentity

        public void addExtraIdentity​(String category,
                                     String name,
                                     String type)
        Adds an extra Disco identity to the list of identities returned for the conference service.
        Specified by:
        addExtraIdentity in interface MultiUserChatService
        Parameters:
        category - Category for identity. e.g. conference
        name - Descriptive name for identity. e.g. Public Chatrooms
        type - Type for identity. e.g. text
      • removeExtraIdentity

        public void removeExtraIdentity​(String name)
        Removes an extra Disco identity from the list of identities returned for the conference service.
        Specified by:
        removeExtraIdentity in interface MultiUserChatService
        Parameters:
        name - Name of identity to remove.
      • setMUCDelegate

        public void setMUCDelegate​(MUCEventDelegate delegate)
        Sets the MUC event delegate handler for this service.
        Parameters:
        delegate - Handler for MUC events.
      • getMUCDelegate

        public MUCEventDelegate getMUCDelegate()
        Gets the MUC event delegate handler for this service.
        Returns:
        Handler for MUC events (delegate)
      • hasInfo

        public boolean hasInfo​(String name,
                               String node,
                               org.xmpp.packet.JID senderJID)
        Description copied from interface: DiscoInfoProvider
        Returns true if we can provide information related to the requested name and node. For example, if the requested name refers to a non-existant MUC room then the answer will be false. In case that the sender of the disco request is not authorized to discover this information an UnauthorizedException will be thrown.
        Specified by:
        hasInfo in interface DiscoInfoProvider
        Parameters:
        name - the recipient JID's name.
        node - the requested disco node.
        senderJID - the XMPPAddress of user that sent the disco info request.
        Returns:
        true if we can provide information related to the requested name and node.
      • getItems

        public Iterator<DiscoItem> getItems​(String name,
                                            String node,
                                            org.xmpp.packet.JID senderJID)
        Description copied from interface: DiscoItemsProvider
        Returns an Iterator (of DiscoItem) with the target entity's items or null if none. Each DiscoItem must include a JID attribute and may include the name and node attributes of the entity. In case that the sender of the disco request is not authorized to discover items an UnauthorizedException will be thrown.
        Specified by:
        getItems in interface DiscoItemsProvider
        Parameters:
        name - the recipient JID's name.
        node - the requested disco node.
        senderJID - the XMPPAddress of user that sent the disco items request.
        Returns:
        an Iterator (of DiscoItem) with the target entity's items or null if none.
      • isHidden

        public boolean isHidden()
        Description copied from interface: MultiUserChatService
        Returns true if the MUC service is a hidden, externally managed, service. This is typically set to true when the implementation is not the default one, and is not to be managed by the standard Openfire interface. If this is set to true, the service will not show up in the service list in the admin console.
        Specified by:
        isHidden in interface MultiUserChatService
        Returns:
        true if the MUC service is hidden and externally managed.