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 * $Id: $
   12 *******************************************************************************/
   13package org.jacoco.report;
   14
   15import java.io.IOException;
   16import java.io.OutputStream;
   17import java.util.zip.ZipEntry;
   18import java.util.zip.ZipOutputStream;
   19
   20/**
   21 * Implementation of {@link IMultiReportOutput} that writes files into a
   22 * {@link ZipOutputStream}.
   23 * 
   24 * @author Marc R. Hoffmann
   25 * @version $Revision: $
   26 */
   27public class ZipMultiReportOutput implements IMultiReportOutput {
   28
   29    private final ZipOutputStream zip;
   30
   31    private OutputStream currentEntry;
   32
   33    /**
   34     * Creates a new instance based on the given {@link ZipOutputStream}.
   35     * 
   36     * @param zip
   37     *            stream to write file entries to
   38     */
   39    public ZipMultiReportOutput(final ZipOutputStream zip) {
   40        this.zip = zip;
   41    }
   42
   43    public OutputStream createFile(final String path) throws IOException {
   44        if (currentEntry != null) {
   45            currentEntry.close();
   46        }
   47        final ZipEntry entry = new ZipEntry(path);
   48        zip.putNextEntry(entry);
   49        currentEntry = new EntryOutput();
   50        return currentEntry;
   51    }
   52
   53    private final class EntryOutput extends OutputStream {
   54
   55        private boolean closed = false;
   56
   57        @Override
   58        public void write(final byte[] b, final int off, final int len)
   59                throws IOException {
   60            ensureNotClosed();
   61            zip.write(b, off, len);
   62        }
   63
   64        @Override
   65        public void write(final byte[] b) throws IOException {
   66            ensureNotClosed();
   67            zip.write(b);
   68        }
   69
   70        @Override
   71        public void write(final int b) throws IOException {
   72            ensureNotClosed();
   73            zip.write(b);
   74        }
   75
   76        @Override
   77        public void flush() throws IOException {
   78            ensureNotClosed();
   79            zip.flush();
   80        }
   81
   82        @Override
   83        public void close() throws IOException {
   84            if (!closed) {
   85                closed = true;
   86                zip.closeEntry();
   87            }
   88        }
   89
   90        private void ensureNotClosed() throws IOException {
   91            if (closed) {
   92                throw new IOException("Zip entry already closed.");
   93            }
   94        }
   95
   96    }
   97
   98}