blob: d0d320bf027a8ab5fff34750e9ac2a42f9c058e0 [file] [log] [blame]
/*
* Copyright (C) 2015, 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.file;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectIdOwnerMap;
import org.eclipse.jgit.lib.ObjectIdSet;
/**
* Lazily loads a set of ObjectIds, one per line.
*/
public class LazyObjectIdSetFile implements ObjectIdSet {
private final File src;
private ObjectIdOwnerMap<Entry> set;
/**
* Create a new lazy set from a file.
*
* @param src
* the source file.
*/
public LazyObjectIdSetFile(File src) {
this.src = src;
}
@Override
public boolean contains(AnyObjectId objectId) {
if (set == null) {
set = load();
}
return set.contains(objectId);
}
private ObjectIdOwnerMap<Entry> load() {
ObjectIdOwnerMap<Entry> r = new ObjectIdOwnerMap<>();
try (FileInputStream fin = new FileInputStream(src);
Reader rin = new InputStreamReader(fin, UTF_8);
BufferedReader br = new BufferedReader(rin)) {
MutableObjectId id = new MutableObjectId();
for (String line; (line = br.readLine()) != null;) {
id.fromString(line);
if (!r.contains(id)) {
r.add(new Entry(id));
}
}
} catch (IOException e) {
// Ignore IO errors accessing the lazy set.
}
return r;
}
static class Entry extends ObjectIdOwnerMap.Entry {
Entry(AnyObjectId id) {
super(id);
}
}
}