package de.micromata.borgbutler.json.borg; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; public class BorgFilesystemItem implements Serializable, Comparable { private transient static Logger log = LoggerFactory.getLogger(BorgFilesystemItem.class); private static final long serialVersionUID = -5545350851640655468L; public String getType() { return this.type; } public String getMode() { return this.mode; } public String getUser() { return this.user; } public String getGroup() { return this.group; } public long getUid() { return this.uid; } public long getGid() { return this.gid; } public String getPath() { return this.path; } public String getDisplayPath() { return this.displayPath; } public boolean isHealthy() { return this.healthy; } public String getSource() { return this.source; } public String getLinktarget() { return this.linktarget; } public String getFlags() { return this.flags; } public String getMtime() { return this.mtime; } public long getSize() { return this.size; } public int getFileNumber() { return this.fileNumber; } public DiffStatus getDiffStatus() { return this.diffStatus; } public BorgFilesystemItem getDiffItem() { return this.diffItem; } public String getDifferences() { return this.differences; } public BorgFilesystemItem setType(String type) { this.type = type; return this; } public BorgFilesystemItem setMode(String mode) { this.mode = mode; return this; } public BorgFilesystemItem setUser(String user) { this.user = user; return this; } public BorgFilesystemItem setUid(long uid) { this.uid = uid; return this; } public BorgFilesystemItem setPath(String path) { this.path = path; return this; } public BorgFilesystemItem setDisplayPath(String displayPath) { this.displayPath = displayPath; return this; } public BorgFilesystemItem setMtime(String mtime) { this.mtime = mtime; return this; } public BorgFilesystemItem setSize(long size) { this.size = size; return this; } public BorgFilesystemItem setFileNumber(int fileNumber) { this.fileNumber = fileNumber; return this; } public BorgFilesystemItem setDiffStatus(DiffStatus diffStatus) { this.diffStatus = diffStatus; return this; } public BorgFilesystemItem setDiffItem(BorgFilesystemItem diffItem) { this.diffItem = diffItem; return this; } /** * If running in diff mode, this flag specifies the type of difference. Null represents unmodified. */ public enum DiffStatus {NEW, REMOVED, MODIFIED} /** * d (directory), - (file) */ private String type; /** * Unix mode, e. g. drwxr-xr-x */ private String mode; private String user; private String group; private long uid; private long gid; private String path; private String displayPath; private boolean healthy; private String source; private String linktarget; private String flags; private String mtime; private long size; /** * Represents the number of the file in the archive (for downloading). This field is created and only known by BorgButler. */ private int fileNumber = -1; /** * If created by diff tool, this flag represents the type of difference. */ private DiffStatus diffStatus; /** * If created by diff tool, this object holds the file item of the other archive (diff archive). */ private BorgFilesystemItem diffItem; /** * If created by diff tool, this String contains all differences between current and other item for {@link DiffStatus#MODIFIED}. * This String may used for displaying. */ private String differences; @Override public int compareTo(BorgFilesystemItem o) { if (path == o.path) { return 0; } if (path == null) { return -1; } if (o.path == null) { return 1; } return path.compareToIgnoreCase(o.path); } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } BorgFilesystemItem rhs = (BorgFilesystemItem) obj; return new EqualsBuilder() .append(path, rhs.path) .append(type, rhs.type) .append(mode, rhs.mode) .append(user, rhs.user) .append(group, rhs.group) .append(uid, rhs.uid) .append(gid, rhs.gid) .append(mtime, rhs.mtime) .append(size, rhs.size) .append(flags, rhs.flags) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(path) .append(type) .append(mode) .append(user) .append(group) .append(uid) .append(gid) .append(mtime) .append(size) .append(flags) .toHashCode(); } /** * Compares all fields and creates human readable string with differences. */ public void buildDifferencesString() { if (diffItem == null) { // Nothing to do. return; } if (!StringUtils.equals(this.path, diffItem.path)) { log.error("*** Internal error: Differences should only be made on same path object: current='" + path + "', other='" + diffItem.path + "'."); return; } StringBuilder sb = new StringBuilder(); appendDiff(sb, "type", this.type, diffItem.type); //appendDiff(sb, "mode", this.mode, diffItem.mode); // Done by frontend (jsx) appendDiff(sb, "user", this.user, diffItem.user); appendDiff(sb, "group", this.group, diffItem.group); appendDiff(sb, "uid", this.uid, diffItem.uid); appendDiff(sb, "gid", this.gid, diffItem.gid); //appendDiff(sb, "mtime", this.mtime, diffItem.mtime); // Done by frontend (jsx) //appendDiff(sb, "size", this.size, diffItem.size); // Done by frontend (jsx) if (sb.length() > 0) { diffStatus = DiffStatus.MODIFIED; this.differences = sb.toString(); } } private void appendDiff(StringBuilder sb, String field, String current, String other) { if (StringUtils.equals(current, other)) { // Not modified. return; } if (sb.length() > 0) { sb.append(", "); } sb.append(field + ":['" + other + "'->'" + current + "']"); } private void appendDiff(StringBuilder sb, String field, long current, long other) { if (current == other) { // Not modified. return; } if (sb.length() > 0) { sb.append(", "); } sb.append(field + ":['" + other + "'->'" + current + "']"); } @Override public String toString() { return path; } @Override public BorgFilesystemItem clone() { BorgFilesystemItem clone = new BorgFilesystemItem(); clone.type = this.type; clone.mode = this.mode; clone.user = this.user; clone.group = this.group; clone.uid = this.uid; clone.gid = this.gid; clone.path = this.path; clone.displayPath = this.displayPath; clone.healthy = this.healthy; clone.source = this.source; clone.linktarget = this.linktarget; clone.flags = this.flags; clone.mtime = this.mtime; clone.size = this.size; clone.fileNumber = this.fileNumber; clone.diffStatus = this.diffStatus; clone.diffItem = this.diffItem; clone.differences = this.differences; return clone; } }