package com.esir.sr.sweetsnake.session;
import java.rmi.RemoteException;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.esir.sr.sweetsnake.constants.PropertiesConstants;
import com.esir.sr.sweetsnake.dto.GameRequestDTO;
import com.esir.sr.sweetsnake.enumeration.PlayerStatus;
import com.esir.sr.sweetsnake.factory.DtoConverterFactory;
/**
*
* @author Herminaƫl Rougier
* @author Damien Jouanno
*
*/
@Component
@Scope("prototype")
public class GameRequest extends AbstractSession
{
/**********************************************************************************************
* [BLOCK] STATIC FIELDS
**********************************************************************************************/
/** The logger */
private static final Logger log = LoggerFactory.getLogger(GameRequest.class);
/**********************************************************************************************
* [BLOCK] FIELDS
**********************************************************************************************/
/** The request id */
private final String id;
/** The session id */
private final String sessionId;
/** The requesting player */
private final Player requestingPlayer;
/** The requested player */
private final Player requestedPlayer;
/**********************************************************************************************
* [BLOCK] CONSTRUCTOR & INIT
**********************************************************************************************/
/**
*
* @param _requestingPlayer
* @param _requestedPlayer
*/
protected GameRequest(final String _sessionId, final Player _requestingPlayer, final Player _requestedPlayer) {
super();
id = RandomStringUtils.randomAlphanumeric(PropertiesConstants.GENERATED_ID_LENGTH);
sessionId = _sessionId;
requestingPlayer = _requestingPlayer;
requestedPlayer = _requestedPlayer;
}
/**
*
*/
@PostConstruct
protected void init() {
log.debug("Initializing a new game request between {} and {}", requestingPlayer.getName(), requestedPlayer.getName());
requestingPlayer.addSentRequestId(id);
requestedPlayer.setReceivedRequestId(id);
requestedPlayer.setStatus(PlayerStatus.INVITED);
final GameRequestDTO requestDTO = DtoConverterFactory.convertGameRequest(this);
try {
requestingPlayer.getCallback().requestSent(requestDTO);
} catch (final RemoteException e) {
log.error(e.getMessage(), e);
}
// requestReceived() on client side is a blocking method while the other player has not answered
// so we have to launch it from a new thread
new Thread(new Runnable() {
@Override
public void run() {
try {
requestedPlayer.getCallback().requestReceived(requestDTO);
} catch (final RemoteException e) {
log.error(e.getMessage(), e);
}
}
}).start();
}
/**********************************************************************************************
* [BLOCK] PUBLIC METHODS
**********************************************************************************************/
/**
*
*/
public void cancel() {
}
/**
*
*/
public void deny() {
try {
requestedPlayer.setStatus(PlayerStatus.AVAILABLE);
requestingPlayer.getCallback().requestDenied(DtoConverterFactory.convertGameRequest(this));
} catch (final RemoteException e) {
log.error(e.getMessage(), e);
}
}
/**
*
*/
public void destroy() {
requestingPlayer.removeSentRequestId(id);
requestedPlayer.setReceivedRequestId(null);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "request[id=" + id + ", requestingPlayer=" + requestingPlayer + ", requestedPlayer=" + requestedPlayer + "]";
}
/**********************************************************************************************
* [BLOCK] GETTERS
**********************************************************************************************/
/**
*
* @return
*/
public String getId() {
return id;
}
/**
*
* @return
*/
public String getSessionid() {
return sessionId;
}
/**
*
* @return
*/
public Player getRequestingPlayer() {
return requestingPlayer;
}
/**
*
* @return
*/
public Player getRequestedPlayer() {
return requestedPlayer;
}
}