/
githubmirror
/
guava
Обзор
Документация
Войти
/
githubmirror
/
guava
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
guava-testlib/src/com/google/common/testing/TearDownStack.java
108 строк
3 KB
cpovirk
Fill in Javadoc for some APIs that are missing it.
01 июл 2026, 00:22
01 июл 2026, 00:22
c527d59
Код
Авторство
О чём код?
/* * Copyright (C) 2008 The Guava Authors * * 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 com.google.common.testing; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Throwables.throwIfUnchecked; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.VisibleForTesting; import com.google.errorprone.annotations.concurrent.GuardedBy; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.jspecify.annotations.NullMarked; /** * A {@code TearDownStack} contains a stack of {@link TearDown} instances. * * <p>This class is thread-safe. * * @author Kevin Bourrillion * @since 10.0 */ @GwtCompatible @NullMarked public class TearDownStack implements TearDownAccepter { private static final Logger logger = Logger.getLogger(TearDownStack.class.getName()); @VisibleForTesting final Object lock = new Object(); @GuardedBy("lock") final Deque<TearDown> stack = new ArrayDeque<>(); /* * TODO(cpovirk): Rework the "suppress" terminology in this class for Java's "new" concept of * "suppressed exceptions." At the moment, we use addSuppressed only if suppressThrows is *false*! */ private final boolean suppressThrows; /** * Constructs a new {@code TearDownStack} that does not suppress exceptions throw during teardown. */ public TearDownStack() { this.suppressThrows = false; } /** * Constructs a new {@code TearDownStack}, specifying whether to suppress exceptions thrown during * teardown. */ public TearDownStack(boolean suppressThrows) { this.suppressThrows = suppressThrows; } @Override public final void addTearDown(TearDown tearDown) { synchronized (lock) { stack.addFirst(checkNotNull(tearDown)); } } /** Causes teardown to execute. */ public final void runTearDown() { Throwable exception = null; List<TearDown> stackCopy; synchronized (lock) { stackCopy = new ArrayList<>(stack); stack.clear(); } for (TearDown tearDown : stackCopy) { try { tearDown.tearDown(); } catch (Throwable t) { if (suppressThrows) { logger.log(Level.INFO, "exception thrown during tearDown", t); } else { if (exception == null) { exception = t; } else { exception.addSuppressed(t); } } } } if (exception != null) { throwIfUnchecked(exception); throw new RuntimeException("failure during tearDown", exception); } } }