Package org.eclipse.jgit.internal.storage.file

## Class ObjectDirectoryPackParser

- java.lang.Object
- - org.eclipse.jgit.transport.PackParser
  - - org.eclipse.jgit.internal.storage.file.ObjectDirectoryPackParser

    public class ObjectDirectoryPackParser
    extends PackParser

Consumes a pack stream and stores as a pack file in `ObjectDirectory`.

To obtain an instance of a parser, applications should use `ObjectInserter.newPackParser(InputStream)`.

### Nested Class Summary

### Nested classes/interfaces inherited from class org.eclipse.jgit.transport.PackParser

`PackParser.ObjectTypeAndSize, PackParser.Source, PackParser.UnresolvedDelta`

### Method Summary

All Methods Instance Methods Concrete Methods
`protected boolean` `checkCRC​(int oldCRC)` Check the current CRC matches the expected value.
`PackFile` `getPackFile()` Get the imported `PackFile`.
`long` `getPackSize()` Get the size of the parsed pack.
`protected boolean` `onAppendBase​(int typeCode, byte[] data, PackedObjectInfo info)` Provide the implementation with a base that was outside of the pack.
`protected void` `onBeginOfsDelta​(long streamPosition, long baseStreamPosition, long inflatedSize)` Event notifying start of a delta referencing its base by offset.
`protected void` `onBeginRefDelta​(long streamPosition, AnyObjectId baseId, long inflatedSize)` Event notifying start of a delta referencing its base by ObjectId.
`protected void` `onBeginWholeObject​(long streamPosition, int type, long inflatedSize)` Event notifying the start of an object stored whole (not as a delta).
`protected PackParser.UnresolvedDelta` `onEndDelta()` Event notifying the the current object.
`protected void` `onEndThinPack()` Event indicating a thin pack has been completely processed.
`protected void` `onEndWholeObject​(PackedObjectInfo info)` Event notifying the the current object.
`protected void` `onInflatedObjectData​(PackedObjectInfo obj, int typeCode, byte[] data)` Invoked for commits, trees, tags, and small blobs.
`protected void` `onObjectData​(PackParser.Source src, byte[] raw, int pos, int len)` Store (and/or checksum) a portion of an object's data.
`protected void` `onObjectHeader​(PackParser.Source src, byte[] raw, int pos, int len)` Store (and/or checksum) an object header.
`protected void` `onPackFooter​(byte[] hash)` Provide the implementation with the original stream's pack footer.
`protected void` `onPackHeader​(long objectCount)` Provide the implementation with the original stream's pack header.
`protected void` `onStoreStream​(byte[] raw, int pos, int len)` Store bytes received from the raw stream.
`PackLock` `parse​(ProgressMonitor receiving, ProgressMonitor resolving)` Parse the pack stream.
`protected int` `readDatabase​(byte[] dst, int pos, int cnt)` Read from the database's current position into the buffer.
`protected PackParser.ObjectTypeAndSize` `seekDatabase​(PackedObjectInfo obj, PackParser.ObjectTypeAndSize info)` Reposition the database to re-read a previously stored object.
`protected PackParser.ObjectTypeAndSize` `seekDatabase​(PackParser.UnresolvedDelta delta, PackParser.ObjectTypeAndSize info)` Reposition the database to re-read a previously stored object.
`void` `setIndexVersion​(int version)` Set the pack index file format version this instance will create.
`void` `setKeepEmpty​(boolean empty)` Configure this index pack instance to keep an empty pack.

### Methods inherited from class org.eclipse.jgit.transport.PackParser

`buffer, getBaseObjectIds, getLockMessage, getNewObjectIds, getObject, getObjectCount, getSortedObjectList, isAllowThin, isCheckEofAfterPackFooter, isExpectDataAfterPackFooter, newInfo, parse, readObjectHeader, setAllowThin, setCheckEofAfterPackFooter, setExpectDataAfterPackFooter, setLockMessage, setMaxObjectSizeLimit, setNeedBaseObjectIds, setNeedNewObjectIds, setObjectChecker, setObjectChecking`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Method Detail

