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