package io.cattle.platform.eventing.exception;
import io.cattle.platform.eventing.model.Event;
import io.cattle.platform.eventing.model.EventVO;
import io.cattle.platform.util.exception.ExecutionException;
import io.cattle.platform.util.exception.LoggableException;
import java.lang.reflect.InvocationTargetException;
import org.slf4j.Logger;
public class EventExecutionException extends ExecutionException implements LoggableException {
private static final long serialVersionUID = 3499233034118987175L;
Event event;
public EventExecutionException(String message, Event event) {
super(message);
this.event = event;
}
public Event getEvent() {
return event;
}
@Override
public String getTransitioningMessage() {
return event == null ? super.getTransitioningMessage() : event.getTransitioningMessage();
}
@Override
public String getTransitioningInternalMessage() {
return event == null ? super.getTransitioningInternalMessage() : event.getTransitioningInternalMessage();
}
public static EventExecutionException fromEvent(Event event) {
String internal = event.getTransitioningInternalMessage();
if (internal != null && internal.startsWith("class:")) {
String className = internal.split(":")[1];
try {
Class<?> clz = Class.forName(className);
if (EventExecutionException.class.isAssignableFrom(clz)) {
if (event instanceof EventVO) {
((EventVO<?>) event).setTransitioningInternalMessage(null);
}
return (EventExecutionException) clz.getConstructor(String.class, Event.class)
.newInstance(event.getTransitioningMessage(), event);
}
} catch (ClassNotFoundException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
}
String message = event.getTransitioningInternalMessage() == null ?
event.getTransitioningMessage() : event.getTransitioningInternalMessage();
return new EventExecutionException(message, event);
}
@Override
public void log(Logger log) {
Object name = null;
if (event != null) {
name = event.getPreviousNames();
if (name == null) {
name = event.getName();
}
}
log.error("Agent error for [{}]: {}", name, getMessage());
}
}