blob: ca52ae9b388680932f75abeecc36d09787522532 [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.common.serialize.protobuf.support;
import org.apache.dubbo.common.serialize.protobuf.support.wrapper.ThrowablePB;
import org.apache.dubbo.common.serialize.protobuf.support.wrapper.ThrowablePB.ThrowableProto;
import com.google.common.base.Strings;
/**
* For protobuf, all server side exceptions should be wrapped using this specific one.
*/
public class ProtobufWrappedException extends RuntimeException {
private static final long serialVersionUID = -1792808536714102039L;
private String originalClassName;
private String originalMessage;
public ProtobufWrappedException(ThrowableProto throwableProto) {
super(throwableProto.getOriginalClassName() + ": " + throwableProto.getOriginalMessage());
originalClassName = throwableProto.getOriginalClassName();
originalMessage = throwableProto.getOriginalMessage();
if (throwableProto.getStackTraceCount() > 0) {
setStackTrace(throwableProto.getStackTraceList().stream()
.map(ProtobufWrappedException::toStackTraceElement)
.toArray(StackTraceElement[]::new));
}
if (throwableProto.hasCause()) {
initCause(new ProtobufWrappedException(throwableProto.getCause()));
}
}
public String getOriginalClassName() {
return originalClassName;
}
public String getOriginalMessage() {
return originalMessage;
}
private static StackTraceElement toStackTraceElement(ThrowablePB.StackTraceElementProto proto) {
return new StackTraceElement(
proto.getClassName(),
proto.getMethodName(),
Strings.emptyToNull(proto.getFileName()),
proto.getLineNumber());
}
}