diff options
Diffstat (limited to 'src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java')
-rw-r--r-- | src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java new file mode 100644 index 000000000..f17e70f13 --- /dev/null +++ b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java @@ -0,0 +1,336 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.commons.compress.archivers.dump; + +import java.io.IOException; +import java.util.Date; + +import org.apache.commons.compress.archivers.zip.ZipEncoding; + +/** + * This class represents identifying information about a Dump archive volume. + * It consists the archive's dump date, label, hostname, device name and possibly + * last mount point plus the volume's volume id andfirst record number. + * + * For the corresponding C structure see the header of {@link DumpArchiveEntry}. + */ +public class DumpArchiveSummary { + private long dumpDate; + private long previousDumpDate; + private int volume; + private String label; + private int level; + private String filesys; + private String devname; + private String hostname; + private int flags; + private int firstrec; + private int ntrec; + + DumpArchiveSummary(final byte[] buffer, final ZipEncoding encoding) throws IOException { + dumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 4); + previousDumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 8); + volume = DumpArchiveUtil.convert32(buffer, 12); + label = DumpArchiveUtil.decode(encoding, buffer, 676, DumpArchiveConstants.LBLSIZE).trim(); + level = DumpArchiveUtil.convert32(buffer, 692); + filesys = DumpArchiveUtil.decode(encoding, buffer, 696, DumpArchiveConstants.NAMELEN).trim(); + devname = DumpArchiveUtil.decode(encoding, buffer, 760, DumpArchiveConstants.NAMELEN).trim(); + hostname = DumpArchiveUtil.decode(encoding, buffer, 824, DumpArchiveConstants.NAMELEN).trim(); + flags = DumpArchiveUtil.convert32(buffer, 888); + firstrec = DumpArchiveUtil.convert32(buffer, 892); + ntrec = DumpArchiveUtil.convert32(buffer, 896); + + //extAttributes = DumpArchiveUtil.convert32(buffer, 900); + } + + /** + * Get the date of this dump. + * @return the date of this dump. + */ + public Date getDumpDate() { + return new Date(dumpDate); + } + + /** + * Set dump date. + * @param dumpDate the dump date + */ + public void setDumpDate(final Date dumpDate) { + this.dumpDate = dumpDate.getTime(); + } + + /** + * Get the date of the previous dump at this level higher. + * @return dumpdate may be null + */ + public Date getPreviousDumpDate() { + return new Date(previousDumpDate); + } + + /** + * Set previous dump date. + * @param previousDumpDate the previous dump dat + */ + public void setPreviousDumpDate(final Date previousDumpDate) { + this.previousDumpDate = previousDumpDate.getTime(); + } + + /** + * Get volume (tape) number. + * @return volume (tape) number. + */ + public int getVolume() { + return volume; + } + + /** + * Set volume (tape) number. + * @param volume the volume number + */ + public void setVolume(final int volume) { + this.volume = volume; + } + + /** + * Get 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' 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 backups. + * @return dump level + */ + public int getLevel() { + return level; + } + + /** + * Set level. + * @param level the level + */ + public void setLevel(final int level) { + this.level = level; + } + + /** + * Get dump label. This may be autogenerated or it may be specified + * bu the user. + * @return dump label + */ + public String getLabel() { + return label; + } + + /** + * Set dump label. + * @param label the label + */ + public void setLabel(final String label) { + this.label = label; + } + + /** + * Get the last mountpoint, e.g., /home. + * @return last mountpoint + */ + public String getFilesystem() { + return filesys; + } + + /** + * Set the last mountpoint. + * @param filesystem the last mountpoint + */ + public void setFilesystem(final String filesystem) { + this.filesys = filesystem; + } + + /** + * Get the device name, e.g., /dev/sda3 or /dev/mapper/vg0-home. + * @return device name + */ + public String getDevname() { + return devname; + } + + /** + * Set the device name. + * @param devname the device name + */ + public void setDevname(final String devname) { + this.devname = devname; + } + + /** + * Get the hostname of the system where the dump was performed. + * @return hostname the host name + */ + public String getHostname() { + return hostname; + } + + /** + * Set the hostname. + * @param hostname the host name + */ + public void setHostname(final String hostname) { + this.hostname = hostname; + } + + /** + * Get the miscellaneous flags. See below. + * @return flags + */ + public int getFlags() { + return flags; + } + + /** + * Set the miscellaneous flags. + * @param flags flags + */ + public void setFlags(final int flags) { + this.flags = flags; + } + + /** + * Get the inode of the first record on this volume. + * @return inode of the first record on this volume. + */ + public int getFirstRecord() { + return firstrec; + } + + /** + * Set the inode of the first record. + * @param firstrec the first record + */ + public void setFirstRecord(final int firstrec) { + this.firstrec = firstrec; + } + + /** + * Get the number of records per tape block. This is typically + * between 10 and 32. + * @return the number of records per tape block + */ + public int getNTRec() { + return ntrec; + } + + /** + * Set the number of records per tape block. + * @param ntrec the number of records per tape block + */ + public void setNTRec(final int ntrec) { + this.ntrec = ntrec; + } + + /** + * Is this the new header format? (We do not currently support the + * old format.) + * + * @return true if using new header format + */ + public boolean isNewHeader() { + return (flags & 0x0001) == 0x0001; + } + + /** + * Is this the new inode format? (We do not currently support the + * old format.) + * @return true if using new inode format + */ + public boolean isNewInode() { + return (flags & 0x0002) == 0x0002; + } + + /** + * Is this volume compressed? N.B., individual blocks may or may not be compressed. + * The first block is never compressed. + * @return true if volume is compressed + */ + public boolean isCompressed() { + return (flags & 0x0080) == 0x0080; + } + + /** + * Does this volume only contain metadata? + * @return true if volume only contains meta-data + */ + public boolean isMetaDataOnly() { + return (flags & 0x0100) == 0x0100; + } + + /** + * Does this volume cotain extended attributes. + * @return true if volume cotains extended attributes. + */ + public boolean isExtendedAttributes() { + return (flags & 0x8000) == 0x8000; + } + + @Override + public int hashCode() { + int hash = 17; + + if (label != null) { + hash = label.hashCode(); + } + + hash += 31 * dumpDate; + + if (hostname != null) { + hash = (31 * hostname.hashCode()) + 17; + } + + if (devname != null) { + hash = (31 * devname.hashCode()) + 17; + } + + return hash; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || !o.getClass().equals(getClass())) { + return false; + } + + final DumpArchiveSummary rhs = (DumpArchiveSummary) o; + + if (dumpDate != rhs.dumpDate) { + return false; + } + + if ((getHostname() == null) || + !getHostname().equals(rhs.getHostname())) { + return false; + } + + if ((getDevname() == null) || !getDevname().equals(rhs.getDevname())) { + return false; + } + + return true; + } +} |