PackIndex: Add protected setters to populate the MutableEntry Implementations of the iterator out of package receive a MutableEntry but they don't have a way to set data into it. Add setters to the MutableEntry via protected methods in the iterator. This way, only implementors of the Iterator can modify the entry (cannot be modified e.g. by callers). Change-Id: Id50c69d8be230ebdb8108acc47df13abcad0af0a
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java index 95050d4..dfea5c1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java
@@ -359,10 +359,11 @@ abstract class EntriesIterator implements Iterator<MutableEntry> { private long returnedNumber = 0; /** - * Default constructor. - * - * @param objectCount the number of objects in the PackFile. - */ + * Construct an iterator that can move objectCount times forward. + * + * @param objectCount + * the number of objects in the PackFile. + */ protected EntriesIterator(long objectCount) { this.objectCount = objectCount; } @@ -379,17 +380,54 @@ public boolean hasNext() { */ @Override public MutableEntry next() { - readNext(entry); + readNext(); returnedNumber++; return entry; } /** * Used by subclasses to load the next entry into the MutableEntry. + * <p> + * Subclasses are expected to populate the entry with + * {@link #setIdBuffer} and {@link #setOffset}. + */ + protected abstract void readNext(); + + + /** + * Copies to the entry an {@link ObjectId} from the int buffer and + * position idx * - * @param entry the container of the next Iterator entry. - */ - protected abstract void readNext(MutableEntry entry); + * @param raw + * the raw data + * @param idx + * the index into {@code raw} + */ + protected void setIdBuffer(int[] raw, int idx) { + entry.idBuffer.fromRaw(raw, idx); + } + + /** + * Copies to the entry an {@link ObjectId} from the byte array at + * position idx. + * + * @param raw + * the raw data + * @param idx + * the index into {@code raw} + */ + protected void setIdBuffer(byte[] raw, int idx) { + entry.idBuffer.fromRaw(raw, idx); + } + + /** + * Sets the {@code offset} to the entry + * + * @param offset the offset in the pack file + */ + protected void setOffset(long offset) { + entry.offset = offset; + } @Override public void remove() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java index 99f3315..be48358 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java
@@ -259,15 +259,15 @@ private EntriesIteratorV1(PackIndexV1 packIndex) { } @Override - protected void readNext(MutableEntry entry) { + protected void readNext() { for (; levelOne < packIndex.idxdata.length; levelOne++) { if (packIndex.idxdata[levelOne] == null) continue; if (levelTwo < packIndex.idxdata[levelOne].length) { - entry.offset = NB.decodeUInt32(packIndex.idxdata[levelOne], - levelTwo); + super.setOffset(NB.decodeUInt32(packIndex.idxdata[levelOne], + levelTwo)); this.levelTwo += Constants.OBJECT_ID_LENGTH + 4; - entry.idBuffer.fromRaw(packIndex.idxdata[levelOne], + super.setIdBuffer(packIndex.idxdata[levelOne], levelTwo - Constants.OBJECT_ID_LENGTH); return; }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java index f23380d..36e54fc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java
@@ -302,7 +302,7 @@ private EntriesIteratorV2(PackIndexV2 packIndex) { } @Override - protected void readNext(MutableEntry entry) { + protected void readNext() { for (; levelOne < packIndex.names.length; levelOne++) { if (levelTwo < packIndex.names[levelOne].length) { int idx = levelTwo / (Constants.OBJECT_ID_LENGTH / 4) * 4; @@ -312,9 +312,9 @@ protected void readNext(MutableEntry entry) { idx = (8 * (int) (offset & ~IS_O64)); offset = NB.decodeUInt64(packIndex.offset64, idx); } - entry.offset = offset; + super.setOffset(offset); this.levelTwo += Constants.OBJECT_ID_LENGTH / 4; - entry.idBuffer.fromRaw(packIndex.names[levelOne], + super.setIdBuffer(packIndex.names[levelOne], levelTwo - Constants.OBJECT_ID_LENGTH / 4); return; }