#### setIndexVersion

    public void setIndexVersion​(int version)

Set the pack index file format version this instance will create.

Parameters:
  `version` - the version to write. The special version 0 designates the oldest (most compatible) format available for the objects.
See Also:
  `PackIndexWriter`

#### setKeepEmpty

    public void setKeepEmpty​(boolean empty)

Configure this index pack instance to keep an empty pack.

By default an empty pack (a pack with no objects) is not kept, as doi so is completely pointless. With no objects in the pack there is no d stored by it, so the pack is unnecessary.

Parameters:
  `empty` - true to enable keeping an empty pack.

#### getPackFile

    public PackFile getPackFile()

Get the imported `PackFile`.

This method is supplied only to support testing; applications shouldn't be using it directly to access the imported data.

Returns:
  the imported PackFile, if parsing was successful.

#### getPackSize

    public long getPackSize()

Description copied from class: `PackParser`
Get the size of the parsed pack. This will also include the pack index size if an index was created. This method should only be called after pack parsing is finished.

Overrides:
  `getPackSize` in class `PackParser`
Returns:
  the pack size (including the index size) or -1 if the size cannot be determined

#### parse

    public PackLock parse​(ProgressMonitor receiving,
                          ProgressMonitor resolving)
                   throws IOException

Description copied from class: `PackParser`
Parse the pack stream.

Overrides:
  `parse` in class `PackParser`
Parameters:
  `receiving` - receives progress feedback during the initial receiving objects phase. If null, `NullProgressMonitor` will be used.
  `resolving` - receives progress feedback during the resolving objects phase.
Returns:
  the pack lock, if one was requested by setting `PackParser.setLockMessage(String)`.
Throws:
  `IOException` - the stream is malformed, or contains corrupt objects.

#### onPackHeader

    protected void onPackHeader​(long objectCount)
                         throws IOException

Description copied from class: `PackParser`
Provide the implementation with the original stream's pack header.

Specified by:
  `onPackHeader` in class `PackParser`
Parameters:
  `objectCount` - number of objects expected in the stream.
Throws:
  `IOException` - the implementation refuses to work with this many objects.

#### onBeginWholeObject

    protected void onBeginWholeObject​(long streamPosition,
                                      int type,
                                      long inflatedSize)
                               throws IOException

Description copied from class: `PackParser`
Event notifying the start of an object stored whole (not as a delta).

Specified by:
  `onBeginWholeObject` in class `PackParser`
Parameters:
  `streamPosition` - position of this object in the incoming stream.
  `type` - type of the object; one of `Constants.OBJ_COMMIT`, `Constants.OBJ_TREE`, `Constants.OBJ_BLOB`, or `Constants.OBJ_TAG`.
  `inflatedSize` - size of the object when fully inflated. The size stored within the pack may be larger or smaller, and is not yet known.
Throws:
  `IOException` - the object cannot be recorded.

#### onEndWholeObject

    protected void onEndWholeObject​(PackedObjectInfo info)
                             throws IOException

Description copied from class: `PackParser`
Event notifying the the current object.

Specified by:
  `onEndWholeObject` in class `PackParser`
Parameters:
  `info` - object information.
Throws:
  `IOException` - the object cannot be recorded.

#### onBeginOfsDelta

    protected void onBeginOfsDelta​(long streamPosition,
                                   long baseStreamPosition,
                                   long inflatedSize)
                            throws IOException

Description copied from class: `PackParser`
Event notifying start of a delta referencing its base by offset.

Specified by:
  `onBeginOfsDelta` in class `PackParser`
Parameters:
  `streamPosition` - position of this object in the incoming stream.
  `baseStreamPosition` - position of the base object in the incoming stream. The base must be before the delta, therefore `baseStreamPosition &lt; deltaStreamPosition`. This is not the position returned by a prior end object event.
  `inflatedSize` - size of the delta when fully inflated. The size stored within the pack may be larger or smaller, and is not yet known.
Throws:
  `IOException` - the object cannot be recorded.

