/*
* 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.monitor;
import org.apache.jena.query.Dataset;
import org.apache.jena.sparql.core.Quad;
import org.apache.commons.io.Charsets;
import org.apache.jena.riot.Lang;
import org.javasimon.SimonManager;
import org.javasimon.Split;
import org.javasimon.Stopwatch;
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.event.impl.wonmessage.*;
import won.bot.framework.eventbot.event.impl.monitor.*;
import won.bot.framework.eventbot.listener.EventListener;
import won.protocol.message.WonMessage;
import won.protocol.util.RdfUtils;
import java.net.URI;
import java.util.*;
public class MessageLifecycleMonitoringAction extends BaseEventBotAction
{
Map<String, Split> msgSplitsB = Collections.synchronizedMap(new HashMap<>());
Map<String, Split> msgSplitsBC = Collections.synchronizedMap(new HashMap<>());
Map<String, Split> msgSplitsBCD = Collections.synchronizedMap(new HashMap<>());
Map<String, Split> msgSplitsBCDE = Collections.synchronizedMap(new HashMap<>());
Map<URI,URI> connectionMsgUris = Collections.synchronizedMap(new HashMap<>());
Map<URI,URI> responseMsgUris = Collections.synchronizedMap(new HashMap<>());
private long startTestTime = -1;
public MessageLifecycleMonitoringAction(final EventListenerContext eventListenerContext) {
super(eventListenerContext);
}
@Override
protected void doRun(final Event event, EventListener executingListener) throws Exception {
Stopwatch stopwatchB = SimonManager.getStopwatch("messageTripB");
Stopwatch stopwatchBC = SimonManager.getStopwatch("messageTripBC");
Stopwatch stopwatchBCD = SimonManager.getStopwatch("messageTripBCD");
Stopwatch stopwatchBCDE = SimonManager.getStopwatch("messageTripBCDE");
if (event instanceof MessageSpecificEvent) {
MessageSpecificEvent msgEvent = (MessageSpecificEvent) event;
URI msgURI = msgEvent.getMessageURI();
logger.debug("RECEIVED EVENT {} for uri {}", event, msgURI);
if (event instanceof MessageDispatchStartedEvent) {
Split splitB = stopwatchB.start();
Split splitBC = stopwatchBC.start();
Split splitBCD = stopwatchBCD.start();
Split splitBCDE = stopwatchBCDE.start();
msgSplitsB.put(msgURI.toString(), splitB);
msgSplitsBC.put(msgURI.toString(), splitBC);
msgSplitsBCD.put(msgURI.toString(), splitBCD);
msgSplitsBCDE.put(msgURI.toString(), splitBCDE);
connectionMsgUris.put(msgURI, msgEvent.getNeedURI());
} else if (event instanceof MessageDispatchedEvent) {
msgSplitsB.get(msgURI.toString()).stop();
}
} else if (event instanceof SuccessResponseEvent || event instanceof FailureResponseEvent) {
DeliveryResponseEvent responseEvent = (DeliveryResponseEvent) event;
if (connectionMsgUris.keySet().contains(responseEvent.getOriginalMessageURI()) ||
connectionMsgUris.keySet().contains(responseEvent.getRemoteResponseToMessageURI())) {
responseMsgUris.put(responseEvent.getMessage().getMessageURI(), responseEvent.getNeedURI());
if (responseEvent.isRemoteResponse()) {
responseMsgUris.put(responseEvent.getMessage().getCorrespondingRemoteMessageURI(), responseEvent.getRemoteNeedURI());
}
}
if (responseEvent.isRemoteResponse()) {
if (msgSplitsBC.get(responseEvent.getRemoteResponseToMessageURI().toString()) != null) {
logger.debug("RECEIVED REMOTE RESPONSE EVENT {} for uri {}", event, responseEvent.getRemoteResponseToMessageURI
());
msgSplitsBCDE.get(responseEvent.getRemoteResponseToMessageURI().toString()).stop();
}
} else if (msgSplitsBC.get(responseEvent.getOriginalMessageURI().toString()) != null) {
logger.debug("RECEIVED RESPONSE EVENT {} for uri {}", event, responseEvent.getOriginalMessageURI());
msgSplitsBC.get(responseEvent.getOriginalMessageURI().toString()).stop();
}
} else if (event instanceof MessageFromOtherNeedEvent) {
WonMessage msg = ((MessageFromOtherNeedEvent) event).getWonMessage();
URI remoteMessageURI = msg.getCorrespondingRemoteMessageURI();
msgSplitsBCD.get(remoteMessageURI.toString()).stop();
connectionMsgUris.put(msg.getMessageURI(), msg.getReceiverNeedURI());
} else if (event instanceof CrawlReadyEvent) {
reportMessageSizes(connectionMsgUris, "Connection Messages");
reportMessageSizes(responseMsgUris, "Delivery Responses");
getEventListenerContext().getEventBus().publish(new CrawlDoneEvent());
}
}
private void reportMessageSizes(final Map<URI, URI> msgUris, String name) {
int[] counter = new int[4];
Set<URI> keys = msgUris.keySet();
for (URI uri : keys) {
Dataset dataset = getEventListenerContext().getLinkedDataSource().getDataForResource(uri, msgUris.get(uri));
record(dataset, counter);
}
String sizeInfo = "\nSIZES for " + name + ":\n" +
"messages=" + counter[0] + ", named-graphs=" + counter[1] + ", " +
"quads=" + counter[2] + ", bytes-in-Trig-UTF8=" + counter[3];
logger.info(sizeInfo);
}
private void record(final Dataset dataset, final int[] counter) {
counter[0]++;
counter[1] = counter[1] + RdfUtils.getModelNames(dataset).size();
Iterator<Quad> quadsIterator = dataset.asDatasetGraph().find();
while (quadsIterator.hasNext()) {
quadsIterator.next();
counter[2]++;
}
counter[3] = counter[3] + RdfUtils.writeDatasetToString(dataset, Lang.TRIG).getBytes(Charsets.UTF_8).length;
}
}