package won.bot.framework.eventbot.action.impl.wonmessage;
import org.apache.jena.query.Dataset;
import won.bot.framework.eventbot.EventListenerContext;
import won.bot.framework.eventbot.action.BaseEventBotAction;
import won.bot.framework.eventbot.action.EventBotActionUtils;
import won.bot.framework.eventbot.event.Event;
import won.bot.framework.eventbot.event.impl.mail.CloseConnectionEvent;
import won.bot.framework.eventbot.event.impl.wonmessage.FailureResponseEvent;
import won.bot.framework.eventbot.listener.EventListener;
import won.protocol.exception.IncorrectPropertyCountException;
import won.protocol.exception.WonMessageBuilderException;
import won.protocol.message.WonMessage;
import won.protocol.message.WonMessageBuilder;
import won.protocol.service.WonNodeInformationService;
import won.protocol.util.WonRdfUtils;
import java.net.URI;
/**
* Created by fsuda on 18.10.2016.
*/
public class CloseConnectionUriAction extends BaseEventBotAction {
private String farewellMessage = "NO FAREWELL MESSAGE SET";
public CloseConnectionUriAction(EventListenerContext eventListenerContext) {
super(eventListenerContext);
}
@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
if(event instanceof CloseConnectionEvent) {
logger.debug("trying to close connection related to event {}", event);
try {
URI connectionURI = ((CloseConnectionEvent) event).getConnectionURI();
logger.debug("Extracted connection uri {}", connectionURI);
if (connectionURI != null) {
logger.debug("trying to close connection {}", connectionURI);
WonMessage closeConnectionMessage = createWonMessage(connectionURI);
EventListener successCallback = new EventListener()
{
@Override
public void onEvent(Event event) throws Exception {
logger.debug("successfully closed connection {}", connectionURI);
}
};
EventListener failureCallback = new EventListener()
{
@Override
public void onEvent(Event event) throws Exception {
String textMessage = WonRdfUtils.MessageUtils.getTextMessage(((FailureResponseEvent) event).getFailureMessage());
logger.debug("close connection failed for URI {}, original message URI {}: {}", new Object[]{connectionURI, ((FailureResponseEvent) event).getOriginalMessageURI(), textMessage});
}
};
EventBotActionUtils.makeAndSubscribeResponseListener(closeConnectionMessage, successCallback, failureCallback, getEventListenerContext());
logger.debug("registered listeners for response to message URI {}", closeConnectionMessage.getMessageURI());
getEventListenerContext().getWonMessageSender().sendWonMessage(closeConnectionMessage);
logger.debug("close connection message sent with message URI {}", closeConnectionMessage.getMessageURI());
} else {
logger.warn("could not determine which connection to close for event {}", event);
}
} catch (Exception e) {
logger.warn("error while trying to close connection", e);
}
}
}
private WonMessage createWonMessage(URI connectionURI) throws WonMessageBuilderException {
WonNodeInformationService wonNodeInformationService = getEventListenerContext().getWonNodeInformationService();
Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(connectionURI);
URI localNeed = WonRdfUtils.ConnectionUtils.getLocalNeedURIFromConnection(connectionRDF, connectionURI);
URI wonNode = WonRdfUtils.ConnectionUtils.getWonNodeURIFromConnection(connectionRDF, connectionURI);
try {
URI remoteConnection = WonRdfUtils.ConnectionUtils
.getRemoteConnectionURIFromConnection(connectionRDF, connectionURI);
URI remoteNeed = WonRdfUtils.ConnectionUtils.getRemoteNeedURIFromConnection(connectionRDF, connectionURI);
Dataset remoteNeedRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(remoteNeed);
return WonMessageBuilder.setMessagePropertiesForClose(
wonNodeInformationService.generateEventURI(wonNode),
connectionURI,
localNeed,
wonNode,
remoteConnection,
remoteNeed,
WonRdfUtils.NeedUtils.getWonNodeURIFromNeed(remoteNeedRDF, remoteNeed),
farewellMessage
).build();
}catch(IncorrectPropertyCountException ex){
logger.info("could not find remote connection must be a hint");
//TODO: IMPLEMENT CORRECT MESSAGE FOR CLOSE OF HINT AS THIS IS CURRENTLY NOT WORKING YET
return WonMessageBuilder.setMessagePropertiesForClose(
wonNodeInformationService.generateEventURI(wonNode),
connectionURI,
localNeed,
wonNode,
farewellMessage
).build();
}
}
}