CompressionService.java

package io.mersel.dss.signer.api.services.util;

import io.mersel.dss.signer.api.exceptions.SignatureException;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * Sıkıştırma işlemleri (ZIP) için servis.
 */
@Service
public class CompressionService {

    /**
     * Byte dizisini belirtilen girdi adıyla ZIP formatında sıkıştırır.
     * 
     * @param filename ZIP dosyasındaki girdi adı
     * @param content Sıkıştırılacak içerik
     * @return Sıkıştırılmış ZIP byte'ları
     */
    public byte[] zipBytes(String filename, byte[] content) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ZipOutputStream zos = new ZipOutputStream(baos);
            ZipEntry entry = new ZipEntry(filename);
            entry.setSize(content.length);
            zos.putNextEntry(entry);
            zos.write(content);
            zos.closeEntry();
            zos.close();
            return baos.toByteArray();
        } catch (IOException e) {
            throw new SignatureException("İçerik sıkıştırılamadı", e);
        }
    }

    /**
     * ZIP input stream'den ilk girdiyi çıkarır.
     * 
     * @param inputStream ZIP input stream
     * @return Sıkıştırılmamış içerik
     */
    public byte[] unzipFirstEntry(InputStream inputStream) {
        try (ZipInputStream zipInputStream = new ZipInputStream(
                inputStream,
                StandardCharsets.ISO_8859_1
        )) {
            ZipEntry entry = zipInputStream.getNextEntry();
            if (entry != null) {
                return IOUtils.toByteArray(zipInputStream);
            }
            throw new SignatureException("ZIP arşivi girdi içermiyor");
        } catch (IOException e) {
            throw new SignatureException("ZIP içeriği çıkarılamadı", e);
        }
    }
}