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