/*
* ====================================================================
* Copyright (c) 2004-2010 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.internal.wc.admin;
import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNDate;
import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
import org.tmatesoft.svn.core.internal.util.SVNHashMap;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
import org.tmatesoft.svn.core.internal.wc.SVNTreeConflictUtil;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNTreeConflictDescription;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public abstract class SVNEntry {
private String myName;
private String author;
private String[] cachableProperties;
private String changelistName;
private String checksum;
private SVNDate committedDate;
private long committedRevision;
private String conflictNew;
private String conflictOld;
private String conflictWorking;
private long copyFromRevision;
private String copyFromURL;
private SVNDepth depth;
private String externalFilePath;
private SVNRevision externalFilePegRevision;
private SVNRevision externalFileRevision;
private SVNNodeKind kind;
private String lockComment;
private SVNDate lockCreationDate;
private String lockOwner;
private String lockToken;
private String[] presentProperties;
private String propRejectFile;
private SVNDate propTime;
private String repositoryRoot;
private long revision;
private String schedule;
private SVNDate textTime;
private String treeConflictData;
private String url;
private String uuid;
private long workingSize;
private boolean absent;
private boolean copied;
private boolean deleted;
private boolean incomplete;
private boolean keepLocal;
private boolean hasProperties;
private boolean hasPropertiesModifications;
private String parentURL;
public abstract boolean isThisDir();
public abstract SVNAdminArea getAdminArea();
public String getURL() {
if (url == null && parentURL != null) {
return SVNPathUtil.append(parentURL, SVNEncodingUtil.uriEncode(myName));
}
return url;
}
public SVNURL getSVNURL() throws SVNException {
String url = getURL();
if (url != null) {
return SVNURL.parseURIEncoded(url);
}
return null;
}
public String getName() {
return myName;
}
public boolean isDirectory() {
return kind == SVNNodeKind.DIR;
}
public long getRevision() {
return revision;
}
public boolean isScheduledForAddition() {
return SVNProperty.SCHEDULE_ADD.equals(schedule);
}
public boolean isScheduledForDeletion() {
return SVNProperty.SCHEDULE_DELETE.equals(schedule);
}
public boolean isScheduledForReplacement() {
return SVNProperty.SCHEDULE_REPLACE.equals(schedule);
}
public boolean isHidden() {
return (isDeleted() && !isScheduledForAddition() && !isScheduledForReplacement()) ||
isAbsent() || getDepth() == SVNDepth.EXCLUDE;
}
public boolean isFile() {
return kind == SVNNodeKind.FILE;
}
public String getLockToken() {
return lockToken;
}
public boolean isDeleted() {
return deleted;
}
public boolean isAbsent() {
return absent;
}
public String toString() {
return myName;
}
public boolean setRevision(long revision) {
boolean changed = revision != this.revision;
this.revision = revision;
return changed;
}
public boolean setCommittedRevision(long cmtRevision) {
boolean changed = cmtRevision != this.committedRevision;
committedRevision = cmtRevision;
return changed;
}
public boolean setAuthor(String cmtAuthor) {
boolean changed = cmtAuthor != null ? !cmtAuthor.equals(author) : cmtAuthor != author;
author = cmtAuthor;
return changed;
}
public boolean setChangelistName(String changelistName) {
boolean changed = changelistName != null ? !changelistName.equals(this.changelistName) : changelistName != this.changelistName;
this.changelistName = changelistName;
return changed;
}
public String getChangelistName() {
return this.changelistName;
}
public boolean setWorkingSize(long size) {
boolean changed = workingSize != size;
workingSize = size;
return changed;
}
public long getWorkingSize() {
return workingSize;
}
public SVNDepth getDepth() {
return depth;
}
public void setDepth(SVNDepth depth) {
if (depth == null) {
depth = SVNDepth.INFINITY;
}
this.depth = depth;
}
public boolean setURL(String url) {
boolean changed = url != null ? !url.equals(this.url) : url != this.url;
this.url = url;
return changed;
}
public void setIncomplete(boolean incomplete) {
this.incomplete = incomplete;
}
public boolean isIncomplete() {
return incomplete;
}
public String getConflictOld() {
return conflictOld;
}
public void setConflictOld(String name) {
this.conflictOld = name;
}
public String getConflictNew() {
return conflictNew;
}
public void setConflictNew(String name) {
this.conflictNew = name;
}
public String getConflictWorking() {
return conflictWorking;
}
public void setConflictWorking(String name) {
conflictWorking = name;
}
public String getPropRejectFile() {
return propRejectFile;
}
public void setPropRejectFile(String name) {
propRejectFile = name;
}
public String getAuthor() {
return author;
}
public void setCommittedDate(String date) {
committedDate = date != null ? SVNDate.parseDate(date) : null;
}
public String getCommittedDate() {
return committedDate != null ? committedDate.format() : null;
}
public long getCommittedRevision() {
return committedRevision;
}
public void setTextTime(String time) {
textTime = time != null ? SVNDate.parseDate(time) : null;
}
public void setKind(SVNNodeKind kind) {
this.kind = kind;
}
public void setAbsent(boolean absent) {
this.absent = absent;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
public SVNNodeKind getKind() {
return kind;
}
public String getTextTime() {
return textTime != null ? textTime.format() : null;
}
public String getChecksum() {
return checksum;
}
public void setChecksum(String checksum) {
this.checksum = checksum;
}
public void setLockComment(String comment) {
this.lockComment = comment;
}
public void setLockOwner(String owner) {
this.lockOwner = owner;
}
public void setLockCreationDate(String date) {
this.lockCreationDate = date != null ? SVNDate.parseDate(date) : null;
}
public void setLockToken(String token) {
this.lockToken = token;
}
public void setUUID(String uuid) {
this.uuid = uuid;
}
public void unschedule() {
this.schedule = null;
}
public void scheduleForAddition() {
schedule = SVNProperty.SCHEDULE_ADD;
}
public void scheduleForDeletion() {
schedule = SVNProperty.SCHEDULE_DELETE;
}
public void scheduleForReplacement() {
schedule = SVNProperty.SCHEDULE_REPLACE;
}
public void setSchedule(String schedule) {
this.schedule = schedule;;
}
public void setCopyFromRevision(long revision) {
this.copyFromRevision = revision;
}
public boolean setCopyFromURL(String url) {
boolean changed = url != null ? !url.equals(copyFromURL) : url != copyFromURL;
copyFromURL = url;
return changed;
}
public void setCopied(boolean copied) {
this.copied = copied;
}
public String getCopyFromURL() {
return copyFromURL;
}
public SVNURL getCopyFromSVNURL() throws SVNException {
String url = getCopyFromURL();
if (url != null) {
return SVNURL.parseURIEncoded(url);
}
return null;
}
public long getCopyFromRevision() {
return copyFromRevision;
}
public String getPropTime() {
return propTime != null ? propTime.format() : null;
}
public void setPropTime(String time) {
this.propTime = time != null ? SVNDate.parseDate(time) : null;
}
public boolean isCopied() {
return copied;
}
public String getUUID() {
return this.uuid;
}
public String getRepositoryRoot() {
return this.repositoryRoot;
}
public SVNURL getRepositoryRootURL() throws SVNException {
String url = getRepositoryRoot();
if (url != null) {
return SVNURL.parseURIEncoded(url);
}
return null;
}
public boolean setRepositoryRoot(String url) {
boolean changed = url != null ? !url.equals(repositoryRoot) : url != repositoryRoot;
this.repositoryRoot = url;
return changed;
}
public boolean setRepositoryRootURL(SVNURL url) {
return setRepositoryRoot(url == null ? null : url.toString());
}
public String getLockOwner() {
return lockOwner;
}
public String getLockComment() {
return lockComment;
}
public String getLockCreationDate() {
return lockCreationDate != null ? lockCreationDate.format() : null;
}
public String getSchedule() {
return schedule;
}
public void setCachableProperties(String[] cachableProps) {
this.cachableProperties = cachableProps;
}
public void setPresentProperties(String[] properties) {
presentProperties = properties;
}
public void setKeepLocal(boolean keepLocal) {
this.keepLocal = keepLocal;
}
public boolean isKeepLocal() {
return keepLocal;
}
public String[] getCachableProperties() {
return cachableProperties;
}
public String[] getPresentProperties() {
return presentProperties;
}
public String getExternalFilePath() {
return externalFilePath;
}
public SVNRevision getExternalFileRevision() {
return externalFileRevision;
}
public SVNRevision getExternalFilePegRevision() {
return externalFilePegRevision;
}
public void setExternalFilePath(String path) {
externalFilePath = path;
}
public void setExternalFileRevision(SVNRevision rev) {
externalFileRevision = rev;
}
public void setExternalFilePegRevision(SVNRevision pegRev) {
externalFilePegRevision = pegRev;
}
public String getTreeConflictData() {
return treeConflictData;
}
public abstract Map<File, SVNTreeConflictDescription> getTreeConflicts() throws SVNException;
public void setTreeConflictData(String conflictData) {
treeConflictData = conflictData;
}
public void setTreeConflicts(Map treeConflicts) throws SVNException {
String conflictData = SVNTreeConflictUtil.getTreeConflictData(treeConflicts);
setTreeConflictData(conflictData);
}
public void setHasProperties(boolean hasProps) {
this.hasProperties = hasProps;
}
public void setHasPropertiesModifications(boolean hasPropsMods) {
this.hasPropertiesModifications = hasPropsMods;
}
public boolean hasPropertiesModifications() {
return hasPropertiesModifications;
}
public boolean hasProperties() {
return hasProperties;
}
public void setParentURL(String url) {
parentURL = url;
}
public void setName(String name) {
myName = name;
}
public void applyChanges(Map attributes) {
if (attributes == null || attributes.isEmpty()) {
return;
}
for(Iterator<?> names = attributes.keySet().iterator(); names.hasNext();) {
String name = (String) names.next();
setAttribute(name, attributes.get(name));
}
}
private void setAttribute(String name, Object value) {
if (SVNProperty.ABSENT.equals(name)) {
setAbsent(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.CACHABLE_PROPS.equals(name)) {
if (value instanceof String) {
value = SVNAdminArea.fromString((String) value, " ");
}
if (Arrays.equals((String[]) value, SVNAdminArea14.getCachableProperties())) {
value = SVNAdminArea14.getCachableProperties();
}
setCachableProperties((String[]) value);
} else if (SVNProperty.CHANGELIST.equals(name)) {
setChangelistName((String) value);
} else if (SVNProperty.CHECKSUM.equals(name)) {
setChecksum((String) value);
} else if (SVNProperty.COMMITTED_DATE.equals(name)) {
setCommittedDate((String) value);
} else if (SVNProperty.COMMITTED_REVISION.equals(name)) {
setCommittedRevision(SVNProperty.longValue((String) value));
} else if (SVNProperty.CONFLICT_NEW.equals(name)) {
setConflictNew((String) value);
} else if (SVNProperty.CONFLICT_OLD.equals(name)) {
setConflictOld((String) value);
} else if (SVNProperty.CONFLICT_WRK.equals(name)) {
setConflictWorking((String) value);
} else if (SVNProperty.COPIED.equals(name)) {
setCopied(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.COPYFROM_REVISION.equals(name)) {
setCopyFromRevision(SVNProperty.longValue((String) value));
} else if (SVNProperty.COPYFROM_URL.equals(name)) {
setCopyFromURL((String) value);
} else if (SVNProperty.DELETED.equals(name)) {
setDeleted(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.DEPTH.equals(name)) {
SVNDepth depth = null;
if (value instanceof String) {
depth = SVNDepth.fromString((String) value);
}
if (depth == null) {
depth = SVNDepth.INFINITY;
}
setDepth(depth);
} else if (SVNProperty.FILE_EXTERNAL_PATH.equals(name)) {
setExternalFilePath((String) value);
} else if (SVNProperty.FILE_EXTERNAL_PEG_REVISION.equals(name)) {
setExternalFilePegRevision((SVNRevision) value);
} else if (SVNProperty.FILE_EXTERNAL_REVISION.equals(name)) {
setExternalFileRevision((SVNRevision) value);
} else if (SVNProperty.HAS_PROP_MODS.equals(name)) {
setHasPropertiesModifications(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.HAS_PROPS.equals(name)) {
setHasProperties(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.INCOMPLETE.equals(name)) {
setIncomplete(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.KEEP_LOCAL.equals(name)) {
setKeepLocal(SVNProperty.booleanValue((String) value));
} else if (SVNProperty.KIND.equals(name)) {
SVNNodeKind kind = null;
if (value instanceof String) {
kind = SVNNodeKind.parseKind((String) value);
}
setKind(kind);
} else if (SVNProperty.LAST_AUTHOR.equals(name)) {
setAuthor((String) value);
} else if (SVNProperty.LOCK_COMMENT.equals(name)) {
setLockComment((String) value);
} else if (SVNProperty.LOCK_CREATION_DATE.equals(name)) {
setLockCreationDate((String) value);
} else if (SVNProperty.LOCK_OWNER.equals(name)) {
setLockOwner((String) value);
} else if (SVNProperty.LOCK_TOKEN.equals(name)) {
setLockToken((String) value);
} else if (SVNProperty.NAME.equals(name)) {
this.myName = (String) value;
} else if (SVNProperty.PRESENT_PROPS.equals(name)) {
if (value instanceof String) {
value = SVNAdminArea.fromString((String) value, " ");
}
setPresentProperties((String[]) value);
} else if (SVNProperty.PROP_REJECT_FILE.equals(name)) {
setPropRejectFile((String) value);
} else if (SVNProperty.PROP_TIME.equals(name)) {
setPropTime((String) value);
} else if (SVNProperty.REPOS.equals(name)) {
setRepositoryRoot((String) value);
} else if (SVNProperty.REVISION.equals(name)) {
setRevision(SVNProperty.longValue((String) value));
} else if (SVNProperty.SCHEDULE.equals(name)) {
setSchedule((String) value);
} else if (SVNProperty.TEXT_TIME.equals(name)) {
setTextTime((String) value);
} else if (SVNProperty.TREE_CONFLICT_DATA.equals(name)) {
setTreeConflictData((String) value);
} else if (SVNProperty.URL.equals(name)) {
setURL((String) value);
} else if (SVNProperty.UUID.equals(name)) {
setUUID((String) value);
} else if (SVNProperty.WORKING_SIZE.equals(name)) {
setWorkingSize(SVNProperty.longValue((String) value));
}
}
public Map asMap() {
Map map = new SVNHashMap();
if (isAbsent()) {
map.put(SVNProperty.ABSENT, Boolean.TRUE.toString());
}
if (getCachableProperties() != null) {
map.put(SVNProperty.CACHABLE_PROPS, getCachableProperties());
}
if (getChangelistName() != null) {
map.put(SVNProperty.CHANGELIST, getChangelistName());
}
if (getChecksum() != null) {
map.put(SVNProperty.CHECKSUM, getChecksum());
}
if (getCommittedDate() != null) {
map.put(SVNProperty.COMMITTED_DATE, getCommittedDate());
}
if (getCommittedRevision() >= 0) {
map.put(SVNProperty.COMMITTED_REVISION, Long.toString(getCommittedRevision()));
}
if (getConflictNew() != null) {
map.put(SVNProperty.CONFLICT_NEW, getConflictNew());
}
if (getConflictOld() != null) {
map.put(SVNProperty.CONFLICT_OLD, getConflictOld());
}
if (getConflictWorking() != null) {
map.put(SVNProperty.CONFLICT_WRK, getConflictWorking());
}
if (isCopied()) {
map.put(SVNProperty.COPIED, Boolean.TRUE.toString());
}
if (getCopyFromRevision() >= 0) {
map.put(SVNProperty.COPYFROM_REVISION, Long.toString(getCopyFromRevision()));
}
if (getCopyFromURL() != null) {
map.put(SVNProperty.COPYFROM_URL, getCopyFromURL());
}
if (isDeleted()) {
map.put(SVNProperty.DELETED, Boolean.TRUE.toString());
}
if (getDepth() != null) {
map.put(SVNProperty.DEPTH, getDepth().toString());
}
if (getExternalFilePath() != null) {
map.put(SVNProperty.FILE_EXTERNAL_PATH, getExternalFilePath());
}
if (getExternalFileRevision() != null) {
map.put(SVNProperty.FILE_EXTERNAL_REVISION, getExternalFileRevision());
}
if (getExternalFilePegRevision() != null) {
map.put(SVNProperty.FILE_EXTERNAL_PEG_REVISION, getExternalFilePegRevision());
}
if (hasProperties()) {
map.put(SVNProperty.HAS_PROPS, Boolean.TRUE.toString());
}
if (hasPropertiesModifications()) {
map.put(SVNProperty.HAS_PROP_MODS, Boolean.TRUE.toString());
}
if (isIncomplete()) {
map.put(SVNProperty.INCOMPLETE, Boolean.TRUE.toString());
}
if (isKeepLocal()) {
map.put(SVNProperty.KEEP_LOCAL, Boolean.TRUE.toString());
}
if (getKind() != null) {
map.put(SVNProperty.KIND, getKind().toString());
}
if (getAuthor() != null) {
map.put(SVNProperty.LAST_AUTHOR, getAuthor());
}
if (getLockComment() != null) {
map.put(SVNProperty.LOCK_COMMENT, getLockComment());
}
if (getLockCreationDate() != null) {
map.put(SVNProperty.LOCK_CREATION_DATE, getLockCreationDate());
}
if (getLockOwner() != null) {
map.put(SVNProperty.LOCK_OWNER, getLockOwner());
}
if (getLockToken() != null) {
map.put(SVNProperty.LOCK_TOKEN, getLockToken());
}
if (getName() != null) {
map.put(SVNProperty.NAME, getName());
}
if (getPresentProperties() != null) {
map.put(SVNProperty.PRESENT_PROPS, getPresentProperties());
}
if (getPropRejectFile() != null) {
map.put(SVNProperty.PROP_REJECT_FILE, getPropRejectFile());
}
if (getPropTime() != null) {
map.put(SVNProperty.PROP_TIME, getPropTime());
}
if (getRepositoryRoot() != null) {
map.put(SVNProperty.REPOS, getRepositoryRoot());
}
if (getRevision() >= 0) {
map.put(SVNProperty.REVISION, Long.toString(getRevision()));
}
if (getSchedule() != null) {
map.put(SVNProperty.SCHEDULE, getSchedule());
}
if (getTextTime() != null) {
map.put(SVNProperty.TEXT_TIME, getTextTime());
}
if (getTreeConflictData() != null) {
map.put(SVNProperty.TREE_CONFLICT_DATA, getTreeConflictData());
}
if (getURL() != null) {
map.put(SVNProperty.URL, getURL());
}
if (getUUID() != null) {
map.put(SVNProperty.UUID, getUUID());
}
if (getWorkingSize() >= 0) {
map.put(SVNProperty.WORKING_SIZE, Long.toString(getWorkingSize()));
}
return map;
}
}