/*
* Copyright (C)2009 - SSHJ Contributors
*
* Licensed 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 net.schmizz.sshj.common;
import net.schmizz.concurrent.ExceptionChainer;
import java.io.IOException;
/**
* Most exceptions in the {@code net.schmizz.sshj} package are instances of this class. An {@link SSHException} is
* itself an {@link IOException} and can be caught like that if this level of granularity is not desired.
*/
public class SSHException
extends IOException {
public static final ExceptionChainer<SSHException> chainer = new ExceptionChainer<SSHException>() {
@Override
public SSHException chain(Throwable t) {
if (t instanceof SSHException)
return (SSHException) t;
else
return new SSHException(t);
}
};
private final DisconnectReason reason;
public SSHException(DisconnectReason code) {
this(code, null, null);
}
public SSHException(DisconnectReason code, String message) {
this(code, message, null);
}
public SSHException(DisconnectReason code, String message, Throwable cause) {
super(message);
this.reason = code;
if (cause != null)
initCause(cause);
}
public SSHException(DisconnectReason code, Throwable cause) {
this(code, null, cause);
}
public SSHException(String message) {
this(DisconnectReason.UNKNOWN, message, null);
}
public SSHException(String message, Throwable cause) {
this(DisconnectReason.UNKNOWN, message, cause);
}
public SSHException(Throwable cause) {
this(DisconnectReason.UNKNOWN, null, cause);
}
public DisconnectReason getDisconnectReason() {
return reason;
}
@Override
public String getMessage() {
if (super.getMessage() != null)
return super.getMessage();
else if (getCause() != null && getCause().getMessage() != null)
return getCause().getMessage();
else
return null;
}
@Override
public String toString() {
final String cls = getClass().getName();
final String code = reason != DisconnectReason.UNKNOWN ? "[" + reason + "] " : "";
final String msg = getMessage() != null ? getMessage() : "";
return cls + (code.isEmpty() && msg.isEmpty() ? "" : ": ") + code + msg;
}
}