All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.org.retep.xmpp.muc.room.JoinNewRoomLogic Maven / Gradle / Ivy

There is a newer version: 10.6
Show newest version
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uk.org.retep.xmpp.muc.room;

import uk.org.retep.util.messaging.MessageException;
import uk.org.retep.xmpp.JID;
import uk.org.retep.xmpp.XMPPServer;
import uk.org.retep.xmpp.logic.AbstractXMPPLogic;
import uk.org.retep.xmpp.logic.XMPPLogic;
import uk.org.retep.xmpp.logic.XMPPLogicProcessor;
import uk.org.retep.xmpp.logic.XMPPProtocolLogic;
import uk.org.retep.xmpp.message.Error;
import uk.org.retep.xmpp.message.ErrorCondition;
import uk.org.retep.xmpp.util.MessageFactory;
import uk.org.retep.xmpp.message.Presence;
import uk.org.retep.xmpp.muc.MucRoom;
import uk.org.retep.xmpp.muc.MucRoomMember;
import uk.org.retep.xmpp.muc.MucRoomSet;
import uk.org.retep.xmpp.muc.MucService;
import uk.org.retep.xmpp.muc.beans.BasicMucRoomMember;
import uk.org.retep.xmpp.util.Affiliation;
import uk.org.retep.xmpp.util.Role;

/**
 * XEP-0045 7.1 - Joining a room
 *
 * This {@link XMPPLogic} is used when a room already exists
 *
 * @author peter
 */
public class JoinNewRoomLogic
        extends AbstractXMPPLogic
        implements XMPPProtocolLogic
{

    private static JoinNewRoomLogic instance = new JoinNewRoomLogic();

    public static JoinNewRoomLogic getInstance()
    {
        return instance;
    }

    private JoinNewRoomLogic()
    {
    }

    @Override
    public Class getProtocol()
    {
        return org.jabber.protocol.muc.X.class;
    }

    @Override
    public  XMPPLogic process( final XMPPServer server,
                                  final MucService service,
                                  final MucRoom ignored,
                                  final Presence presence )
            throws MessageException
    {
        final MucRoomSet roomSet = service.getRoomSet();

        final JID userJid = presence.getFrom();
        final JID chatRoomJid = presence.getTo();
        final String chatRoomName = chatRoomJid.getNode();

        if( !service.getAuthenticator().canUserCreateRoom( chatRoomName, userJid ) )
        {
            respondNotAllowed( server, roomSet, presence );
            return null;
        }

        if( !roomSet.create( chatRoomName ) )
        {
            // the room failed due to some capacity constraint
            ErrorCondition.INTERNAL_SERVER_ERROR.respond( server, presence );
            return null;
        }

        final MucRoom room = roomSet.get( chatRoomName );

        // Set up global defaults
        service.getAuthenticator().setDefaultRoomFeatures( room );

        // Who is entering the room - in this case an owner and moderator
        final MucRoomMember joiningMember = new BasicMucRoomMember(
                chatRoomJid.getResource(),
                presence.getFrom() );
        joiningMember.setAffiliation( Affiliation.OWNER );
        joiningMember.setRole( Role.MODERATOR );

        // not part of spec? Allow for the room to be unlocked from the beginning
        if( service.getAuthenticator().unlockRoom( chatRoomName ) )
        {
            room.setLocked( false );
        }

        // Now join the room as normal
        XMPPLogicProcessor.process( service,
                                    room,
                                    JoinExistingRoomLogic.getInstance(),
                                    server,
                                    presence );

        return null;
    }

    /**
     * Responds with NOT_ALLOWED as defined by XEP-0045 10.1.1 Ex 142
     *
     * @param 
     * @param server
     * @param roomSet
     * @param presence
     * @throws MessageException
     */
    protected final  void respondNotAllowed( final XMPPServer server,
                                                final MucRoomSet roomSet,
                                                final Presence presence )
            throws MessageException
    {
        final Presence resp = MessageFactory.newResponse( presence );

        resp.getContent().add( new org.jabber.protocol.muc.X() );

        // ErrorCondition.NOT_ALLOWED.respond() has type error not cancel
        final Error error = ErrorCondition.NOT_ALLOWED.addError( resp );
        error.setType( "cancel" );

        server.send( resp );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy