FileDocCategorySizeDatePackage
TarEntry.javaAPI DocApache Ant 1.7018200Wed Dec 13 06:16:24 GMT 2006org.apache.tools.tar

TarEntry

public class TarEntry extends Object implements TarConstants
This class represents an entry in a Tar archive. It consists of the entry's header, as well as the entry's File. Entries can be instantiated in one of three ways, depending on how they are to be used.

TarEntries that are created from the header bytes read from an archive are instantiated with the TarEntry( byte[] ) constructor. These entries will be used when extracting from or listing the contents of an archive. These entries have their header filled in using the header bytes. They also set the File to null, since they reference an archive entry not a file.

TarEntries that are created from Files that are to be written into an archive are instantiated with the TarEntry( File ) constructor. These entries have their header filled in using the File's information. They also keep a reference to the File for convenience when writing entries.

Finally, TarEntries can be constructed from nothing but a name. This allows the programmer to construct the entry by hand, for instance when only an InputStream is available for writing to the archive, and the header information is constructed from other information. In this case the header fields are set to defaults and the File is set to null.

The C structure for a Tar Entry's header is:

struct header {
char name[NAMSIZ];
char mode[8];
char uid[8];
char gid[8];
char size[12];
char mtime[12];
char chksum[8];
char linkflag;
char linkname[NAMSIZ];
char magic[8];
char uname[TUNMLEN];
char gname[TGNMLEN];
char devmajor[8];
char devminor[8];
} header;

Fields Summary
private StringBuffer
name
The entry's name.
private int
mode
The entry's permission mode.
private int
userId
The entry's user id.
private int
groupId
The entry's group id.
private long
size
The entry's size.
private long
modTime
The entry's modification time.
private byte
linkFlag
The entry's link flag.
private StringBuffer
linkName
The entry's link name.
private StringBuffer
magic
The entry's magic tag.
private StringBuffer
userName
The entry's user name.
private StringBuffer
groupName
The entry's group name.
private int
devMajor
The entry's major device number.
private int
devMinor
The entry's minor device number.
private File
file
The entry's file reference
public static final int
MAX_NAMELEN
Maximum length of a user's name in the tar file
public static final int
DEFAULT_DIR_MODE
Default permissions bits for directories
public static final int
DEFAULT_FILE_MODE
Default permissions bits for files
public static final int
MILLIS_PER_SECOND
Convert millis to seconds
Constructors Summary
private TarEntry()
Construct an empty entry and prepares the header values.


                  
       
        this.magic = new StringBuffer(TMAGIC);
        this.name = new StringBuffer();
        this.linkName = new StringBuffer();

        String user = System.getProperty("user.name", "");

        if (user.length() > MAX_NAMELEN) {
            user = user.substring(0, MAX_NAMELEN);
        }

        this.userId = 0;
        this.groupId = 0;
        this.userName = new StringBuffer(user);
        this.groupName = new StringBuffer("");
        this.file = null;
    
public TarEntry(String name)
Construct an entry with only a name. This allows the programmer to construct the entry's header "by hand". File is set to null.

param
name the entry name

        this();

        boolean isDir = name.endsWith("/");

        this.devMajor = 0;
        this.devMinor = 0;
        this.name = new StringBuffer(name);
        this.mode = isDir ? DEFAULT_DIR_MODE : DEFAULT_FILE_MODE;
        this.linkFlag = isDir ? LF_DIR : LF_NORMAL;
        this.userId = 0;
        this.groupId = 0;
        this.size = 0;
        this.modTime = (new Date()).getTime() / MILLIS_PER_SECOND;
        this.linkName = new StringBuffer("");
        this.userName = new StringBuffer("");
        this.groupName = new StringBuffer("");
        this.devMajor = 0;
        this.devMinor = 0;

    
public TarEntry(String name, byte linkFlag)
Construct an entry with a name an a link flag.

param
name the entry name
param
linkFlag the entry link flag.

        this(name);
        this.linkFlag = linkFlag;
    
public TarEntry(File file)
Construct an entry for a file. File is set to file, and the header is constructed from information from the file.

