ZipMultiReportOutput.java

    1/*******************************************************************************
    2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
    3 * All rights reserved. This program and the accompanying materials
    4 * are made available under the terms of the Eclipse Public License v1.0
    5 * which accompanies this distribution, and is available at
    6 * http://www.eclipse.org/legal/epl-v10.html
    7 *
    8 * Contributors:
    9 *    Marc R. Hoffmann - initial API and implementation
   10 *    
   11 *******************************************************************************/
   12package org.jacoco.report;
   13
   14import java.io.IOException;
   15import java.io.OutputStream;
   16import java.util.zip.ZipEntry;
   17import java.util.zip.ZipOutputStream;
   18
   19/**
   20 * Implementation of {@link IMultiReportOutput} that writes files into a
   21 * {@link ZipOutputStream}.
   22 * 
   23 * @author Marc R. Hoffmann
   24 * @version 0.4.1.20101007204400
   25 */
   26public class ZipMultiReportOutput implements IMultiReportOutput {
   27
   28    private final ZipOutputStream zip;
   29
   30    private OutputStream currentEntry;
   31
   32    /**
   33     * Creates a new instance based on the given {@link ZipOutputStream}.
   34     * 
   35     * @param zip
   36     *            stream to write file entries to
   37     */
   38    public ZipMultiReportOutput(final ZipOutputStream zip) {
   39        this.zip = zip;
   40    }
   41
   42    public OutputStream createFile(final String path) throws IOException {
   43        if (currentEntry != null) {
   44            currentEntry.close();
   45        }
   46        final ZipEntry entry = new ZipEntry(path);
   47        zip.putNextEntry(entry);
   48        currentEntry = new EntryOutput();
   49        return currentEntry;
   50    }
   51
   52    private final class EntryOutput extends OutputStream {
   53
   54        private boolean closed = false;
   55
   56        @Override
   57        public void write(final byte[] b, final int off, final int len)
   58                throws IOException {
   59            ensureNotClosed();
   60            zip.write(b, off, len);
   61        }
   62
   63        @Override
   64        public void write(final byte[] b) throws IOException {
   65            ensureNotClosed();
   66            zip.write(b);
   67        }
   68
   69        @Override
   70        public void write(final int b) throws IOException {
   71            ensureNotClosed();
   72            zip.write(b);
   73        }
   74
   75        @Override
   76        public void flush() throws IOException {
   77            ensureNotClosed();
   78            zip.flush();
   79        }
   80
   81        @Override
   82        public void close() throws IOException {
   83            if (!closed) {
   84                closed = true;
   85                zip.closeEntry();
   86            }
   87        }
   88
   89        private void ensureNotClosed() throws IOException {
   90            if (closed) {
   91                throw new IOException("Zip entry already closed.");
   92            }
   93        }
   94
   95    }
   96
   97}