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);
}
}