/* * Copyright (C) 2011, 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 java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import org.eclipse.jgit.internal.storage.pack.CachedPack; import org.eclipse.jgit.internal.storage.pack.ObjectToPack; import org.eclipse.jgit.internal.storage.pack.PackExt; import org.eclipse.jgit.internal.storage.pack.PackOutputStream; import org.eclipse.jgit.internal.storage.pack.StoredObjectRepresentation; class LocalCachedPack extends CachedPack { private final ObjectDirectory odb; private final String[] packNames; private Pack[] packs; LocalCachedPack(ObjectDirectory odb, List packNames) { this.odb = odb; this.packNames = packNames.toArray(new String[0]); } LocalCachedPack(List packs) { odb = null; packNames = null; this.packs = packs.toArray(new Pack[0]); } /** {@inheritDoc} */ @Override public long getObjectCount() throws IOException { long cnt = 0; for (Pack pack : getPacks()) cnt += pack.getObjectCount(); return cnt; } void copyAsIs(PackOutputStream out, WindowCursor wc) throws IOException { for (Pack pack : getPacks()) pack.copyPackAsIs(out, wc); } /** {@inheritDoc} */ @Override public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) { try { LocalObjectRepresentation local = (LocalObjectRepresentation) rep; for (Pack pack : getPacks()) { if (local.pack == pack) return true; } return false; } catch (FileNotFoundException packGone) { return false; } } private Pack[] getPacks() throws FileNotFoundException { if (packs == null) { Pack[] p = new Pack[packNames.length]; for (int i = 0; i < packNames.length; i++) p[i] = getPackFile(packNames[i]); packs = p; } return packs; } private Pack getPackFile(String packName) throws FileNotFoundException { for (Pack pack : odb.getPacks()) { if (packName.equals(pack.getPackName())) return pack; } throw new FileNotFoundException(getPackFilePath(packName)); } private String getPackFilePath(String packName) { final File packDir = odb.getPackDirectory(); return new PackFile(packDir, packName, PackExt.PACK).getPath(); } }