aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableStack.java
blob: 97ba4d52ebaf36a1a14819c5268f02f83af4a514 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * 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);
	}

	@Override
	public void close() {
		for (ReftableReader t : tables) {
			try {
				t.close();
			} catch (IOException e) {
				// Ignore close failures.
			}
		}
	}
}