// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPOutputStream; import java.util.zip.ZipOutputStream; import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream; import org.openstreetmap.josm.tools.Utils; /** * An enum representing the compression type of a resource. */ public enum Compression { /** * no compression */ NONE, /** * bzip2 compression */ BZIP2, /** * gzip compression */ GZIP, /** * zip compression */ ZIP; /** * Determines the compression type depending on the suffix of {@code name}. * @param name File name including extension * @return the compression type */ public static Compression byExtension(String name) { return name != null && name.endsWith(".gz") ? GZIP : name != null && (name.endsWith(".bz2") || name.endsWith(".bz")) ? BZIP2 : name != null && name.endsWith(".zip") ? ZIP : NONE; } /** * Determines the compression type based on the content type (MIME type). * @param contentType the content type * @return the compression type */ public static Compression forContentType(String contentType) { switch (contentType) { case "application/zip": return ZIP; case "application/x-gzip": return GZIP; case "application/x-bzip2": return BZIP2; default: return NONE; } } /** * Returns an un-compressing {@link InputStream} for {@code in}. * @param in raw input stream * @return un-compressing input stream * * @throws IOException if any I/O error occurs */ public InputStream getUncompressedInputStream(InputStream in) throws IOException { switch (this) { case BZIP2: return Utils.getBZip2InputStream(in); case GZIP: return Utils.getGZipInputStream(in); case ZIP: return Utils.getZipInputStream(in); case NONE: default: return in; } } /** * Returns an un-compressing {@link InputStream} for the {@link File} {@code file}. * @param file file * @return un-compressing input stream * @throws IOException if any I/O error occurs */ public static InputStream getUncompressedFileInputStream(File file) throws IOException { FileInputStream in = new FileInputStream(file); try { return byExtension(file.getName()).getUncompressedInputStream(in); } catch (IOException e) { Utils.close(in); throw e; } } /** * Returns a compressing {@link OutputStream} for {@code out}. * @param out raw output stream * @return compressing output stream * * @throws IOException if any I/O error occurs */ public OutputStream getCompressedOutputStream(OutputStream out) throws IOException { switch (this) { case BZIP2: return new BZip2CompressorOutputStream(out); case GZIP: return new GZIPOutputStream(out); case ZIP: return new ZipOutputStream(out, StandardCharsets.UTF_8); case NONE: default: return out; } } /** * Returns a compressing {@link OutputStream} for the {@link File} {@code file}. * @param file file * @return compressing output stream * * @throws IOException if any I/O error occurs */ public static OutputStream getCompressedFileOutputStream(File file) throws IOException { FileOutputStream out = new FileOutputStream(file); try { return byExtension(file.getName()).getCompressedOutputStream(out); } catch (IOException e) { Utils.close(out); throw e; } } }