aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveSummary.java
diff options
context:
space:
mode:
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.java336
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;
+ }
+}