package org.nextprot.api.commons.utils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class ExceptionWithReason extends Exception implements Serializable {
private static final long serialVersionUID = 20161209L;
private final transient Reason reason;
public ExceptionWithReason() {
reason = new Reason();
}
public static ExceptionWithReason withReason(String cause, String causeMessage) {
ExceptionWithReason e = new ExceptionWithReason();
e.getReason().addCause(cause, causeMessage);
return e;
}
public static ExceptionWithReason withMessage(String mainCauseMessage) {
ExceptionWithReason e = new ExceptionWithReason();
e.getReason().setMessage(mainCauseMessage);
return e;
}
public Reason getReason() {
return reason;
}
public static class Reason {
private final Map<String, Object> causes = new HashMap<>();
private String message;
public Map<String, Object> getCauses() {
return causes;
}
public Object getCause(String key) {
return causes.get(key);
}
public void addCause(String key, Object value) {
causes.put(key, value);
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Reason)) return false;
Reason value = (Reason) o;
return Objects.equals(causes, value.causes) &&
Objects.equals(message, value.message);
}
@Override
public int hashCode() {
return Objects.hash(causes, message);
}
}
}