All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itextpdf.kernel.utils.MemoryFirstPdfWriter Maven / Gradle / Ivy

There is a newer version: 9.0.0
Show newest version
/*
    This file is part of the iText (R) project.
    Copyright (c) 1998-2024 Apryse Group NV
    Authors: Apryse Software.

    This program is offered under a commercial and under the AGPL license.
    For commercial licensing, contact us at https://itextpdf.com/sales.  For AGPL licensing, see below.

    AGPL licensing:
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see .
 */
package com.itextpdf.kernel.utils;

import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.WriterProperties;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * PdfWriter implementation which allows to create documents in memory and dump them on disk on purpose.
 * Currently it's private and used in automated tests only.
 */
class MemoryFirstPdfWriter extends PdfWriter {
    private static final int MAX_ALLOWED_STREAMS = 100;

    private static Map waitingStreams = new ConcurrentHashMap<>();

    private String filePath;
    private ByteArrayOutputStream outStream;

    MemoryFirstPdfWriter(String filename, WriterProperties properties) throws FileNotFoundException {
        this(filename, MemoryFirstPdfWriter.createBAOutputStream(), properties);
    }

    private MemoryFirstPdfWriter(String filename, ByteArrayOutputStream outputStream, WriterProperties properties) {
        super(outputStream, properties);
        setCloseStream(false);

        filePath = filename;
        outStream = outputStream;
        if (MemoryFirstPdfWriter.waitingStreams.size() >= MAX_ALLOWED_STREAMS) {
            throw new RuntimeException("Too many PdfWriter's have been created. Verify that you call"
                    + " CompareTool.cleanup where necessary");
        }

        MemoryFirstPdfWriter.waitingStreams.put(filename, this);
    }

    static MemoryFirstPdfWriter get(String filename) {
        return MemoryFirstPdfWriter.waitingStreams.get(filename);
    }

    static void cleanup(String path) {
        if (path == null) {
            throw new IllegalArgumentException("Provided path is null");
        }

        for (String filePath : MemoryFirstPdfWriter.waitingStreams.keySet()) {
            if (filePath.startsWith(path)) {
                MemoryFirstPdfWriter.waitingStreams.remove(filePath);
            }
        }
    }

    void dump() throws IOException {
        FileOutputStream fos = new FileOutputStream(filePath);
        outStream.writeTo(fos);
        fos.close();
    }

    ByteArrayOutputStream getBAOutputStream() {
        return outStream;
    }

    private static ByteArrayOutputStream createBAOutputStream() {
        return new ByteArrayOutputStream();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy