/* * Copyright (C) 2022, Tencent. * * 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.commitgraph; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_COMMIT_DATA; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_FANOUT; import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_LOOKUP; import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH; import java.text.MessageFormat; import org.eclipse.jgit.internal.JGitText; /** * Builder for {@link CommitGraph}. */ class CommitGraphBuilder { private final int hashLength; private byte[] oidFanout; private byte[] oidLookup; private byte[] commitData; private byte[] extraList; private byte[] bloomFilterIndex; private byte[] bloomFilterData; /** * Create builder * * @return A builder of {@link CommitGraph}. */ static CommitGraphBuilder builder() { return new CommitGraphBuilder(OBJECT_ID_LENGTH); } private CommitGraphBuilder(int hashLength) { this.hashLength = hashLength; } CommitGraphBuilder addOidFanout(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(oidFanout, CHUNK_ID_OID_FANOUT); oidFanout = buffer; return this; } CommitGraphBuilder addOidLookUp(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(oidLookup, CHUNK_ID_OID_LOOKUP); oidLookup = buffer; return this; } CommitGraphBuilder addCommitData(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(commitData, CHUNK_ID_COMMIT_DATA); commitData = buffer; return this; } CommitGraphBuilder addExtraList(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(extraList, CHUNK_ID_EXTRA_EDGE_LIST); extraList = buffer; return this; } CommitGraphBuilder addBloomFilterIndex(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(bloomFilterIndex, CHUNK_ID_BLOOM_FILTER_INDEX); bloomFilterIndex = buffer; return this; } CommitGraphBuilder addBloomFilterData(byte[] buffer) throws CommitGraphFormatException { assertChunkNotSeenYet(bloomFilterData, CHUNK_ID_BLOOM_FILTER_DATA); bloomFilterData = buffer; return this; } CommitGraph build() throws CommitGraphFormatException { assertChunkNotNull(oidFanout, CHUNK_ID_OID_FANOUT); assertChunkNotNull(oidLookup, CHUNK_ID_OID_LOOKUP); assertChunkNotNull(commitData, CHUNK_ID_COMMIT_DATA); GraphObjectIndex index = new GraphObjectIndex(hashLength, oidFanout, oidLookup); GraphCommitData commitDataChunk = new GraphCommitData(hashLength, commitData, extraList); GraphChangedPathFilterData cpfData = new GraphChangedPathFilterData( bloomFilterIndex, bloomFilterData); return new CommitGraphV1(index, commitDataChunk, cpfData); } private void assertChunkNotNull(Object object, int chunkId) throws CommitGraphFormatException { if (object == null) { throw new CommitGraphFormatException( MessageFormat.format(JGitText.get().commitGraphChunkNeeded, Integer.toHexString(chunkId))); } } private void assertChunkNotSeenYet(Object object, int chunkId) throws CommitGraphFormatException { if (object != null) { throw new CommitGraphFormatException(MessageFormat.format( JGitText.get().commitGraphChunkRepeated, Integer.toHexString(chunkId))); } } }