Class ObjectInserter

  • All Implemented Interfaces:
    java.lang.AutoCloseable
    Direct Known Subclasses:
    DfsInserter, ObjectDirectoryInserter, ObjectInserter.Filter, ObjectInserter.Formatter, PackInserter

    public abstract class ObjectInserter
    extends java.lang.Object
    implements java.lang.AutoCloseable
    Inserts objects into an existing ObjectDatabase.

    An inserter is not thread-safe. Individual threads should each obtain their own unique inserter instance, or must arrange for locking at a higher level to ensure the inserter is in use by no more than one thread at a time.

    Objects written by an inserter may not be immediately visible for reading after the insert method completes. Callers must invoke either close() or flush() prior to updating references or otherwise making the returned ObjectIds visible to other code.

    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      static class  ObjectInserter.Filter
      Wraps a delegate ObjectInserter.
      static class  ObjectInserter.Formatter
      An inserter that can be used for formatting and id generation only.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private SHA1 hasher  
      private byte[] tempBuffer
      Temporary working buffer for streaming data through.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected ObjectInserter()
      Create a new inserter for a database.
    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      protected byte[] buffer()
      Obtain a temporary buffer for use by the ObjectInserter or its subclass.
      abstract void close()
      protected SHA1 digest()
      Compute digest to help compute an ObjectId
      abstract void flush()
      Make all inserted objects visible.
      ObjectId idFor​(int type, byte[] data)
      Compute the name of an object, without inserting it.
      ObjectId idFor​(int type, byte[] data, int off, int len)
      Compute the name of an object, without inserting it.
      ObjectId idFor​(int objectType, long length, java.io.InputStream in)
      Compute the name of an object, without inserting it.
      ObjectId idFor​(TreeFormatter formatter)
      Compute the ObjectId for the given tree without inserting it.
      ObjectId insert​(int type, byte[] data)
      Insert a single object into the store, returning its unique name.
      ObjectId insert​(int type, byte[] data, int off, int len)
      Insert a single object into the store, returning its unique name.
      abstract ObjectId insert​(int objectType, long length, java.io.InputStream in)
      Insert a single object into the store, returning its unique name.
      ObjectId insert​(CommitBuilder builder)
      Insert a single commit into the store, returning its unique name.
      ObjectId insert​(TagBuilder builder)
      Insert a single annotated tag into the store, returning its unique name.
      ObjectId insert​(TreeFormatter formatter)
      Insert a single tree into the store, returning its unique name.
      abstract PackParser newPackParser​(java.io.InputStream in)
      Initialize a parser to read from a pack formatted stream.
      abstract ObjectReader newReader()
      Open a reader for objects that may have been written by this inserter.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • hasher

        private final SHA1 hasher
      • tempBuffer

        private byte[] tempBuffer
        Temporary working buffer for streaming data through.
    • Constructor Detail

      • ObjectInserter

        protected ObjectInserter()
        Create a new inserter for a database.
    • Method Detail

      • buffer

        protected byte[] buffer()
        Obtain a temporary buffer for use by the ObjectInserter or its subclass.

        This buffer is supplied by the ObjectInserter base class to itself and its subclasses for the purposes of pulling data from a supplied InputStream, passing it through a Deflater, or formatting the canonical format of a small object like a small tree or commit.

        This buffer IS NOT for translation such as auto-CRLF or content filtering and must not be used for such purposes.

        The returned buffer is small, around a few KiBs, and the size may change between versions of JGit. Callers using this buffer must always check the length of the returned array to ascertain how much space was provided.

        There is a single buffer for each ObjectInserter, repeated calls to this method will (usually) always return the same buffer. If the caller needs more than one buffer, or needs a buffer of a larger size, it must manage that buffer on its own.

        The buffer is usually on first demand for a buffer.

        Returns:
        a temporary byte array for use by the caller.
      • digest

        protected SHA1 digest()
        Compute digest to help compute an ObjectId
        Returns:
        digest to help compute an ObjectId
        Since:
        4.7
      • idFor

        public ObjectId idFor​(int type,
                              byte[] data)
        Compute the name of an object, without inserting it.
        Parameters:
        type - type code of the object to store.
        data - complete content of the object.
        Returns:
        the name of the object.
      • idFor

        public ObjectId idFor​(int type,
                              byte[] data,
                              int off,
                              int len)
        Compute the name of an object, without inserting it.
        Parameters:
        type - type code of the object to store.
        data - complete content of the object.
        off - first position within data.
        len - number of bytes to copy from data.
        Returns:
        the name of the object.
      • idFor

        public ObjectId idFor​(int objectType,
                              long length,
                              java.io.InputStream in)
                       throws java.io.IOException
        Compute the name of an object, without inserting it.
        Parameters:
        objectType - type code of the object to store.
        length - number of bytes to scan from in.
        in - stream providing the object content. The caller is responsible for closing the stream.
        Returns:
        the name of the object.
        Throws:
        java.io.IOException - the source stream could not be read.
      • idFor

        public ObjectId idFor​(TreeFormatter formatter)
        Compute the ObjectId for the given tree without inserting it.
        Parameters:
        formatter - a TreeFormatter object.
        Returns:
        the computed ObjectId
      • insert

        public final ObjectId insert​(TreeFormatter formatter)
                              throws java.io.IOException
        Insert a single tree into the store, returning its unique name.
        Parameters:
        formatter - the formatter containing the proposed tree's data.
        Returns:
        the name of the tree object.
        Throws:
        java.io.IOException - the object could not be stored.
      • insert

        public final ObjectId insert​(CommitBuilder builder)
                              throws java.io.IOException
        Insert a single commit into the store, returning its unique name.
        Parameters:
        builder - the builder containing the proposed commit's data.
        Returns:
        the name of the commit object.
        Throws:
        java.io.IOException - the object could not be stored.
      • insert

        public final ObjectId insert​(TagBuilder builder)
                              throws java.io.IOException
        Insert a single annotated tag into the store, returning its unique name.
        Parameters:
        builder - the builder containing the proposed tag's data.
        Returns:
        the name of the tag object.
        Throws:
        java.io.IOException - the object could not be stored.
      • insert

        public ObjectId insert​(int type,
                               byte[] data)
                        throws java.io.IOException
        Insert a single object into the store, returning its unique name.
        Parameters:
        type - type code of the object to store.
        data - complete content of the object.
        Returns:
        the name of the object.
        Throws:
        java.io.IOException - the object could not be stored.
      • insert

        public ObjectId insert​(int type,
                               byte[] data,
                               int off,
                               int len)
                        throws java.io.IOException
        Insert a single object into the store, returning its unique name.
        Parameters:
        type - type code of the object to store.
        data - complete content of the object.
        off - first position within data.
        len - number of bytes to copy from data.
        Returns:
        the name of the object.
        Throws:
        java.io.IOException - the object could not be stored.
      • insert

        public abstract ObjectId insert​(int objectType,
                                        long length,
                                        java.io.InputStream in)
                                 throws java.io.IOException
        Insert a single object into the store, returning its unique name.
        Parameters:
        objectType - type code of the object to store.
        length - number of bytes to copy from in.
        in - stream providing the object content. The caller is responsible for closing the stream.
        Returns:
        the name of the object.
        Throws:
        java.io.IOException - the object could not be stored, or the source stream could not be read.
      • newPackParser

        public abstract PackParser newPackParser​(java.io.InputStream in)
                                          throws java.io.IOException
        Initialize a parser to read from a pack formatted stream.
        Parameters:
        in - the input stream. The stream is not closed by the parser, and must instead be closed by the caller once parsing is complete.
        Returns:
        the pack parser.
        Throws:
        java.io.IOException - the parser instance, which can be configured and then used to parse objects into the ObjectDatabase.
      • newReader

        public abstract ObjectReader newReader()
        Open a reader for objects that may have been written by this inserter.

        The returned reader allows the calling thread to read back recently inserted objects without first calling flush() to make them visible to the repository. The returned reader should only be used from the same thread as the inserter. Objects written by this inserter may not be visible to this.newReader().newReader().

        The returned reader should return this inserter instance from ObjectReader.getCreatedFromInserter().

        Behavior is undefined if an insert method is called on the inserter in the middle of reading from an ObjectStream opened from this reader. For example, reading the remainder of the object may fail, or newly written data may even be corrupted. Interleaving whole object reads (including streaming reads) with inserts is fine, just not interleaving streaming partial object reads with inserts.

        Returns:
        reader for any object, including an object recently inserted by this inserter since the last flush.
        Since:
        3.5
      • flush

        public abstract void flush()
                            throws java.io.IOException
        Make all inserted objects visible.

        The flush may take some period of time to make the objects available to other threads.

        Throws:
        java.io.IOException - the flush could not be completed; objects inserted thus far are in an indeterminate state.
      • close

        public abstract void close()

        Release any resources used by this inserter.

        An inserter that has been released can be used again, but may need to be released after the subsequent usage.

        Specified by:
        close in interface java.lang.AutoCloseable
        Since:
        4.0