what-the-bank/sources/com/google/common/io/Closer.java

147 lines
4.8 KiB
Java
Raw Normal View History

2024-07-27 18:17:47 +07:00
package com.google.common.io;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.logging.Level;
import java.util.logging.Logger;
/* loaded from: classes2.dex */
public final class Closer implements Closeable {
private static final Suppressor SUPPRESSOR;
private final Deque<Closeable> stack = new ArrayDeque(4);
final Suppressor suppressor;
private Throwable thrown;
/* loaded from: classes2.dex */
interface Suppressor {
void suppress(Closeable closeable, Throwable th, Throwable th2);
}
static {
Suppressor suppressor;
if (SuppressingSuppressor.isAvailable()) {
suppressor = SuppressingSuppressor.INSTANCE;
} else {
suppressor = LoggingSuppressor.INSTANCE;
}
SUPPRESSOR = suppressor;
}
public static Closer create() {
return new Closer(SUPPRESSOR);
}
Closer(Suppressor suppressor) {
this.suppressor = (Suppressor) Preconditions.checkNotNull(suppressor);
}
public final <C extends Closeable> C register(C c) {
if (c != null) {
this.stack.addFirst(c);
}
return c;
}
public final RuntimeException rethrow(Throwable th) throws IOException {
Preconditions.checkNotNull(th);
this.thrown = th;
Throwables.propagateIfPossible(th, IOException.class);
throw new RuntimeException(th);
}
public final <X extends Exception> RuntimeException rethrow(Throwable th, Class<X> cls) throws IOException, Exception {
Preconditions.checkNotNull(th);
this.thrown = th;
Throwables.propagateIfPossible(th, IOException.class);
Throwables.propagateIfPossible(th, cls);
throw new RuntimeException(th);
}
public final <X1 extends Exception, X2 extends Exception> RuntimeException rethrow(Throwable th, Class<X1> cls, Class<X2> cls2) throws IOException, Exception, Exception {
Preconditions.checkNotNull(th);
this.thrown = th;
Throwables.propagateIfPossible(th, IOException.class);
Throwables.propagateIfPossible(th, cls, cls2);
throw new RuntimeException(th);
}
@Override // java.io.Closeable, java.lang.AutoCloseable
public final void close() throws IOException {
Throwable th = this.thrown;
while (!this.stack.isEmpty()) {
Closeable removeFirst = this.stack.removeFirst();
try {
removeFirst.close();
} catch (Throwable th2) {
if (th == null) {
th = th2;
} else {
this.suppressor.suppress(removeFirst, th, th2);
}
}
}
if (this.thrown != null || th == null) {
return;
}
Throwables.propagateIfPossible(th, IOException.class);
throw new AssertionError(th);
}
/* loaded from: classes2.dex */
static final class LoggingSuppressor implements Suppressor {
static final LoggingSuppressor INSTANCE = new LoggingSuppressor();
LoggingSuppressor() {
}
@Override // com.google.common.io.Closer.Suppressor
public final void suppress(Closeable closeable, Throwable th, Throwable th2) {
Logger logger = Closeables.logger;
Level level = Level.WARNING;
String valueOf = String.valueOf(closeable);
StringBuilder sb = new StringBuilder(String.valueOf(valueOf).length() + 42);
sb.append("Suppressing exception thrown when closing ");
sb.append(valueOf);
logger.log(level, sb.toString(), th2);
}
}
/* loaded from: classes2.dex */
static final class SuppressingSuppressor implements Suppressor {
static final SuppressingSuppressor INSTANCE = new SuppressingSuppressor();
static final Method addSuppressed = addSuppressedMethodOrNull();
SuppressingSuppressor() {
}
private static Method addSuppressedMethodOrNull() {
try {
return Throwable.class.getMethod("addSuppressed", Throwable.class);
} catch (Throwable unused) {
return null;
}
}
@Override // com.google.common.io.Closer.Suppressor
public final void suppress(Closeable closeable, Throwable th, Throwable th2) {
if (th == th2) {
return;
}
try {
addSuppressed.invoke(th, th2);
} catch (Throwable unused) {
LoggingSuppressor.INSTANCE.suppress(closeable, th, th2);
}
}
static boolean isAvailable() {
return addSuppressed != null;
}
}
}