| /* |
| * 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.dfs; |
| |
| import static java.nio.charset.StandardCharsets.UTF_8; |
| |
| import java.util.Arrays; |
| |
| import org.eclipse.jgit.annotations.Nullable; |
| import org.eclipse.jgit.internal.storage.pack.PackExt; |
| |
| /** |
| * Key used by {@link org.eclipse.jgit.internal.storage.dfs.DfsBlockCache} to disambiguate streams. |
| */ |
| public abstract class DfsStreamKey { |
| /** |
| * Create a {@code DfsStreamKey} |
| * |
| * @param repo |
| * description of the containing repository. |
| * @param name |
| * compute the key from a string name. |
| * @param ext |
| * pack file extension, or {@code null}. |
| * @return key for {@code name} |
| */ |
| public static DfsStreamKey of(DfsRepositoryDescription repo, String name, |
| @Nullable PackExt ext) { |
| return new ByteArrayDfsStreamKey(repo, name.getBytes(UTF_8), ext); |
| } |
| |
| final int hash; |
| |
| final int packExtPos; |
| |
| /** |
| * Constructor for DfsStreamKey. |
| * |
| * @param hash |
| * hash of the other identifying components of the key. |
| * @param ext |
| * pack file extension, or {@code null}. |
| */ |
| protected DfsStreamKey(int hash, @Nullable PackExt ext) { |
| // Multiply by 31 here so we can more directly combine with another |
| // value without doing the multiply there. |
| this.hash = hash * 31; |
| this.packExtPos = ext == null ? 0 : ext.getPosition(); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public int hashCode() { |
| return hash; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public abstract boolean equals(Object o); |
| |
| /** {@inheritDoc} */ |
| @SuppressWarnings("boxing") |
| @Override |
| public String toString() { |
| return String.format("DfsStreamKey[hash=%08x]", hash); //$NON-NLS-1$ |
| } |
| |
| private static final class ByteArrayDfsStreamKey extends DfsStreamKey { |
| private final DfsRepositoryDescription repo; |
| |
| private final byte[] name; |
| |
| ByteArrayDfsStreamKey(DfsRepositoryDescription repo, byte[] name, |
| @Nullable PackExt ext) { |
| super(repo.hashCode() * 31 + Arrays.hashCode(name), ext); |
| this.repo = repo; |
| this.name = name; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (o instanceof ByteArrayDfsStreamKey) { |
| ByteArrayDfsStreamKey k = (ByteArrayDfsStreamKey) o; |
| return hash == k.hash && repo.equals(k.repo) |
| && Arrays.equals(name, k.name); |
| } |
| return false; |
| } |
| } |
| |
| static final class ForReverseIndex extends DfsStreamKey { |
| private final DfsStreamKey idxKey; |
| |
| ForReverseIndex(DfsStreamKey idxKey) { |
| super(idxKey.hash + 1, null); |
| this.idxKey = idxKey; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| return o instanceof ForReverseIndex |
| && idxKey.equals(((ForReverseIndex) o).idxKey); |
| } |
| } |
| } |