param
file The file that the entry represents.

        this();

        this.file = file;

        String fileName = file.getPath();
        String osname = System.getProperty("os.name").toLowerCase(Locale.US);

        if (osname != null) {

            // Strip off drive letters!
            // REVIEW Would a better check be "(File.separator == '\')"?

            if (osname.startsWith("windows")) {
                if (fileName.length() > 2) {
                    char ch1 = fileName.charAt(0);
                    char ch2 = fileName.charAt(1);

                    if (ch2 == ':"
                            && ((ch1 >= 'a" && ch1 <= 'z")
                                || (ch1 >= 'A" && ch1 <= 'Z"))) {
                        fileName = fileName.substring(2);
                    }
                }
            } else if (osname.indexOf("netware") > -1) {
                int colon = fileName.indexOf(':");
                if (colon != -1) {
                    fileName = fileName.substring(colon + 1);
                }
            }
        }

        fileName = fileName.replace(File.separatorChar, '/");

        // No absolute pathnames
        // Windows (and Posix?) paths can start with "\\NetworkDrive\",
        // so we loop on starting /'s.
        while (fileName.startsWith("/")) {
            fileName = fileName.substring(1);
        }

        this.linkName = new StringBuffer("");
        this.name = new StringBuffer(fileName);

        if (file.isDirectory()) {
            this.mode = DEFAULT_DIR_MODE;
            this.linkFlag = LF_DIR;

            if (this.name.charAt(this.name.length() - 1) != '/") {
                this.name.append("/");
            }
        } else {
            this.mode = DEFAULT_FILE_MODE;
            this.linkFlag = LF_NORMAL;
        }

        this.size = file.length();
        this.modTime = file.lastModified() / MILLIS_PER_SECOND;
        this.devMajor = 0;
        this.devMinor = 0;
    
public TarEntry(byte[] headerBuf)
Construct an entry from an archive's header bytes. File is set to null.

param
headerBuf The header bytes from a tar archive entry.

        this();
        this.parseTarHeader(headerBuf);
    
Methods Summary
public booleanequals(org.apache.tools.tar.TarEntry it)
Determine if the two entries are equal. Equality is determined by the header names being equal.

param
it Entry to be checked for equality.
return
True if the entries are equal.

        return this.getName().equals(it.getName());
    
public booleanequals(java.lang.Object it)
Determine if the two entries are equal. Equality is determined by the header names being equal.

param
it Entry to be checked for equality.
return
True if the entries are equal.

        if (it == null || getClass() != it.getClass()) {
            return false;
        }
        return equals((TarEntry) it);
    
public org.apache.tools.tar.TarEntry[]getDirectoryEntries()
If this entry represents a file, and the file is a directory, return an array of TarEntries for this entry's children.

return
An array of TarEntry's for this entry's children.

        if (this.file == null || !this.file.isDirectory()) {
            return new TarEntry[0];
        }

        String[]   list = this.file.list();
        TarEntry[] result = new TarEntry[list.length];

        for (int i = 0; i < list.length; ++i) {
            result[i] = new TarEntry(new File(this.file, list[i]));
        }

        return result;
    
public java.io.FilegetFile()
Get this entry's file.

return
This entry's file.

        return this.file;
    
public intgetGroupId()
Get this entry's group id.

return
This entry's group id.

        return this.groupId;
    
public java.lang.StringgetGroupName()
Get this entry's group name.

return
This entry's group name.

        return this.groupName.toString();
    
public java.lang.StringgetLinkName()
Get this entry's link name.

return
This entry's link name.

        return this.linkName.toString();
    
public java.util.DategetModTime()
Set this entry's modification time.

return
time This entry's new modification time.

        return new Date(this.modTime * MILLIS_PER_SECOND);
    
public intgetMode()
Get this entry's mode.

return
This entry's mode.

        return this.mode;
    
public java.lang.StringgetName()
Get this entry's name.

return
This entry's name.

        return this.name.toString();
    
public longgetSize()
Get this entry's file size.

return
This entry's file size.

        return this.size;
    
public intgetUserId()
Get this entry's user id.

return
This entry's user id.

        return this.userId;
    
public java.lang.StringgetUserName()
Get this entry's user name.

return
This entry's user name.

        return this.userName.toString();
    
public inthashCode()
Hashcodes are based on entry names.

return
the entry hashcode

        return getName().hashCode();
    
public booleanisDescendent(org.apache.tools.tar.TarEntry desc)
Determine if the given entry is a descendant of this entry. Descendancy is determined by the name of the descendant starting with this entry's name.

param
desc Entry to be checked as a descendent of this.
return
True if entry is a descendant of this.

        return desc.getName().startsWith(this.getName());
    
public booleanisDirectory()
Return whether or not this entry represents a directory.

return
True if this entry is a directory.

        if (this.file != null) {
            return this.file.isDirectory();
        }

        if (this.linkFlag == LF_DIR) {
            return true;
        }

        if (this.getName().endsWith("/")) {
            return true;
        }

        return false;
    
public booleanisGNULongNameEntry()
Indicate if this entry is a GNU long name block

return
true if this is a long name extension provided by GNU tar

        return linkFlag == LF_GNUTYPE_LONGNAME
                           && name.toString().equals(GNU_LONGLINK);
    
public voidparseTarHeader(byte[] header)
Parse an entry's header information from a header buffer.

param
header The tar entry header buffer to get information from.

        int offset = 0;

        this.name = TarUtils.parseName(header, offset, NAMELEN);
        offset += NAMELEN;
        this.mode = (int) TarUtils.parseOctal(header, offset, MODELEN);
        offset += MODELEN;
        this.userId = (int) TarUtils.parseOctal(header, offset, UIDLEN);
        offset += UIDLEN;
        this.groupId = (int) TarUtils.parseOctal(header, offset, GIDLEN);
        offset += GIDLEN;
        this.size = TarUtils.parseOctal(header, offset, SIZELEN);
        offset += SIZELEN;
        this.modTime = TarUtils.parseOctal(header, offset, MODTIMELEN);
        offset += MODTIMELEN;
        offset += CHKSUMLEN;
        this.linkFlag = header[offset++];
        this.linkName = TarUtils.parseName(header, offset, NAMELEN);
        offset += NAMELEN;
        this.magic = TarUtils.parseName(header, offset, MAGICLEN);
        offset += MAGICLEN;
        this.userName = TarUtils.parseName(header, offset, UNAMELEN);
        offset += UNAMELEN;
        this.groupName = TarUtils.parseName(header, offset, GNAMELEN);
        offset += GNAMELEN;
        this.devMajor = (int) TarUtils.parseOctal(header, offset, DEVLEN);
        offset += DEVLEN;
        this.devMinor = (int) TarUtils.parseOctal(header, offset, DEVLEN);
    
public voidsetGroupId(int groupId)
Set this entry's group id.

param
groupId This entry's new group id.

        this.groupId = groupId;
    
public voidsetGroupName(java.lang.String groupName)
Set this entry's group name.

param
groupName This entry's new group name.

        this.groupName = new StringBuffer(groupName);
    
public voidsetIds(int userId, int groupId)
Convenience method to set this entry's group and user ids.

param
userId This entry's new user id.
param
groupId This entry's new group id.

        this.setUserId(userId);
        this.setGroupId(groupId);
    
public voidsetModTime(long time)
Set this entry's modification time. The parameter passed to this method is in "Java time".

param
time This entry's new modification time.

        this.modTime = time / MILLIS_PER_SECOND;
    
public voidsetModTime(java.util.Date time)
Set this entry's modification time.

param
time This entry's new modification time.

        this.modTime = time.getTime() / MILLIS_PER_SECOND;
    
public voidsetMode(int mode)
Set the mode for this entry

param
mode the mode for this entry

        this.mode = mode;
    
public voidsetName(java.lang.String name)
Set this entry's name.

param
name This entry's new name.

        this.name = new StringBuffer(name);
    
public voidsetNames(java.lang.String userName, java.lang.String groupName)
Convenience method to set this entry's group and user names.

param
userName This entry's new user name.
param
groupName This entry's new group name.

        this.setUserName(userName);
        this.setGroupName(groupName);
    
public voidsetSize(long size)
Set this entry's file size.

param
size This entry's new file size.

        this.size = size;
    
public voidsetUserId(int userId)
Set this entry's user id.

param
userId This entry's new user id.

        this.userId = userId;
    
public voidsetUserName(java.lang.String userName)
Set this entry's user name.

param
userName This entry's new user name.

        this.userName = new StringBuffer(userName);
    
public voidwriteEntryHeader(byte[] outbuf)
Write an entry's header information to a header buffer.

param
outbuf The tar entry header buffer to fill in.

        int offset = 0;

        offset = TarUtils.getNameBytes(this.name, outbuf, offset, NAMELEN);
        offset = TarUtils.getOctalBytes(this.mode, outbuf, offset, MODELEN);
        offset = TarUtils.getOctalBytes(this.userId, outbuf, offset, UIDLEN);
        offset = TarUtils.getOctalBytes(this.groupId, outbuf, offset, GIDLEN);
        offset = TarUtils.getLongOctalBytes(this.size, outbuf, offset, SIZELEN);
        offset = TarUtils.getLongOctalBytes(this.modTime, outbuf, offset, MODTIMELEN);

        int csOffset = offset;

        for (int c = 0; c < CHKSUMLEN; ++c) {
            outbuf[offset++] = (byte) ' ";
        }

        outbuf[offset++] = this.linkFlag;
        offset = TarUtils.getNameBytes(this.linkName, outbuf, offset, NAMELEN);
        offset = TarUtils.getNameBytes(this.magic, outbuf, offset, MAGICLEN);
        offset = TarUtils.getNameBytes(this.userName, outbuf, offset, UNAMELEN);
        offset = TarUtils.getNameBytes(this.groupName, outbuf, offset, GNAMELEN);
        offset = TarUtils.getOctalBytes(this.devMajor, outbuf, offset, DEVLEN);
        offset = TarUtils.getOctalBytes(this.devMinor, outbuf, offset, DEVLEN);

        while (offset < outbuf.length) {
            outbuf[offset++] = 0;
        }

        long chk = TarUtils.computeCheckSum(outbuf);

        TarUtils.getCheckSumOctalBytes(chk, outbuf, csOffset, CHKSUMLEN);