| /* | |
| * Copyright (C) 2017, Markus Duft <markus.duft@ssi-schaefer.com> 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.lfs; | |
| import java.io.IOException; | |
| import java.nio.file.Files; | |
| import java.nio.file.Path; | |
| import java.nio.file.attribute.BasicFileAttributes; | |
| import org.eclipse.jgit.errors.LargeObjectException; | |
| import org.eclipse.jgit.errors.MissingObjectException; | |
| import org.eclipse.jgit.lib.Constants; | |
| import org.eclipse.jgit.lib.ObjectLoader; | |
| import org.eclipse.jgit.lib.ObjectStream; | |
| import org.eclipse.jgit.storage.pack.PackConfig; | |
| import org.eclipse.jgit.util.IO; | |
| /** | |
| * An {@link ObjectLoader} implementation that reads a media file from the LFS | |
| * storage. | |
| * | |
| * @since 4.11 | |
| */ | |
| public class LfsBlobLoader extends ObjectLoader { | |
| private Path mediaFile; | |
| private BasicFileAttributes attributes; | |
| private byte[] cached; | |
| /** | |
| * Create a loader for the LFS media file at the given path. | |
| * | |
| * @param mediaFile | |
| * path to the file | |
| * @throws IOException | |
| * in case of an error reading attributes | |
| */ | |
| public LfsBlobLoader(Path mediaFile) throws IOException { | |
| this.mediaFile = mediaFile; | |
| this.attributes = Files.readAttributes(mediaFile, | |
| BasicFileAttributes.class); | |
| } | |
| @Override | |
| public int getType() { | |
| return Constants.OBJ_BLOB; | |
| } | |
| @Override | |
| public long getSize() { | |
| return attributes.size(); | |
| } | |
| @Override | |
| public byte[] getCachedBytes() throws LargeObjectException { | |
| if (getSize() > PackConfig.DEFAULT_BIG_FILE_THRESHOLD) { | |
| throw new LargeObjectException(); | |
| } | |
| if (cached == null) { | |
| try { | |
| cached = IO.readFully(mediaFile.toFile()); | |
| } catch (IOException ioe) { | |
| throw new LargeObjectException(ioe); | |
| } | |
| } | |
| return cached; | |
| } | |
| @Override | |
| public ObjectStream openStream() | |
| throws MissingObjectException, IOException { | |
| return new ObjectStream.Filter(getType(), getSize(), | |
| Files.newInputStream(mediaFile)); | |
| } | |
| } |