xref: /JGit/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsBlobLoader.java (revision 5c5f7c6b146b24f2bd4afae1902df85ad6e57ea3)
1d3ed64bcSMarkus Duft /*
2*5c5f7c6bSMatthias Sohn  * Copyright (C) 2017, Markus Duft <markus.duft@ssi-schaefer.com> and others
3d3ed64bcSMarkus Duft  *
4*5c5f7c6bSMatthias Sohn  * This program and the accompanying materials are made available under the
5*5c5f7c6bSMatthias Sohn  * terms of the Eclipse Distribution License v. 1.0 which is available at
6*5c5f7c6bSMatthias Sohn  * https://www.eclipse.org/org/documents/edl-v10.php.
7d3ed64bcSMarkus Duft  *
8*5c5f7c6bSMatthias Sohn  * SPDX-License-Identifier: BSD-3-Clause
9d3ed64bcSMarkus Duft  */
10d3ed64bcSMarkus Duft package org.eclipse.jgit.lfs;
11d3ed64bcSMarkus Duft 
12d3ed64bcSMarkus Duft import java.io.IOException;
13d3ed64bcSMarkus Duft import java.nio.file.Files;
14d3ed64bcSMarkus Duft import java.nio.file.Path;
15d3ed64bcSMarkus Duft import java.nio.file.attribute.BasicFileAttributes;
16d3ed64bcSMarkus Duft 
17d3ed64bcSMarkus Duft import org.eclipse.jgit.errors.LargeObjectException;
18d3ed64bcSMarkus Duft import org.eclipse.jgit.errors.MissingObjectException;
19d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.Constants;
20d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.ObjectLoader;
21d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.ObjectStream;
22d3ed64bcSMarkus Duft import org.eclipse.jgit.storage.pack.PackConfig;
23d3ed64bcSMarkus Duft import org.eclipse.jgit.util.IO;
24d3ed64bcSMarkus Duft 
25d3ed64bcSMarkus Duft /**
26d3ed64bcSMarkus Duft  * An {@link ObjectLoader} implementation that reads a media file from the LFS
27d3ed64bcSMarkus Duft  * storage.
28d3ed64bcSMarkus Duft  *
29d3ed64bcSMarkus Duft  * @since 4.11
30d3ed64bcSMarkus Duft  */
31d3ed64bcSMarkus Duft public class LfsBlobLoader extends ObjectLoader {
32d3ed64bcSMarkus Duft 
33d3ed64bcSMarkus Duft 	private Path mediaFile;
34d3ed64bcSMarkus Duft 
35d3ed64bcSMarkus Duft 	private BasicFileAttributes attributes;
36d3ed64bcSMarkus Duft 
37d3ed64bcSMarkus Duft 	private byte[] cached;
38d3ed64bcSMarkus Duft 
39d3ed64bcSMarkus Duft 	/**
40d3ed64bcSMarkus Duft 	 * Create a loader for the LFS media file at the given path.
41d3ed64bcSMarkus Duft 	 *
42d3ed64bcSMarkus Duft 	 * @param mediaFile
43d3ed64bcSMarkus Duft 	 *            path to the file
44d3ed64bcSMarkus Duft 	 * @throws IOException
45d3ed64bcSMarkus Duft 	 *             in case of an error reading attributes
46d3ed64bcSMarkus Duft 	 */
LfsBlobLoader(Path mediaFile)47d3ed64bcSMarkus Duft 	public LfsBlobLoader(Path mediaFile) throws IOException {
48d3ed64bcSMarkus Duft 		this.mediaFile = mediaFile;
49d3ed64bcSMarkus Duft 		this.attributes = Files.readAttributes(mediaFile,
50d3ed64bcSMarkus Duft 				BasicFileAttributes.class);
51d3ed64bcSMarkus Duft 	}
52d3ed64bcSMarkus Duft 
53d3ed64bcSMarkus Duft 	@Override
getType()54d3ed64bcSMarkus Duft 	public int getType() {
55d3ed64bcSMarkus Duft 		return Constants.OBJ_BLOB;
56d3ed64bcSMarkus Duft 	}
57d3ed64bcSMarkus Duft 
58d3ed64bcSMarkus Duft 	@Override
getSize()59d3ed64bcSMarkus Duft 	public long getSize() {
60d3ed64bcSMarkus Duft 		return attributes.size();
61d3ed64bcSMarkus Duft 	}
62d3ed64bcSMarkus Duft 
63d3ed64bcSMarkus Duft 	@Override
getCachedBytes()64d3ed64bcSMarkus Duft 	public byte[] getCachedBytes() throws LargeObjectException {
65d3ed64bcSMarkus Duft 		if (getSize() > PackConfig.DEFAULT_BIG_FILE_THRESHOLD) {
66d3ed64bcSMarkus Duft 			throw new LargeObjectException();
67d3ed64bcSMarkus Duft 		}
68d3ed64bcSMarkus Duft 
69d3ed64bcSMarkus Duft 		if (cached == null) {
70d3ed64bcSMarkus Duft 			try {
71d3ed64bcSMarkus Duft 				cached = IO.readFully(mediaFile.toFile());
72d3ed64bcSMarkus Duft 			} catch (IOException ioe) {
73d3ed64bcSMarkus Duft 				throw new LargeObjectException(ioe);
74d3ed64bcSMarkus Duft 			}
75d3ed64bcSMarkus Duft 		}
76d3ed64bcSMarkus Duft 		return cached;
77d3ed64bcSMarkus Duft 	}
78d3ed64bcSMarkus Duft 
79d3ed64bcSMarkus Duft 	@Override
openStream()80d3ed64bcSMarkus Duft 	public ObjectStream openStream()
81d3ed64bcSMarkus Duft 			throws MissingObjectException, IOException {
82d3ed64bcSMarkus Duft 		return new ObjectStream.Filter(getType(), getSize(),
83d3ed64bcSMarkus Duft 				Files.newInputStream(mediaFile));
84d3ed64bcSMarkus Duft 	}
85d3ed64bcSMarkus Duft 
86d3ed64bcSMarkus Duft }
87