package io.cattle.platform.eventing.model;
import io.cattle.platform.eventing.exception.EventExecutionException;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import javax.xml.bind.annotation.XmlTransient;
import org.slf4j.MDC;
public class EventVO<T> implements Event {
String id, name, replyTo, resourceId, resourceType, publisher, transitioning, transitioningMessage, transitioningInternalMessage;
String[] previousIds, previousNames;
T data;
Date time;
Long timeoutMillis;
String listenerKey;
Integer transitioningProgress;
Map<String, Object> context;
@SuppressWarnings("unchecked")
public EventVO() {
id = io.cattle.platform.util.resource.UUID.randomUUID().toString();
time = new Date();
context = MDC.getMDCAdapter().getCopyOfContextMap();
}
public EventVO(Event event) {
this(event, event.getReplyTo());
}
@SuppressWarnings("unchecked")
public EventVO(Event event, String replyTo) {
this.replyTo = replyTo;
this.id = event.getId();
this.name = event.getName();
this.previousIds = event.getPreviousIds();
this.previousNames = event.getPreviousNames();
this.data = (T) event.getData();
this.time = event.getTime();
this.publisher = event.getPublisher();
this.resourceId = event.getResourceId();
this.resourceType = event.getResourceType();
this.transitioning = event.getTransitioning();
this.transitioningMessage = event.getTransitioningMessage();
this.transitioningInternalMessage = event.getTransitioningInternalMessage();
this.transitioningProgress = event.getTransitioningProgress();
this.context = event.getContext();
this.timeoutMillis = event.getTimeoutMillis();
}
public static EventVO<Object> replyWithException(Event request, Class<? extends EventExecutionException> clz,
String message) {
EventVO<Object> reply = reply(request);
reply.setTransitioning(TRANSITIONING_ERROR);
reply.setTransitioningInternalMessage("class:" + clz.getCanonicalName());
reply.setTransitioningMessage(message);
return reply;
}
public static EventVO<Object> reply(Event request) {
String[] previousIds = request.getPreviousIds();
if (previousIds != null && previousIds.length > 0) {
String[] newIds = new String[previousIds.length + 1];
System.arraycopy(previousIds, 0, newIds, 1, previousIds.length);
newIds[0] = request.getId();
previousIds = newIds;
} else {
previousIds = new String[] { request.getId() };
}
EventVO<Object> event = new EventVO<Object>();
event.setName(request.getReplyTo());
event.setPreviousNames(prepend(request.getPreviousNames(), request.getName()));
event.setPreviousIds(prepend(request.getPreviousIds(), request.getId()));
event.setResourceId(request.getResourceId());
event.setResourceType(request.getResourceType());
return event;
}
protected static String[] prepend(String[] array, String value) {
if (array != null && array.length > 0) {
String[] newIds = new String[array.length + 1];
System.arraycopy(array, 0, newIds, 1, array.length);
newIds[0] = value;
array = newIds;
} else {
array = new String[] { value };
}
return array;
}
public static <T> EventVO<T> newEvent(String name) {
return new EventVO<T>(name);
}
public EventVO(String name) {
this();
setName(name);
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public EventVO<T> withName(String name) {
this.name = name;
return this;
}
@Override
public String[] getPreviousIds() {
return previousIds;
}
public void setPreviousIds(String[] previousIds) {
this.previousIds = previousIds;
}
public EventVO<T> withPreviousIds(String[] previousIds) {
this.previousIds = previousIds;
return this;
}
@Override
public String[] getPreviousNames() {
return previousNames;
}
public void setPreviousNames(String[] names) {
this.previousNames = names;
}
public EventVO<T> withPreviousNames(String[] names) {
this.previousNames = names;
return this;
}
@Override
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public EventVO<T> withData(T data) {
this.data = data;
return this;
}
@Override
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public EventVO<T> withTime(Date time) {
this.time = time;
return this;
}
@Override
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public EventVO<T> withPublisher(String publisher) {
this.publisher = publisher;
return this;
}
@Override
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public EventVO<T> withId(String id) {
this.id = id;
return this;
}
@Override
public String getReplyTo() {
return replyTo;
}
public void setReplyTo(String replyTo) {
this.replyTo = replyTo;
}
public EventVO<T> withReplyTo(String replyTo) {
this.replyTo = replyTo;
return this;
}
@Override
public String getResourceId() {
return resourceId;
}
public void setResourceId(String resourceId) {
this.resourceId = resourceId;
}
public EventVO<T> withResourceId(String resourceId) {
this.resourceId = resourceId;
return this;
}
@Override
public String getResourceType() {
return resourceType;
}
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
public EventVO<T> withResourceType(String resourceType) {
this.resourceType = resourceType;
return this;
}
@XmlTransient
public String getListenerKey() {
return listenerKey;
}
public void setListenerKey(String listenerKey) {
this.listenerKey = listenerKey;
}
public EventVO<T> withListenerKey(String listenerKey) {
this.listenerKey = listenerKey;
return this;
}
@Override
public String getTransitioning() {
return transitioning;
}
public void setTransitioning(String transitioning) {
this.transitioning = transitioning;
}
public EventVO<T> withTransitioning(String transitioning) {
this.transitioning = transitioning;
return this;
}
@Override
public String getTransitioningMessage() {
return transitioningMessage;
}
public void setTransitioningMessage(String transitioningMessage) {
this.transitioningMessage = transitioningMessage;
}
public EventVO<T> withTransitioningMessage(String transitioningMessage) {
this.transitioningMessage = transitioningMessage;
return this;
}
@Override
public Integer getTransitioningProgress() {
return transitioningProgress;
}
public void setTransitioningProgress(Integer transitioningProgress) {
this.transitioningProgress = transitioningProgress;
}
public EventVO<T> withTransitioningProgress(Integer transitioningProgress) {
this.transitioningProgress = transitioningProgress;
return this;
}
@Override
public String getTransitioningInternalMessage() {
return transitioningInternalMessage;
}
public void setTransitioningInternalMessage(String transitioningInternalMessage) {
this.transitioningInternalMessage = transitioningInternalMessage;
}
public EventVO<T> withTransitioningInternalMessage(String transitioningInternalMessage) {
this.transitioningInternalMessage = transitioningInternalMessage;
return this;
}
@Override
public Map<String, Object> getContext() {
return context;
}
public void setContext(Map<String, Object> context) {
this.context = context;
}
@Override
public Long getTimeoutMillis() {
return timeoutMillis;
}
public void setTimeoutMillis(Long timeout) {
this.timeoutMillis = timeout;
}
public EventVO<T> withTimeoutMillis(Long timeout) {
this.timeoutMillis = timeout;
return this;
}
public EventVO<T> withContext(Map<String, Object> context) {
this.context = context;
return this;
}
@Override
public String toString() {
return "EventVO [id=" + id + ", name=" + name + ", previousNames=" + Arrays.toString(previousNames) + ", replyTo=" + replyTo + ", resourceId="
+ resourceId + ", resourceType=" + resourceType + ", publisher=" + publisher + ", transitioning=" + transitioning + ", transitioningMessage="
+ transitioningMessage + ", transitioningInternalMessage=" + transitioningInternalMessage + ", previousIds=" + Arrays.toString(previousIds)
+ ", data=" + data + ", time=" + time + ", listenerKey=" + listenerKey + ", transitioningProgress=" + transitioningProgress + "]";
}
}