blob: 1855b28ed5f565da02d884dbbdabc2a3087a1eb4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.dubbo.rpc.service;
import org.apache.dubbo.common.utils.JsonUtils;
import org.apache.dubbo.common.utils.StringUtils;
import java.beans.Transient;
import java.io.Serializable;
/**
* GenericException
*
* @export
*/
public class GenericException extends RuntimeException {
private static final long serialVersionUID = -1182299763306599962L;
private boolean useCause;
private String exceptionClass;
private String exceptionMessage;
private final GenericExceptionInfo genericExceptionInfo;
public GenericException() {
this(null, null);
}
public GenericException(String exceptionClass, String exceptionMessage) {
super(exceptionMessage);
this.useCause = false;
this.exceptionClass = exceptionClass;
this.exceptionMessage = exceptionMessage;
this.genericExceptionInfo = new GenericExceptionInfo(exceptionClass, exceptionMessage, exceptionMessage, getStackTrace());
}
public GenericException(Throwable cause) {
super(StringUtils.toString(cause));
this.useCause = false;
this.exceptionClass = cause.getClass().getName();
this.exceptionMessage = cause.getMessage();
this.genericExceptionInfo = new GenericExceptionInfo(this.exceptionClass, this.exceptionMessage, super.getMessage(), getStackTrace());
}
protected GenericException(GenericExceptionInfo info) {
super(info.getMsg(), null, true, false);
setStackTrace(info.getStackTrace());
this.useCause = false;
this.exceptionClass = info.getExClass();
this.exceptionMessage = info.getExMsg();
this.genericExceptionInfo = info;
}
@Transient
public String getExceptionClass() {
if(this.useCause) {
return ((GenericException)getCause()).getExceptionClass();
}
return exceptionClass;
}
public void setExceptionClass(String exceptionClass) {
if(this.useCause) {
((GenericException)getCause()).setExceptionClass(exceptionClass);
return;
}
this.exceptionClass = exceptionClass;
}
@Transient
public String getExceptionMessage() {
if(this.useCause) {
return ((GenericException)getCause()).getExceptionMessage();
}
return exceptionMessage;
}
public void setExceptionMessage(String exceptionMessage) {
if(this.useCause) {
((GenericException)getCause()).setExceptionMessage(exceptionMessage);
return;
}
this.exceptionMessage = exceptionMessage;
}
@Override
@Transient
public StackTraceElement[] getStackTrace() {
if(this.useCause) {
return ((GenericException)getCause()).getStackTrace();
}
return super.getStackTrace();
}
@Override
@Transient
public String getMessage() {
if(this.useCause) {
return getCause().getMessage();
}
return JsonUtils.getJson().toJson(GenericExceptionInfo.createNoStackTrace(genericExceptionInfo));
}
public String getGenericException() {
if(this.useCause) {
return ((GenericException)getCause()).getGenericException();
}
return JsonUtils.getJson().toJson(genericExceptionInfo);
}
public void setGenericException(String json) {
GenericExceptionInfo info = JsonUtils.getJson().toJavaObject(json, GenericExceptionInfo.class);
if(info == null) {
return;
}
this.useCause = true;
initCause(new GenericException(info));
}
@Override
@Transient
public String getLocalizedMessage() {
return getMessage();
}
/**
* create generic exception info
*/
public static class GenericExceptionInfo implements Serializable {
private String exClass;
private String exMsg;
private String msg;
private StackTraceElement[] stackTrace;
public GenericExceptionInfo() {
}
public GenericExceptionInfo(String exceptionClass, String exceptionMessage, String message, StackTraceElement[] stackTrace) {
this.exClass = exceptionClass;
this.exMsg = exceptionMessage;
this.msg = message;
this.stackTrace = stackTrace;
}
public static GenericExceptionInfo createNoStackTrace(GenericExceptionInfo info) {
return new GenericExceptionInfo(info.getExClass(), info.getExMsg(), info.getMsg(), null);
}
public String getMsg() {
return msg;
}
public String getExClass() {
return exClass;
}
public String getExMsg() {
return exMsg;
}
public void setExClass(String exClass) {
this.exClass = exClass;
}
public void setExMsg(String exMsg) {
this.exMsg = exMsg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public StackTraceElement[] getStackTrace() {
return stackTrace;
}
public void setStackTrace(StackTraceElement[] stackTrace) {
this.stackTrace = stackTrace;
}
}
}