| /* |
| * Copyright (C) 2017, Google Inc. and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.internal.storage.dfs; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.jgit.internal.storage.reftable.ReftableReader; |
| |
| /** |
| * Tracks multiple open |
| * {@link org.eclipse.jgit.internal.storage.reftable.ReftableReader} instances. |
| */ |
| public class DfsReftableStack implements AutoCloseable { |
| /** |
| * Opens a stack of tables for reading. |
| * |
| * @param ctx |
| * context to read the tables with. This {@code ctx} will be |
| * retained by the stack and each of the table readers. |
| * @param files |
| * the tables to open. |
| * @return stack reference to close the tables. |
| * @throws java.io.IOException |
| * a table could not be opened |
| */ |
| public static DfsReftableStack open(DfsReader ctx, List<DfsReftable> files) |
| throws IOException { |
| DfsReftableStack stack = new DfsReftableStack(files.size()); |
| boolean close = true; |
| try { |
| for (DfsReftable t : files) { |
| stack.files.add(t); |
| stack.tables.add(t.open(ctx)); |
| } |
| close = false; |
| return stack; |
| } finally { |
| if (close) { |
| stack.close(); |
| } |
| } |
| } |
| |
| private final List<DfsReftable> files; |
| private final List<ReftableReader> tables; |
| |
| private DfsReftableStack(int tableCnt) { |
| this.files = new ArrayList<>(tableCnt); |
| this.tables = new ArrayList<>(tableCnt); |
| } |
| |
| /** |
| * Get unmodifiable list of DfsRefatble files |
| * |
| * @return unmodifiable list of DfsRefatble files, in the same order the |
| * files were passed to {@link #open(DfsReader, List)}. |
| */ |
| public List<DfsReftable> files() { |
| return Collections.unmodifiableList(files); |
| } |
| |
| /** |
| * Get unmodifiable list of tables |
| * |
| * @return unmodifiable list of tables, in the same order the files were |
| * passed to {@link #open(DfsReader, List)}. |
| */ |
| public List<ReftableReader> readers() { |
| return Collections.unmodifiableList(tables); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public void close() { |
| for (ReftableReader t : tables) { |
| try { |
| t.close(); |
| } catch (IOException e) { |
| // Ignore close failures. |
| } |
| } |
| } |
| } |