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.OpenConnectionEvent; import won.bot.framework.eventbot.event.impl.wonmessage.FailureResponseEvent; import won.bot.framework.eventbot.listener.EventListener; import won.protocol.exception.WonMessageBuilderException; import won.protocol.message.WonMessage; import won.protocol.message.WonMessageBuilder; import won.protocol.model.FacetType; import won.protocol.service.WonNodeInformationService; import won.protocol.util.WonRdfUtils; import java.net.URI; public class OpenConnectionUriAction extends BaseEventBotAction { public OpenConnectionUriAction(EventListenerContext eventListenerContext) { super(eventListenerContext); } @Override protected void doRun(Event event, EventListener executingListener) throws Exception { if(event instanceof OpenConnectionEvent) { logger.debug("trying to open connection related to event {}", event); try { URI connectionURI = ((OpenConnectionEvent) event).getConnectionURI(); logger.debug("Extracted connection uri {}", connectionURI); if(connectionURI != null){ String msg = ((OpenConnectionEvent) event).getMessage(); WonMessage openConnectionMessage = createWonMessage(connectionURI, msg); EventListener successCallback = new EventListener() { @Override public void onEvent(Event event) throws Exception { logger.debug("successfully opened connection {}", connectionURI); } }; EventListener failureCallback = new EventListener() { @Override public void onEvent(Event event) throws Exception { String textMessage = WonRdfUtils.MessageUtils.getTextMessage(((FailureResponseEvent) event).getFailureMessage()); logger.debug("open connection failed for URI {}, original message URI {}: {}", new Object[]{connectionURI, ((FailureResponseEvent) event).getOriginalMessageURI(), textMessage}); } }; EventBotActionUtils.makeAndSubscribeResponseListener(openConnectionMessage, successCallback, failureCallback, getEventListenerContext()); logger.debug("registered listeners for response to message URI {}", openConnectionMessage.getMessageURI()); getEventListenerContext().getWonMessageSender().sendWonMessage(openConnectionMessage); logger.debug("open connection message sent with message URI {}", openConnectionMessage.getMessageURI()); } else { logger.warn("could not determine which connection to open for event {}", event); } } catch (Exception e) { logger.warn("error trying to open connection", e); } } } private WonMessage createWonMessage(URI connectionURI, String msg) throws WonMessageBuilderException { WonNodeInformationService wonNodeInformationService = getEventListenerContext().getWonNodeInformationService(); Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(connectionURI); URI remoteNeed = WonRdfUtils.ConnectionUtils.getRemoteNeedURIFromConnection(connectionRDF, connectionURI); URI localNeed = WonRdfUtils.ConnectionUtils.getLocalNeedURIFromConnection(connectionRDF, connectionURI); URI wonNode = WonRdfUtils.ConnectionUtils.getWonNodeURIFromConnection(connectionRDF, connectionURI); Dataset remoteNeedRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(remoteNeed); return WonMessageBuilder.setMessagePropertiesForConnect( wonNodeInformationService.generateEventURI(wonNode), FacetType.OwnerFacet.getURI(), localNeed, wonNode, FacetType.OwnerFacet.getURI(), remoteNeed, WonRdfUtils.NeedUtils.getWonNodeURIFromNeed(remoteNeedRDF, remoteNeed), msg ).build(); } }