#### onBeginRefDelta

    protected void onBeginRefDelta​(long streamPosition,
                                   AnyObjectId baseId,
                                   long inflatedSize)
                            throws IOException

Description copied from class: `PackParser`
Event notifying start of a delta referencing its base by ObjectId.

Specified by:
  `onBeginRefDelta` in class `PackParser`
Parameters:
  `streamPosition` - position of this object in the incoming stream.
  `baseId` - name of the base object. This object may be later in the stream, or might not appear at all in the stream (in the case of a thin-pack).
  `inflatedSize` - size of the delta when fully inflated. The size stored within the pack may be larger or smaller, and is not yet known.
Throws:
  `IOException` - the object cannot be recorded.

#### onEndDelta

    protected PackParser.UnresolvedDelta onEndDelta()
                                             throws IOException

Description copied from class: `PackParser`
Event notifying the the current object.

Overrides:
  `onEndDelta` in class `PackParser`
Returns:
  object information that must be populated with at least the offset.
Throws:
  `IOException` - the object cannot be recorded.

#### onInflatedObjectData

    protected void onInflatedObjectData​(PackedObjectInfo obj,
                                        int typeCode,
                                        byte[] data)
                                 throws IOException

Description copied from class: `PackParser`
Invoked for commits, trees, tags, and small blobs.

Specified by:
  `onInflatedObjectData` in class `PackParser`
Parameters:
  `obj` - the object info, populated.
  `typeCode` - the type of the object.
  `data` - inflated data for the object.
Throws:
  `IOException` - the object cannot be archived.

#### onObjectHeader

    protected void onObjectHeader​(PackParser.Source src,
                                  byte[] raw,
                                  int pos,
                                  int len)
                           throws IOException

Description copied from class: `PackParser`
Store (and/or checksum) an object header.

Invoked after any of the `onBegin()` events. The entire header is supplied in a single invocation, before any object data is supplied.

Specified by:
  `onObjectHeader` in class `PackParser`
Parameters:
  `src` - where the data came from
  `raw` - buffer to read data from.
  `pos` - first offset within buffer that is valid.
  `len` - number of bytes in buffer that are valid.
Throws:
  `IOException` - the stream cannot be archived.

#### onObjectData

    protected void onObjectData​(PackParser.Source src,
                                byte[] raw,
                                int pos,
                                int len)
                         throws IOException

Description copied from class: `PackParser`
Store (and/or checksum) a portion of an object's data.

This method may be invoked multiple times per object, depending on the size of the object, the size of the parser's internal read buffer, and the alignment of the object relative to the read buffer.

Invoked after `PackParser.onObjectHeader(Source, byte[], int, int)`.

Specified by:
  `onObjectData` in class `PackParser`
Parameters:
  `src` - where the data came from
  `raw` - buffer to read data from.
  `pos` - first offset within buffer that is valid.
  `len` - number of bytes in buffer that are valid.
Throws:
  `IOException` - the stream cannot be archived.

#### onStoreStream

    protected void onStoreStream​(byte[] raw,
                                 int pos,
                                 int len)
                          throws IOException

Description copied from class: `PackParser`
Store bytes received from the raw stream.

This method is invoked during `PackParser.parse(ProgressMonitor)` as data is consumed from the incoming stream. Implementors may use this event to archive the raw incoming stream to the destination repository in large chunks, without paying attention to object boundaries.

The only component of the pack not supplied to this method is the last 20 bytes of the pack that comprise the trailing SHA-1 checksum. Those are passed to `PackParser.onPackFooter(byte[])`.

Specified by:
  `onStoreStream` in class `PackParser`
Parameters:
  `raw` - buffer to copy data out of.
  `pos` - first offset within the buffer that is valid.
  `len` - number of bytes in the buffer that are valid.
Throws:
  `IOException` - the stream cannot be archived.

#### onPackFooter

    protected void onPackFooter​(byte[] hash)
                         throws IOException

Description copied from class: `PackParser`
Provide the implementation with the original stream's pack footer.

Specified by:
  `onPackFooter` in class `PackParser`
