/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core;
import java.util.Date;
/**
* The <b>SVNDirEntry</b> class is a representation of a versioned
* directory entry.
*
* <p>
* <b>SVNDirEntry</b> keeps an entry name, entry kind (is it a file or directory),
* file size (in case an entry is a file), the last changed revision, the date when
* the entry was last changed, the name of the author who last changed the entry, the
* commit log message for the last changed revision. <b>SVNDirEntry</b> also knows
* if the entry has any properties.
*
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
* @see ISVNDirEntryHandler
*/
public class SVNDirEntry implements Comparable {
/**
* It is sometimes convenient to indicate which parts of an entry
* you are actually interested in, so that calculating and sending
* the data corresponding to the other fields can be avoided. These values
* can be used for that purpose.
*/
/**
* Represents entry kind (if it is a file or a directory).
* @since 1.2.0
*/
public static final int DIRENT_KIND = 0x00001;
/**
* Represents file size (if the entry is a file).
* @since 1.2.0
*/
public static final int DIRENT_SIZE = 0x00002;
/**
* Contains the information whether the entry has any properties.
* @since 1.2.0
*/
public static final int DIRENT_HAS_PROPERTIES = 0x00004;
/**
* Represents the last revision when the entry was changed.
* @since 1.2.0
*/
public static final int DIRENT_CREATED_REVISION = 0x00008;
/**
* Represents the time of the last changed revision.
* @since 1.2.0
*/
public static final int DIRENT_TIME = 0x00010;
/**
* Represents the author of the last changed revision.
* @since 1.2.0
*/
public static final int DIRENT_LAST_AUTHOR = 0x00020;
/**
* Represents commit log message for the last changed revision.
* @since 1.2.0
*/
public static final int DIRENT_COMMIT_MESSAGE = 0x00040;
/**
* Represents a combination of all the entry fields.
* @since 1.2.0
*/
public static final int DIRENT_ALL = ~0;
private String myName;
private SVNNodeKind myKind;
private long mySize;
private boolean myHasProperties;
private long myRevision;
private Date myCreatedDate;
private String myLastAuthor;
private String myPath;
private String myCommitMessage;
private SVNLock myLock;
private SVNURL myURL;
private SVNURL myRepositoryRoot;
private SVNURL myExternalParentUrl;
private String myExternalTarget;
/**
* Constructs an instance of <b>SVNDirEntry</b>.
*
* @param url a url of this entry
* @param repositoryRoot a url of the root of repository this entry belongs to
* @param name an entry name
* @param kind the node kind for the entry
* @param size the entry size in bytes
* @param hasProperties <span class="javakeyword">true</span> if the
* entry has properties, otherwise <span class="javakeyword">false</span>
* @param revision the last changed revision of the entry
* @param createdDate the date the entry was last changed
* @param lastAuthor the person who last changed the entry
*/
public SVNDirEntry(SVNURL url, SVNURL repositoryRoot, String name, SVNNodeKind kind, long size,
boolean hasProperties, long revision, Date createdDate, String lastAuthor) {
myURL = url;
myRepositoryRoot = repositoryRoot;
myName = name;
myKind = kind;
mySize = size;
myHasProperties = hasProperties;
myRevision = revision;
myCreatedDate = createdDate;
myLastAuthor = lastAuthor;
}
/**
* Constructs an instance of <b>SVNDirEntry</b>.
*
* @param url a url of this entry
* @param repositoryRoot a url of the root of repository this entry belongs to
* @param name an entry name
* @param kind the node kind for the entry
* @param size the entry size in bytes
* @param hasProperties <span class="javakeyword">true</span> if the
* entry has properties, otherwise <span class="javakeyword">false</span>
* @param revision the last changed revision of the entry
* @param createdDate the date the entry was last changed
* @param lastAuthor the person who last changed the entry
* @param commitMessage the log message of the last change commit
*/
public SVNDirEntry(SVNURL url, SVNURL repositoryRoot, String name, SVNNodeKind kind, long size,
boolean hasProperties, long revision, Date createdDate, String lastAuthor, String commitMessage) {
myURL = url;
myRepositoryRoot = repositoryRoot;
myName = name;
myKind = kind;
mySize = size;
myHasProperties = hasProperties;
myRevision = revision;
myCreatedDate = createdDate;
myLastAuthor = lastAuthor;
myCommitMessage = commitMessage;
}
/**
* Returns the entry's URL.
*
* @return this entry's URL.
*/
public SVNURL getURL() {
return myURL;
}
/**
* Returns the entry's repository root URL.
*
* @return the URL of repository root.
*/
public SVNURL getRepositoryRoot() {
return myRepositoryRoot;
}
/**
* Gets the the directory entry name
*
* @return the name of this entry
*/
public String getName() {
return myName;
}
/**
* Returns the file size in bytes (if this entry is a file).
*
* @return the size of this entry in bytes
*/
public long getSize() {
return mySize;
}
/**
* Returns the file size in bytes (if this entry is a file).
*
* @deprecated use {@link #getSize()} instead
* @return the size of this entry in bytes
*/
public long size() {
return getSize();
}
/**
* Tells if the entry has any properties.
*
* @return <span class="javakeyword">true</span> if has,
* <span class="javakeyword">false</span> otherwise
*/
public boolean hasProperties() {
return myHasProperties;
}
/**
* Returns the entry node kind.
*
* @return the node kind of this entry
* @see SVNNodeKind
*/
public SVNNodeKind getKind() {
return myKind;
}
/**
* Returns the date the entry was last changed.
*
* @return the datestamp when the entry was last changed
*/
public Date getDate() {
return myCreatedDate;
}
/**
* Gets the last changed revision of this entry.
*
* @return the revision of this entry when it was last changed
*/
public long getRevision() {
return myRevision;
}
/**
* Retrieves the name of the author who last changed this entry.
*
* @return the last author's name.
*/
public String getAuthor() {
return myLastAuthor;
}
/**
* Returns the entry's path relative to the target directory.
*
* <p>
* This method is guaranteed to return a non-<span class="javakeyword">null</span> path only
* for {@link org.tmatesoft.svn.core.wc.SVNLogClient#doList(java.io.File, org.tmatesoft.svn.core.wc.SVNRevision, org.tmatesoft.svn.core.wc.SVNRevision, boolean, SVNDepth, int, ISVNDirEntryHandler) list}
* operations. It always returns a path relative to the target location which a list
* operation is launched on. When listing a directory the relative path for the target
* directory itself is <code>""</code>, for its children - just their names, for deeper
* directories (when listing recursively) - paths relative to the target directory path.
*
* @return path relative to the target directory
*/
public String getRelativePath() {
return myPath == null ? getName() : myPath;
}
/**
* @return repository path
* @deprecated use {@link #getRelativePath()} instead.
*/
public String getPath() {
return getRelativePath();
}
/**
* Returns the commit log message for the revision of this entry.
*
* <p/>
* This is guaranteed to be non-<span class="javakeyword">null</span> only for the target entry
* returned by the {@link org.tmatesoft.svn.core.io.SVNRepository#getDir(String, long, boolean, java.util.Collection)}
* method.
*
* @return a commit log message
*/
public String getCommitMessage() {
return myCommitMessage;
}
/**
* Gets the lock object for this entry (if it's locked).
*
* @return a lock object or <span class="javakeyword">null</span>
*/
public SVNLock getLock() {
return myLock;
}
/**
* This method is used by SVNKit internals and not intended for users (from an API point of view).
*
* @param name this entry's name
*/
public void setName(String name) {
this.myName = name;
}
/**
* This method is used by SVNKit internals and not intended for users (from an API point of view).
*
* @param path this entry's path
*/
public void setRelativePath(String path) {
myPath = path;
}
/**
* This method is used by SVNKit internals and not intended for users (from an API point of view).
*
* @param message a commit message
*/
public void setCommitMessage(String message) {
myCommitMessage = message;
}
/**
* Sets the lock object for this entry (if it's locked).
*
* @param lock a lock object
*/
public void setLock(SVNLock lock) {
myLock = lock;
}
public SVNURL getExternalParentUrl() {
return myExternalParentUrl;
}
public void setExternalParentUrl(SVNURL myExternalParentUrl) {
this.myExternalParentUrl = myExternalParentUrl;
}
public String getExternalTarget() {
return myExternalTarget;
}
public void setExternalTarget(String myExternalTarget) {
this.myExternalTarget = myExternalTarget;
}
/**
* Retirns a string representation of this object.
*
* @return a string representation of this directory entry
*/
public String toString() {
StringBuffer result = new StringBuffer();
result.append("name=");
result.append(myName);
result.append(", kind=");
result.append(myKind);
result.append(", size=");
result.append(mySize);
result.append(", hasProps=");
result.append(myHasProperties);
result.append(", lastchangedrev=");
result.append(myRevision);
if (myLastAuthor != null) {
result.append(", lastauthor=");
result.append(myLastAuthor);
}
if (myCreatedDate != null) {
result.append(", lastchangeddate=");
result.append(myCreatedDate);
}
return result.toString();
}
/**
* Compares this object with another one.
*
* @param o an object to compare with
* @return <ul>
* <li>-1 - if <code>o</code> is either <span class="javakeyword">null</span>,
* or is not an instance of <b>SVNDirEntry</b>, or this entry's URL is lexicographically
* less than the name of <code>o</code>;
* </li>
* <li>1 - if this entry's URL is lexicographically greater than the name of <code>o</code>;
* </li>
* <li>0 - if and only if <code>o</code> has got the same URL as this one has
* </li>
* </ul>
*/
public int compareTo(Object o) {
if (o == null || o.getClass() != SVNDirEntry.class) {
return -1;
}
SVNNodeKind otherKind = ((SVNDirEntry) o).getKind();
if (otherKind != getKind()) {
return getKind().compareTo(otherKind);
}
String otherURL = ((SVNDirEntry) o).getURL().toString();
return myURL.toString().compareTo(otherURL);
}
}