    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 * http://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.archivers.dump;
    020
    021import java.io.IOException;
    022import java.util.Date;
    023import java.util.Objects;
    024
    025import org.apache.commons.compress.archivers.zip.ZipEncoding;
    026
    027/**
    028 * This class represents identifying information about a Dump archive volume.
    029 * It consists the archive's dump date, label, hostname, device name and possibly
    030 * last mount point plus the volume's volume id and first record number.
    031 * <p>
    032 * For the corresponding C structure see the header of {@link DumpArchiveEntry}.
    033 * </p>
    034 */
    035public class DumpArchiveSummary {
    036
    037    private long dumpDate;
    038    private long previousDumpDate;
    039    private int volume;
    040    private String label;
    041    private int level;
    042    private String filesys;
    043    private String devname;
    044    private String hostname;
    045    private int flags;
    046    private int firstrec;
    047    private int ntrec;
    048
    049    DumpArchiveSummary(final byte[] buffer, final ZipEncoding encoding) throws IOException {
    050        dumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 4);
    051        previousDumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 8);
    052        volume = DumpArchiveUtil.convert32(buffer, 12);
    053        label = DumpArchiveUtil.decode(encoding, buffer, 676, DumpArchiveConstants.LBLSIZE).trim();
    054        level = DumpArchiveUtil.convert32(buffer, 692);
    055        filesys = DumpArchiveUtil.decode(encoding, buffer, 696, DumpArchiveConstants.NAMELEN).trim();
    056        devname = DumpArchiveUtil.decode(encoding, buffer, 760, DumpArchiveConstants.NAMELEN).trim();
    057        hostname = DumpArchiveUtil.decode(encoding, buffer, 824, DumpArchiveConstants.NAMELEN).trim();
    058        flags = DumpArchiveUtil.convert32(buffer, 888);
    059        firstrec = DumpArchiveUtil.convert32(buffer, 892);
    060        ntrec = DumpArchiveUtil.convert32(buffer, 896);
    061
    062        //extAttributes = DumpArchiveUtil.convert32(buffer, 900);
    063    }
    064
    065    @Override
    066    public boolean equals(final Object obj) {
    067        if (this == obj) {
    068            return true;
    069        }
    070        if (obj == null) {
    071            return false;
    072        }
    073        if (getClass() != obj.getClass()) {
    074            return false;
    075        }
    076        final DumpArchiveSummary other = (DumpArchiveSummary) obj;
    077        return Objects.equals(devname, other.devname) && dumpDate == other.dumpDate && Objects.equals(hostname, other.hostname);
    078    }
    079
    080    /**
    081     * Gets the device name, e.g., /dev/sda3 or /dev/mapper/vg0-home.
    082     * @return device name
    083     */
    084    public String getDevname() {
    085        return devname;
    086    }
    087
    088    /**
    089     * Gets the date of this dump.
    090     * @return the date of this dump.
    091     */
    092    public Date getDumpDate() {
    093        return new Date(dumpDate);
    094    }
    095
    096    /**
    097     * Gets the last mountpoint, e.g., /home.
    098     * @return last mountpoint
    099     */
    100    public String getFilesystem() {
    101        return filesys;
    102    }
    103
    104    /**
    105     * Gets the inode of the first record on this volume.
    106     * @return inode of the first record on this volume.
    107     */
    108    public int getFirstRecord() {
    109        return firstrec;
    110    }
    111
    112    /**
    113     * Gets the miscellaneous flags. See below.
    114     * @return flags
    115     */
    116    public int getFlags() {
    117        return flags;
    118    }
    119
    120    /**
    121     * Gets the hostname of the system where the dump was performed.
    122     * @return hostname the host name
    123     */
    124    public String getHostname() {
    125        return hostname;
    126    }
    127
    128    /**
    129     * Gets dump label. This may be autogenerated, or it may be specified
    130     * by the user.
    131     * @return dump label
    132     */
    133    public String getLabel() {
    134        return label;
    135    }
    136
    137    /**
    138     * Gets the level of this dump. This is a number between 0 and 9, inclusive,
    139     * and a level 0 dump is a complete dump of the partition. For any other dump
    140     * 'n' this dump contains all files that have changed since the last dump
    141     * at this level or lower. This is used to support different levels of
    142     * incremental backups.
    143     * @return dump level
    144     */
    145    public int getLevel() {
    146        return level;
    147    }
    148
    149    /**
    150     * Gets the number of records per tape block. This is typically
    151     * between 10 and 32.
    152     * @return the number of records per tape block
    153     */
    154    public int getNTRec() {
    155        return ntrec;
    156    }
    157
    158    /**
    159     * Gets the date of the previous dump at this level higher.
    160     * @return dumpdate may be null
    161     */
    162    public Date getPreviousDumpDate() {
    163        return new Date(previousDumpDate);
    164    }
    165
    166    /**
    167     * Gets volume (tape) number.
    168     * @return volume (tape) number.
    169     */
    170    public int getVolume() {
    171        return volume;
    172    }
    173
    174    @Override
    175    public int hashCode() {
    176        return Objects.hash(devname, dumpDate, hostname);
    177    }
    178
    179    /**
    180     * Is this volume compressed? N.B., individual blocks may or may not be compressed.
    181     * The first block is never compressed.
    182     * @return true if volume is compressed
    183     */
    184    public boolean isCompressed() {
    185        return (flags & 0x0080) == 0x0080;
    186    }
    187
    188    /**
    189     * Does this volume contain extended attributes.
    190     * @return true if volume contains extended attributes.
    191     */
    192    public boolean isExtendedAttributes() {
    193        return (flags & 0x8000) == 0x8000;
    194    }
    195
    196    /**
    197     * Does this volume only contain metadata?
    198     * @return true if volume only contains meta-data
    199     */
    200    public boolean isMetaDataOnly() {
    201        return (flags & 0x0100) == 0x0100;
    202    }
    203
    204    /**
    205     * Is this the new header format? (We do not currently support the
    206     * old format.)
    207     *
    208     * @return true if using new header format
    209     */
    210    public boolean isNewHeader() {
    211        return (flags & 0x0001) == 0x0001;
    212    }
    213
    214    /**
    215     * Is this the new inode format? (We do not currently support the
    216     * old format.)
    217     * @return true if using new inode format
    218     */
    219    public boolean isNewInode() {
    220        return (flags & 0x0002) == 0x0002;
    221    }
    222
    223    /**
    224     * Sets the device name.
    225     * @param devname the device name
    226     */
    227    public void setDevname(final String devname) {
    228        this.devname = devname;
    229    }
    230
    231    /**
    232     * Sets dump date.
    233     * @param dumpDate the dump date
    234     */
    235    public void setDumpDate(final Date dumpDate) {
    236        this.dumpDate = dumpDate.getTime();
    237    }
    238
    239    /**
    240     * Sets the last mountpoint.
    241     * @param fileSystem the last mountpoint
    242     */
    243    public void setFilesystem(final String fileSystem) {
    244        this.filesys = fileSystem;
    245    }
    246
    247    /**
    248     * Sets the inode of the first record.
    249     * @param firstrec the first record
    250     */
    251    public void setFirstRecord(final int firstrec) {
    252        this.firstrec = firstrec;
    253    }
    254
    255    /**
    256     * Sets the miscellaneous flags.
    257     * @param flags flags
    258     */
    259    public void setFlags(final int flags) {
    260        this.flags = flags;
    261    }
    262
    263    /**
    264     * Sets the hostname.
    265     * @param hostname the host name
    266     */
    267    public void setHostname(final String hostname) {
    268        this.hostname = hostname;
    269    }
    270
    271    /**
    272     * Sets dump label.
    273     * @param label the label
    274     */
    275    public void setLabel(final String label) {
    276        this.label = label;
    277    }
    278
    279    /**
    280     * Sets level.
    281     * @param level the level
    282     */
    283    public void setLevel(final int level) {
    284        this.level = level;
    285    }
    286
    287    /**
    288     * Sets the number of records per tape block.
    289     * @param ntrec the number of records per tape block
    290     */
    291    public void setNTRec(final int ntrec) {
    292        this.ntrec = ntrec;
    293    }
    294
    295    /**
    296     * Sets previous dump date.
    297     * @param previousDumpDate the previous dump dat
    298     */
    299    public void setPreviousDumpDate(final Date previousDumpDate) {
    300        this.previousDumpDate = previousDumpDate.getTime();
    301    }
    302
    303    /**
    304     * Sets volume (tape) number.
    305     * @param volume the volume number
    306     */
    307    public void setVolume(final int volume) {
    308        this.volume = volume;
    309    }
    310}