package won.bot.integration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.TaskScheduler;
import won.bot.framework.bot.Bot;
import won.bot.framework.manager.BotManager;
import won.owner.protocol.message.OwnerCallback;
import won.protocol.message.WonMessage;
import won.protocol.model.Connection;
import won.protocol.model.Match;
import java.net.URI;
import java.util.Date;
/**
* OwnerProtocolOwnerServiceCallback that dispatches the calls to the bots.
*/
@Qualifier("default")
public class BotOwnerCallback implements OwnerCallback
{
private final Logger logger = LoggerFactory.getLogger(getClass());
BotManager botManager;
TaskScheduler taskScheduler;
@Override
public void onCloseFromOtherNeed(final Connection con, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
logger.debug("onClose received for connection {} ",con);
getBotForNeedUri(con.getNeedURI()).onCloseFromOtherNeed(con, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onClose()",e);
}
}
}, new Date());
}
@Override
public void onHintFromMatcher(final Match match, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
getBotForNeedUri(match.getFromNeed()).onHintFromMatcher(match, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onHint()",e);
}
}
}, new Date());
}
@Override
public void onConnectFromOtherNeed(final Connection con, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
logger.debug("onConnect called for connection {} ",con.getConnectionURI());
getBotForNeedUri(con.getNeedURI()).onConnectFromOtherNeed(con, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onConnect()",e);
}
}
}, new Date());
}
@Override
public void onOpenFromOtherNeed(final Connection con, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
getBotForNeedUri(con.getNeedURI()).onOpenFromOtherNeed(con, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onOpen()",e);
}
}
}, new Date());
}
@Override
public void onMessageFromOtherNeed(final Connection con, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
logger.debug("onTextMessage for Connection {} ",con.getConnectionURI());
getBotForNeedUri(con.getNeedURI()).onMessageFromOtherNeed(con, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onTextMessage()",e);
}
}
}, new Date());
}
@Override
public void onSuccessResponse(final URI successfulMessageUri, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
logger.debug("onSuccessResponse for message {} ",successfulMessageUri);
URI needUri = wonMessage.getReceiverNeedURI();
getBotForNeedUri(needUri).onSuccessResponse(successfulMessageUri, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onSuccessResponse()",e);
}
}
}, new Date());
}
@Override
public void onFailureResponse(final URI failedMessageUri, final WonMessage wonMessage) {
taskScheduler.schedule(new Runnable(){
public void run(){
try {
logger.debug("onFailureResponse for message {} ",failedMessageUri);
URI needUri = wonMessage.getReceiverNeedURI();
getBotForNeedUri(needUri).onFailureResponse(failedMessageUri, wonMessage);
} catch (Exception e) {
logger.warn("error while handling onFailureResponse()",e);
}
}
}, new Date());
}
public void setBotManager(BotManager botManager) {
this.botManager = botManager;
}
public void setTaskScheduler(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
private Bot getBotForNeedUri(URI needUri) {
Bot bot = botManager.getBotForNeedURI(needUri);
if (bot == null) throw new IllegalStateException("No bot registered for uri " + needUri);
if (!bot.getLifecyclePhase().isActive()) {
throw new IllegalStateException("bot responsible for need " + needUri + " is not active (lifecycle phase is: " +bot.getLifecyclePhase()+")");
}
return bot;
}
}