    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. It consists the archive's dump date, label, hostname, device name and possibly
    029 * last mount point plus the volume's volume id and first record number.
    030 * <p>
    031 * For the corresponding C structure see the header of {@link DumpArchiveEntry}.
    032 * </p>
    033 */
    034public class DumpArchiveSummary {
    035
    036    private long dumpDate;
    037    private long previousDumpDate;
    038    private int volume;
    039    private String label;
    040    private int level;
    041    private String filesys;
    042    private String devname;
    043    private String hostname;
    044    private int flags;
    045    private int firstrec;
    046    private int ntrec;
    047
    048    DumpArchiveSummary(final byte[] buffer, final ZipEncoding encoding) throws IOException {
    049        dumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 4);
    050        previousDumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 8);
    051        volume = DumpArchiveUtil.convert32(buffer, 12);
    052        label = DumpArchiveUtil.decode(encoding, buffer, 676, DumpArchiveConstants.LBLSIZE).trim();
    053        level = DumpArchiveUtil.convert32(buffer, 692);
    054        filesys = DumpArchiveUtil.decode(encoding, buffer, 696, DumpArchiveConstants.NAMELEN).trim();
    055        devname = DumpArchiveUtil.decode(encoding, buffer, 760, DumpArchiveConstants.NAMELEN).trim();
    056        hostname = DumpArchiveUtil.decode(encoding, buffer, 824, DumpArchiveConstants.NAMELEN).trim();
    057        flags = DumpArchiveUtil.convert32(buffer, 888);
    058        firstrec = DumpArchiveUtil.convert32(buffer, 892);
    059        ntrec = DumpArchiveUtil.convert32(buffer, 896);
    060
    061        // extAttributes = DumpArchiveUtil.convert32(buffer, 900);
    062    }
    063
    064    @Override
    065    public boolean equals(final Object obj) {
    066        if (this == obj) {
    067            return true;
    068        }
    069        if (obj == null) {
    070            return false;
    071        }
    072        if (getClass() != obj.getClass()) {
    073            return false;
    074        }
    075        final DumpArchiveSummary other = (DumpArchiveSummary) obj;
    076        return Objects.equals(devname, other.devname) && dumpDate == other.dumpDate && Objects.equals(hostname, other.hostname);
    077    }
    078
    079    /**
    080     * Gets the device name, e.g., /dev/sda3 or /dev/mapper/vg0-home.
    081     *
    082     * @return device name
    083     */
    084    public String getDevname() {
    085        return devname;
    086    }
    087
    088    /**
    089     * Gets the date of this dump.
    090     *
    091     * @return the date of this dump.
    092     */
    093    public Date getDumpDate() {
    094        return new Date(dumpDate);
    095    }
    096
    097    /**
    098     * Gets the last mountpoint, e.g., /home.
    099     *
    100     * @return last mountpoint
    101     */
    102    public String getFilesystem() {
    103        return filesys;
    104    }
    105
    106    /**
    107     * Gets the inode of the first record on this volume.
    108     *
    109     * @return inode of the first record on this volume.
    110     */
    111    public int getFirstRecord() {
    112        return firstrec;
    113    }
    114
    115    /**
    116     * Gets the miscellaneous flags. See below.
    117     *
    118     * @return flags
    119     */
    120    public int getFlags() {
    121        return flags;
    122    }
    123
    124    /**
    125     * Gets the hostname of the system where the dump was performed.
    126     *
    127     * @return hostname the host name
    128     */
    129    public String getHostname() {
    130        return hostname;
    131    }
    132
    133    /**
    134     * Gets dump label. This may be autogenerated, or it may be specified by the user.
    135     *
    136     * @return dump label
    137     */
    138    public String getLabel() {
    139        return label;
    140    }
    141
    142    /**
    143     * Gets the level of this dump. This is a number between 0 and 9, inclusive, and a level 0 dump is a complete dump of the partition. For any other dump 'n'
    144     * this dump contains all files that have changed since the last dump at this level or lower. This is used to support different levels of incremental
    145     * backups.
    146     *
    147     * @return dump level
    148     */
    149    public int getLevel() {
    150        return level;
    151    }
    152
    153    /**
    154     * Gets the number of records per tape block. This is typically between 10 and 32.
    155     *
    156     * @return the number of records per tape block
    157     */
    158    public int getNTRec() {
    159        return ntrec;
    160    }
    161
    162    /**
    163     * Gets the date of the previous dump at this level higher.
    164     *
    165     * @return dumpdate may be null
    166     */
    167    public Date getPreviousDumpDate() {
    168        return new Date(previousDumpDate);
    169    }
    170
    171    /**
    172     * Gets volume (tape) number.
    173     *
    174     * @return volume (tape) number.
    175     */
    176    public int getVolume() {
    177        return volume;
    178    }
    179
    180    @Override
    181    public int hashCode() {
    182        return Objects.hash(devname, dumpDate, hostname);
    183    }
    184
    185    /**
    186     * Is this volume compressed? N.B., individual blocks may or may not be compressed. The first block is never compressed.
    187     *
    188     * @return true if volume is compressed
    189     */
    190    public boolean isCompressed() {
    191        return (flags & 0x0080) == 0x0080;
    192    }
    193
    194    /**
    195     * Does this volume contain extended attributes.
    196     *
    197     * @return true if volume contains extended attributes.
    198     */
    199    public boolean isExtendedAttributes() {
    200        return (flags & 0x8000) == 0x8000;
    201    }
    202
    203    /**
    204     * Does this volume only contain metadata?
    205     *
    206     * @return true if volume only contains meta-data
    207     */
    208    public boolean isMetaDataOnly() {
    209        return (flags & 0x0100) == 0x0100;
    210    }
    211
    212    /**
    213     * Is this the new header format? (We do not currently support the old format.)
    214     *
    215     * @return true if using new header format
    216     */
    217    public boolean isNewHeader() {
    218        return (flags & 0x0001) == 0x0001;
    219    }
    220
    221    /**
    222     * Is this the new inode format? (We do not currently support the old format.)
    223     *
    224     * @return true if using new inode format
    225     */
    226    public boolean isNewInode() {
    227        return (flags & 0x0002) == 0x0002;
    228    }
    229
    230    /**
    231     * Sets the device name.
    232     *
    233     * @param devname the device name
    234     */
    235    public void setDevname(final String devname) {
    236        this.devname = devname;
    237    }
    238
    239    /**
    240     * Sets dump date.
    241     *
    242     * @param dumpDate the dump date
    243     */
    244    public void setDumpDate(final Date dumpDate) {
    245        this.dumpDate = dumpDate.getTime();
    246    }
    247
    248    /**
    249     * Sets the last mountpoint.
    250     *
    251     * @param fileSystem the last mountpoint
    252     */
    253    public void setFilesystem(final String fileSystem) {
    254        this.filesys = fileSystem;
    255    }
    256
    257    /**
    258     * Sets the inode of the first record.
    259     *
    260     * @param firstrec the first record
    261     */
    262    public void setFirstRecord(final int firstrec) {
    263        this.firstrec = firstrec;
    264    }
    265
    266    /**
    267     * Sets the miscellaneous flags.
    268     *
    269     * @param flags flags
    270     */
    271    public void setFlags(final int flags) {
    272        this.flags = flags;
    273    }
    274
    275    /**
    276     * Sets the hostname.
    277     *
    278     * @param hostname the host name
    279     */
    280    public void setHostname(final String hostname) {
    281        this.hostname = hostname;
    282    }
    283
    284    /**
    285     * Sets dump label.
    286     *
    287     * @param label the label
    288     */
    289    public void setLabel(final String label) {
    290        this.label = label;
    291    }
    292
    293    /**
    294     * Sets level.
    295     *
    296     * @param level the level
    297     */
    298    public void setLevel(final int level) {
    299        this.level = level;
    300    }
    301
    302    /**
    303     * Sets the number of records per tape block.
    304     *
    305     * @param ntrec the number of records per tape block
    306     */
    307    public void setNTRec(final int ntrec) {
    308        this.ntrec = ntrec;
    309    }
    310
    311    /**
    312     * Sets previous dump date.
    313     *
    314     * @param previousDumpDate the previous dump dat
    315     */
    316    public void setPreviousDumpDate(final Date previousDumpDate) {
    317        this.previousDumpDate = previousDumpDate.getTime();
    318    }
    319
    320    /**
    321     * Sets volume (tape) number.
    322     *
    323     * @param volume the volume number
    324     */
    325    public void setVolume(final int volume) {
    326        this.volume = volume;
    327    }
    328}