
uk.org.retep.xmpp.muc.room.JoinNewRoomLogic Maven / Gradle / Ivy
/*
* 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