StreamStamper.java

package pro.verron.officestamper.api;

import org.docx4j.openpackaging.packages.OpcPackage;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.function.Function;

/// This class implements the functionality of an OfficeStamper meant for dealing with streams of data. It delegates the executing
/// of the stamp operation to an OfficeStamper instance while providing the necessary mechanisms to work with streams.
///
/// @param <T> The type of the template that can be stamped. This type must extend OpcPackage.
/// @author Joseph Verron
/// @version ${version}
/// @since 1.6.4
public class StreamStamper<T extends OpcPackage> {
    /// Holds a reference to a function that takes in an InputStream and produces an instance of type T.
    private final Function<InputStream, T> loader;
    /// Holds a reference to an OfficeStamper used to execute the stamp operation.
    private final OfficeStamper<T> stamper;

    /// Constructs a new StreamStamper with the provided loader and stamper.
    ///
    /// @param loader  A Function that takes in an InputStream and produces an instance of type T.
    /// @param stamper An OfficeStamper used to execute the stamp operation.
    public StreamStamper(
            Function<InputStream, T> loader,
            OfficeStamper<T> stamper
    ) {
        this.loader = loader;
        this.stamper = stamper;
    }

    /// Stamps the template present in the given InputStream with the context given
    /// and writes the result to the provided OutputStream.
    /// This method first uses the loader to load the template from the
    /// InputStream into a type T instance,
    /// then uses the stamper
    /// to perform the stamp operation using the template and context,
    /// writing the result out to the OutputStream.
    ///
    /// @param inputStream  template to stamp
    /// @param context      context to use for stamping
    /// @param outputStream output stream to write the result to
    /// @throws OfficeStamperException if the stamping fails for any reason
    public void stamp(
            InputStream inputStream,
            Object context,
            OutputStream outputStream
    ) throws OfficeStamperException {
        T mlPackage = loader.apply(inputStream);
        stamper.stamp(mlPackage, context, outputStream);
    }
}