001    /*
002     * Cobertura - http://cobertura.sourceforge.net/
003     *
004     * Copyright (C) 2006 John Lewis
005     * Copyright (C) 2006 Mark Doliner
006     *
007     * Note: This file is dual licensed under the GPL and the Apache
008     * Source License (so that it can be used from both the main
009     * Cobertura classes and the ant tasks).
010     *
011     * Cobertura is free software; you can redistribute it and/or modify
012     * it under the terms of the GNU General Public License as published
013     * by the Free Software Foundation; either version 2 of the License,
014     * or (at your option) any later version.
015     *
016     * Cobertura is distributed in the hope that it will be useful, but
017     * WITHOUT ANY WARRANTY; without even the implied warranty of
018     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019     * General Public License for more details.
020     *
021     * You should have received a copy of the GNU General Public License
022     * along with Cobertura; if not, write to the Free Software
023     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
024     * USA
025     */
026    
027    package net.sourceforge.cobertura.instrument;
028    
029    import java.io.ByteArrayInputStream;
030    import java.io.InputStream;
031    
032    /**
033     * This class represents an archive within an archive.
034     * 
035     * @author John Lewis
036     */
037    class Archive
038    {
039    
040            private byte[] bytes;
041            private boolean modified;
042            private CoberturaFile file;
043    
044            /**
045             * Create an object that holds a buffer to an archive that is within a parent archive.
046             * 
047             * @param file The parent archive on the hard drive that holds the child archive.
048             * @param bytes The contents of the child archive.
049             */
050            Archive(CoberturaFile file, byte[] bytes)
051            {
052                    this.bytes = bytes;
053                    this.file = file;
054            }
055    
056            /**
057             * Return an input stream for the contents of this archive (the child).
058             * 
059             * @return An InputStream for the contents.
060             */
061            InputStream getInputStream()
062            {
063                    return new ByteArrayInputStream(this.bytes);
064            }
065    
066            /**
067             * Set this archive's bytes after they have been modified via instrumentation.
068             * 
069             * @param bytes The new contents of the archive (instrumented).
070             */
071            void setModifiedBytes(byte[] bytes)
072            {
073                    this.bytes = bytes;
074                    this.modified = true;
075            }
076    
077            /**
078             * Return true if this archive has been modified (instrumented).
079             * 
080             * @return true if modified.
081             */
082            boolean isModified()
083            {
084                    return modified;
085            }
086    
087            /**
088             * Return the contents of this archive.
089             * 
090             * @return A byte array with the contents of this archive.
091             */
092            byte[] getBytes()
093            {
094                    return this.bytes;
095            }
096    
097            /**
098             * Returns the parent archive that contains this archive.
099             * 
100             * @return A CoberturaFile representing the parent archive.
101             */
102            CoberturaFile getCoberturaFile()
103            {
104                    return this.file;
105            }
106    }