2 * Copyright 2012 Kamran Zafar
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 package org.kamranzafar.jtar;
21 import java.util.Date;
24 * @author Kamran Zafar
27 public class TarEntry {
29 protected TarHeader header;
33 header = new TarHeader();
36 public TarEntry(File file, String entryName) {
39 this.extractTarHeader(entryName);
42 public TarEntry(byte[] headerBuf) {
44 this.parseTarHeader(headerBuf);
48 * Constructor to create an entry from an existing TarHeader object.
50 * This method is useful to add new entries programmatically (e.g. for
51 * adding files or directories that do not exist in the file system).
56 public TarEntry(TarHeader header) {
62 public boolean equals(Object it) {
63 if (!(it instanceof TarEntry)) {
66 return header.name.toString().equals(
67 ((TarEntry) it).header.name.toString());
71 public int hashCode() {
72 return header.name.hashCode();
75 public boolean isDescendent(TarEntry desc) {
76 return desc.header.name.toString().startsWith(header.name.toString());
79 public TarHeader getHeader() {
83 public String getName() {
84 String name = header.name.toString();
85 if (header.namePrefix != null
86 && !header.namePrefix.toString().equals("")) {
87 name = header.namePrefix.toString() + "/" + name;
93 public void setName(String name) {
94 header.name = new StringBuffer(name);
97 public int getUserId() {
101 public void setUserId(int userId) {
102 header.userId = userId;
105 public int getGroupId() {
106 return header.groupId;
109 public void setGroupId(int groupId) {
110 header.groupId = groupId;
113 public String getUserName() {
114 return header.userName.toString();
117 public void setUserName(String userName) {
118 header.userName = new StringBuffer(userName);
121 public String getGroupName() {
122 return header.groupName.toString();
125 public void setGroupName(String groupName) {
126 header.groupName = new StringBuffer(groupName);
129 public void setIds(int userId, int groupId) {
130 this.setUserId(userId);
131 this.setGroupId(groupId);
134 public void setModTime(long time) {
135 header.modTime = time / 1000;
138 public void setModTime(Date time) {
139 header.modTime = time.getTime() / 1000;
142 public Date getModTime() {
143 return new Date(header.modTime * 1000);
146 public File getFile() {
150 public long getSize() {
154 public void setSize(long size) {
159 * Checks if the org.kamrazafar.jtar entry is a directory
163 public boolean isDirectory() {
164 if (this.file != null) {
165 return this.file.isDirectory();
168 if (header != null) {
169 if (header.linkFlag == TarHeader.LF_DIR) {
173 if (header.name.toString().endsWith("/")) {
182 * Extract header from File
186 public void extractTarHeader(String entryName) {
187 header = TarHeader.createHeader(entryName, file.length(),
188 file.lastModified() / 1000, file.isDirectory());
197 public long computeCheckSum(byte[] buf) {
200 for (int i = 0; i < buf.length; ++i) {
208 * Writes the header to the byte buffer
212 public void writeEntryHeader(byte[] outbuf) {
215 offset = TarHeader.getNameBytes(header.name, outbuf, offset,
217 offset = Octal.getOctalBytes(header.mode, outbuf, offset,
219 offset = Octal.getOctalBytes(header.userId, outbuf, offset,
221 offset = Octal.getOctalBytes(header.groupId, outbuf, offset,
224 long size = header.size;
226 offset = Octal.getLongOctalBytes(size, outbuf, offset,
228 offset = Octal.getLongOctalBytes(header.modTime, outbuf, offset,
229 TarHeader.MODTIMELEN);
231 int csOffset = offset;
232 for (int c = 0; c < TarHeader.CHKSUMLEN; ++c) {
233 outbuf[offset++] = (byte) ' ';
236 outbuf[offset++] = header.linkFlag;
238 offset = TarHeader.getNameBytes(header.linkName, outbuf, offset,
240 offset = TarHeader.getNameBytes(header.magic, outbuf, offset,
241 TarHeader.USTAR_MAGICLEN);
242 offset = TarHeader.getNameBytes(header.userName, outbuf, offset,
243 TarHeader.USTAR_USER_NAMELEN);
244 offset = TarHeader.getNameBytes(header.groupName, outbuf, offset,
245 TarHeader.USTAR_GROUP_NAMELEN);
246 offset = Octal.getOctalBytes(header.devMajor, outbuf, offset,
247 TarHeader.USTAR_DEVLEN);
248 offset = Octal.getOctalBytes(header.devMinor, outbuf, offset,
249 TarHeader.USTAR_DEVLEN);
250 offset = TarHeader.getNameBytes(header.namePrefix, outbuf, offset,
251 TarHeader.USTAR_FILENAME_PREFIX);
253 for (; offset < outbuf.length;) {
254 outbuf[offset++] = 0;
257 long checkSum = this.computeCheckSum(outbuf);
259 Octal.getCheckSumOctalBytes(checkSum, outbuf, csOffset,
260 TarHeader.CHKSUMLEN);
264 * Parses the tar header to the byte buffer
269 public void parseTarHeader(byte[] bh) {
272 header.name = TarHeader.parseName(bh, offset, TarHeader.NAMELEN);
273 offset += TarHeader.NAMELEN;
275 header.mode = (int) Octal.parseOctal(bh, offset, TarHeader.MODELEN);
276 offset += TarHeader.MODELEN;
278 header.userId = (int) Octal.parseOctal(bh, offset, TarHeader.UIDLEN);
279 offset += TarHeader.UIDLEN;
281 header.groupId = (int) Octal.parseOctal(bh, offset, TarHeader.GIDLEN);
282 offset += TarHeader.GIDLEN;
284 header.size = Octal.parseOctal(bh, offset, TarHeader.SIZELEN);
285 offset += TarHeader.SIZELEN;
287 header.modTime = Octal.parseOctal(bh, offset, TarHeader.MODTIMELEN);
288 offset += TarHeader.MODTIMELEN;
290 header.checkSum = (int) Octal.parseOctal(bh, offset,
291 TarHeader.CHKSUMLEN);
292 offset += TarHeader.CHKSUMLEN;
294 header.linkFlag = bh[offset++];
296 header.linkName = TarHeader.parseName(bh, offset, TarHeader.NAMELEN);
297 offset += TarHeader.NAMELEN;
299 header.magic = TarHeader
300 .parseName(bh, offset, TarHeader.USTAR_MAGICLEN);
301 offset += TarHeader.USTAR_MAGICLEN;
303 header.userName = TarHeader.parseName(bh, offset,
304 TarHeader.USTAR_USER_NAMELEN);
305 offset += TarHeader.USTAR_USER_NAMELEN;
307 header.groupName = TarHeader.parseName(bh, offset,
308 TarHeader.USTAR_GROUP_NAMELEN);
309 offset += TarHeader.USTAR_GROUP_NAMELEN;
311 header.devMajor = (int) Octal.parseOctal(bh, offset,
312 TarHeader.USTAR_DEVLEN);
313 offset += TarHeader.USTAR_DEVLEN;
315 header.devMinor = (int) Octal.parseOctal(bh, offset,
316 TarHeader.USTAR_DEVLEN);
317 offset += TarHeader.USTAR_DEVLEN;
319 header.namePrefix = TarHeader.parseName(bh, offset,
320 TarHeader.USTAR_FILENAME_PREFIX);