blob: aa77394c6e113d199898e68396a42816efad9941 [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.ignite.internal.client;
import org.apache.ignite.internal.util.typedef.F;
import org.jetbrains.annotations.Nullable;
/**
* Client exception is a common super class of all client exceptions.
*/
public class GridClientException extends Exception {
/** */
private static final long serialVersionUID = 0L;
/**
* Constructs client exception.
*
* @param msg Message.
*/
public GridClientException(String msg) {
super(msg);
}
/**
* Constructs client exception.
*
* @param msg Message.
* @param cause Cause.
*/
public GridClientException(String msg, Throwable cause) {
super(msg, cause);
}
/**
* Constructs client exception.
*
* @param cause Cause.
*/
public GridClientException(Throwable cause) {
super(cause);
}
/**
* Checks if passed in {@code 'Throwable'} has given class in {@code 'cause'} hierarchy
* <b>including</b> that throwable itself.
* <p>
* Note that this method follows includes {@link Throwable#getSuppressed()}
* into check.
*
* @param cls Cause classes to check (if {@code null} or empty, {@code false} is returned).
* @return {@code True} if one of the causing exception is an instance of passed in classes,
* {@code false} otherwise.
*/
public boolean hasCause(@Nullable Class<? extends Throwable>... cls) {
return hasCause(this, cls);
}
/**
* Checks if passed in {@code 'Throwable'} has given class in {@code 'cause'} hierarchy
* <b>including</b> that throwable itself.
* <p>
* Note that this method follows includes {@link Throwable#getSuppressed()}
* into check.
*
* @param t Throwable to check (if {@code null}, {@code false} is returned).
* @param cls Cause classes to check (if {@code null} or empty, {@code false} is returned).
* @return {@code True} if one of the causing exception is an instance of passed in classes,
* {@code false} otherwise.
*/
private boolean hasCause(@Nullable Throwable t, @Nullable Class<? extends Throwable>... cls) {
if (t == null || F.isEmpty(cls))
return false;
assert cls != null;
for (Throwable th = t; th != null; th = th.getCause()) {
for (Class<? extends Throwable> c : cls)
if (c.isAssignableFrom(th.getClass()))
return true;
for (Throwable n : th.getSuppressed())
if (hasCause(n, cls))
return true;
if (th.getCause() == th)
break;
}
return false;
}
/** {@inheritDoc} */
@Override public String toString() {
return getClass() + ": " + getMessage();
}
}