/* * Copyright 2012 Research Studios Austria Forschungsges.m.b.H. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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.event.Event; 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.service.WonNodeInformationService; import won.protocol.util.WonRdfUtils; import java.net.URI; import java.util.Date; import java.util.List; /** * BaseEventBotAction connecting two needs on the specified facets. The need's URIs are obtained from * the bot context. The first two URIs found there are used. */ public class ConnectFromListToListAction extends BaseEventBotAction { private String fromListName; private String toListName; private URI fromFacet; private URI toFacet; private long millisBetweenCalls; private ConnectHook connectHook; private String welcomeMessage; public ConnectFromListToListAction(EventListenerContext eventListenerContext, String fromListName, String toListName, URI fromFacet, URI toFacet, final long millisBetweenCalls, String welcomeMessage) { super(eventListenerContext); this.fromListName = fromListName; this.toListName = toListName; this.fromFacet = fromFacet; this.toFacet = toFacet; this.millisBetweenCalls = millisBetweenCalls; this.welcomeMessage = welcomeMessage; } public ConnectFromListToListAction(final EventListenerContext eventListenerContext, final String fromListName, final String toListName, final URI fromFacet, final URI toFacet, final long millisBetweenCalls, final ConnectHook connectHook, String welcomeMessage) { super(eventListenerContext); this.fromListName = fromListName; this.toListName = toListName; this.fromFacet = fromFacet; this.toFacet = toFacet; this.millisBetweenCalls = millisBetweenCalls; this.connectHook = connectHook; this.welcomeMessage = welcomeMessage; } @Override public void doRun(Event event, EventListener executingListener) { List<URI> fromNeeds = getEventListenerContext().getBotContext().getNamedNeedUriList(fromListName); List<URI> toNeeds = getEventListenerContext().getBotContext().getNamedNeedUriList(toListName); logger.debug("connecting needs from list \"{}\" ({}) to needs from list \"{}\" ({})", new Object[]{fromListName,fromNeeds, toListName, toNeeds}); long start = System.currentTimeMillis(); long count = 0; if (fromListName.equals(toListName)){ //only one connection per pair if from-list is to-list for (int i = 0; i < fromNeeds.size();i++){ URI fromUri = fromNeeds.get(i); for (int j = i +1; j < fromNeeds.size(); j++){ URI toUri = fromNeeds.get(j); try { count ++; performConnect(fromUri, toUri, new Date(start + count * millisBetweenCalls)); } catch (Exception e) { logger.warn("could not connect {} and {}", new Object[]{fromUri, toUri}, e); } } } } else { for (URI fromUri: fromNeeds){ for (URI toUri:toNeeds) { try{ count ++; logger.debug("tmp: Connect {} with {}",fromUri.toString(), toUri.toString()); performConnect(fromUri, toUri, new Date(start + count * millisBetweenCalls)); } catch (Exception e) { logger.warn("could not connect {} and {}", new Object[]{fromUri, toUri}, e); } } } } } private void performConnect(final URI fromUri, final URI toUri, final Date when) throws Exception { logger.debug("scheduling connection message for date {}",when); getEventListenerContext().getTaskScheduler().schedule(new Runnable() { public void run() { try { logger.debug("connecting needs {} and {}",fromUri,toUri); if (connectHook != null){ connectHook.onConnect(fromUri, toUri); } WonMessage connMessage = createWonMessage(fromUri, toUri); getEventListenerContext() .getWonMessageSender() .sendWonMessage(connMessage); } catch (Exception e) { logger.warn("could not connect {} and {}", fromUri, toUri); //throws logger.warn("caught exception", e); } } }, when); } private WonMessage createWonMessage(URI fromUri, URI toUri) throws WonMessageBuilderException { WonNodeInformationService wonNodeInformationService = getEventListenerContext().getWonNodeInformationService(); Dataset localNeedRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(fromUri); Dataset remoteNeedRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(toUri); URI localWonNode = WonRdfUtils.NeedUtils.getWonNodeURIFromNeed(localNeedRDF, fromUri); URI remoteWonNode = WonRdfUtils.NeedUtils.getWonNodeURIFromNeed(remoteNeedRDF, toUri); return WonMessageBuilder .setMessagePropertiesForConnect( wonNodeInformationService.generateEventURI( localWonNode), fromFacet, fromUri, localWonNode, toFacet, toUri, remoteWonNode, welcomeMessage) .build(); } public static abstract class ConnectHook{ public abstract void onConnect(URI fromNeedURI, URI toNeedURI); } }