/*
 * 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;

import org.javasimon.SimonManager;
import org.javasimon.Split;
import org.javasimon.Stopwatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import won.bot.framework.eventbot.EventListenerContext;
import won.bot.framework.eventbot.event.Event;
import won.bot.framework.eventbot.event.impl.lifecycle.ErrorEvent;
import won.bot.framework.eventbot.listener.EventListener;

import java.lang.invoke.MethodHandles;
import java.util.Objects;

/**
 *
 */
public abstract class BaseEventBotAction implements won.bot.framework.eventbot.action.EventBotAction {
    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    private EventListenerContext eventListenerContext;
    private static final String EXCEPTION_TAG = "failed";
    private final String stopwatchName = getClass().getName();

    protected BaseEventBotAction(final EventListenerContext eventListenerContext) {
        Objects.requireNonNull(eventListenerContext);
        this.eventListenerContext = eventListenerContext;
    }

    @Override
    public Runnable getActionTask(final Event event, final EventListener eventListener) {
        return () -> {
            Stopwatch stopwatch = SimonManager.getStopwatch(stopwatchName);
            Split split = stopwatch.start();
            try {
                doRun(event, eventListener);
                split.stop();
            } catch (Exception e) {
                eventListenerContext.getEventBus().publish(new ErrorEvent(e));
                split.stop(EXCEPTION_TAG);
            } catch (Throwable t) {
                logger.warn("could not run action {}", stopwatchName, t);
                split.stop(EXCEPTION_TAG);
                throw t;
            }
        };
    }

    public EventListenerContext getEventListenerContext() {
        return eventListenerContext;
    }

    protected abstract void doRun(Event event, EventListener executingListener) throws Exception;
}

@@ -647,16 +647,82 @@
 ction;%0A%0A
+import java.lang.invoke.MethodHandles;%0Aimport java.util.Objects;%0A%0A
 import o
@@ -744,24 +744,24 @@
 monManager;%0A
-
 import org.j
@@ -865,16 +865,39 @@
 actory;%0A
+import org.slf4j.MDC;%0A%0A
 import w
@@ -1121,74 +1121,8 @@
 r;%0A%0A
-import java.lang.invoke.MethodHandles;%0Aimport java.util.Objects;%0A%0A
 /**%0A
@@ -1842,16 +1842,41 @@
 () -%3E %7B%0A
+            MDC.clear();%0A
         
@@ -2113,24 +2113,24 @@
 eption e) %7B%0A
-
             
@@ -2192,24 +2192,85 @@
 rEvent(e));%0A
+                logger.warn(%22Encountered an Exception:%22, e);%0A
             

Prepare for using mapped diagnostic context