Parameters:
  `hash` - the trailing 20 bytes of the pack, this is a SHA-1 checksum of all of the pack data.
Throws:
  `IOException` - the stream cannot be archived.

#### seekDatabase

    protected PackParser.ObjectTypeAndSize seekDatabase​(PackParser.UnresolvedDelta delta,
                                                        PackParser.ObjectTypeAndSize info)
                                                 throws IOException

Description copied from class: `PackParser`
Reposition the database to re-read a previously stored object.

If the database is computing CRC-32 checksums for object data, it should reset its internal CRC instance during this method call.

Specified by:
  `seekDatabase` in class `PackParser`
Parameters:
  `delta` - the object position to begin reading from. This is an instance previously returned by `PackParser.onEndDelta()`.
  `info` - object to populate with type and size.
Returns:
  the `info` object.
Throws:
  `IOException` - the database cannot reposition to this location.

#### seekDatabase

    protected PackParser.ObjectTypeAndSize seekDatabase​(PackedObjectInfo obj,
                                                        PackParser.ObjectTypeAndSize info)
                                                 throws IOException

Description copied from class: `PackParser`
Reposition the database to re-read a previously stored object.

If the database is computing CRC-32 checksums for object data, it should reset its internal CRC instance during this method call.

Specified by:
  `seekDatabase` in class `PackParser`
Parameters:
  `obj` - the object position to begin reading from. This is from `PackParser.newInfo(AnyObjectId, UnresolvedDelta, ObjectId)`.
  `info` - object to populate with type and size.
Returns:
  the `info` object.
Throws:
  `IOException` - the database cannot reposition to this location.

#### readDatabase

    protected int readDatabase​(byte[] dst,
                               int pos,
                               int cnt)
                        throws IOException

Description copied from class: `PackParser`
Read from the database's current position into the buffer.

Specified by:
  `readDatabase` in class `PackParser`
Parameters:
  `dst` - the buffer to copy read data into.
  `pos` - position within `dst` to start copying data into.
  `cnt` - ideal target number of bytes to read. Actual read length may be shorter.
Returns:
  number of bytes stored.
Throws:
  `IOException` - the database cannot be accessed.

#### checkCRC

    protected boolean checkCRC​(int oldCRC)

Description copied from class: `PackParser`
Check the current CRC matches the expected value.

This method is invoked when an object is read back in from the database and its data is used during delta resolution. The CRC is validated after the object has been fully read, allowing the parser to verify there was no silent data corruption.

Implementations are free to ignore this check by always returning true if they are performing other data integrity validations at a lower level.

Specified by:
  `checkCRC` in class `PackParser`
Parameters:
  `oldCRC` - the prior CRC that was recorded during the first scan of the object from the pack stream.
Returns:
  true if the CRC matches; false if it does not.

#### onAppendBase

    protected boolean onAppendBase​(int typeCode,
                                   byte[] data,
                                   PackedObjectInfo info)
                            throws IOException

Description copied from class: `PackParser`
Provide the implementation with a base that was outside of the pack.

This event only occurs on a thin pack for base objects that were outside of the pack and came from the local repository. Usually an implementation uses this event to compress the base and append it onto the end of the pack, so the pack stays self-contained.

Specified by:
  `onAppendBase` in class `PackParser`
Parameters:
  `typeCode` - type of the base object.
  `data` - complete content of the base object.
  `info` - packed object information for this base. Implementors must populate the CRC and offset members if returning true.
Returns:
  true if the `info` should be included in the object list returned by `PackParser.getSortedObjectList(Comparator)`, false if it should not be included.
Throws:
  `IOException` - the base could not be included into the pack.

#### onEndThinPack

    protected void onEndThinPack()
                          throws IOException

Description copied from class: `PackParser`
Event indicating a thin pack has been completely processed.

This event is invoked only if a thin pack has delta references to objects external from the pack. The event is called after all of those deltas have been resolved.

Specified by:
  `onEndThinPack` in class `PackParser`
Throws:
  `IOException` - the pack cannot be archived.