// Fluent DTO for attachments
public static class KBAttachDTO {
private String ifaaSid; // attachment id
private String source; // sfaa_source
private String name; // sfaa_name (may contain HTML entities)
private String webFile; // sWebFile (relative path)
private String size; // ifaa_size (string)
// ----- Fluent setters -----
public KBAttachDTO ifaaSid(String v) { this.ifaaSid = safe(v); return this; }
public KBAttachDTO source(String v) { this.source = safe(v); return this; }
public KBAttachDTO name(String v) { this.name = v; return this; }
public KBAttachDTO webFile(String v) { this.webFile = safe(v); return this; }
public KBAttachDTO size(String v) { this.size = safe(v); return this; }
// ----- Optionals / convenience -----
/** Static factory for compact creation */
public static KBAttachDTO of() { return new KBAttachDTO(); }
/** Optional: HTML unescape when needed (Apache Commons Text) */
public KBAttachDTO unescapeName() {
// this.name = org.apache.commons.text.StringEscapeUtils.unescapeHtml4(this.name);
return this;
}
// ----- Getters -----
public String getIfaaSid() { return ifaaSid; }
public String getSource() { return source; }
public String getName() { return name; }
public String getWebFile() { return webFile; }
public String getSize() { return size; }
// ----- Utility -----
private static String safe(String s) { return s == null ? "" : s.trim(); }
@Override public String toString() {
return "KBAttachDTO{ifaaSid='" + ifaaSid + "', name='" + name + "', webFile='" + webFile + "'}";
}
}
Ly8gRmx1ZW50IERUTyBmb3IgYXR0YWNobWVudHMKCnB1YmxpYyBzdGF0aWMgY2xhc3MgS0JBdHRhY2hEVE8gewoKICAgIHByaXZhdGUgU3RyaW5nIGlmYWFTaWQ7ICAgLy8gYXR0YWNobWVudCBpZAoKICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZTsgICAgLy8gc2ZhYV9zb3VyY2UKCiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyAgICAgIC8vIHNmYWFfbmFtZSAobWF5IGNvbnRhaW4gSFRNTCBlbnRpdGllcykKCiAgICBwcml2YXRlIFN0cmluZyB3ZWJGaWxlOyAgIC8vIHNXZWJGaWxlIChyZWxhdGl2ZSBwYXRoKQoKICAgIHByaXZhdGUgU3RyaW5nIHNpemU7ICAgICAgLy8gaWZhYV9zaXplIChzdHJpbmcpCgoKCiAgICAvLyAtLS0tLSBGbHVlbnQgc2V0dGVycyAtLS0tLQoKICAgIHB1YmxpYyBLQkF0dGFjaERUTyBpZmFhU2lkKFN0cmluZyB2KSB7IHRoaXMuaWZhYVNpZCA9IHNhZmUodik7IHJldHVybiB0aGlzOyB9CgogICAgcHVibGljIEtCQXR0YWNoRFRPIHNvdXJjZShTdHJpbmcgdikgIHsgdGhpcy5zb3VyY2UgID0gc2FmZSh2KTsgcmV0dXJuIHRoaXM7IH0KCiAgICBwdWJsaWMgS0JBdHRhY2hEVE8gbmFtZShTdHJpbmcgdikgICAgeyB0aGlzLm5hbWUgICAgPSB2OyAgICAgICByZXR1cm4gdGhpczsgfQoKICAgIHB1YmxpYyBLQkF0dGFjaERUTyB3ZWJGaWxlKFN0cmluZyB2KSB7IHRoaXMud2ViRmlsZSA9IHNhZmUodik7IHJldHVybiB0aGlzOyB9CgogICAgcHVibGljIEtCQXR0YWNoRFRPIHNpemUoU3RyaW5nIHYpICAgIHsgdGhpcy5zaXplICAgID0gc2FmZSh2KTsgcmV0dXJuIHRoaXM7IH0KCgoKICAgIC8vIC0tLS0tIE9wdGlvbmFscyAvIGNvbnZlbmllbmNlIC0tLS0tCgogICAgLyoqIFN0YXRpYyBmYWN0b3J5IGZvciBjb21wYWN0IGNyZWF0aW9uICovCgogICAgcHVibGljIHN0YXRpYyBLQkF0dGFjaERUTyBvZigpIHsgcmV0dXJuIG5ldyBLQkF0dGFjaERUTygpOyB9CgoKCiAgICAvKiogT3B0aW9uYWw6IEhUTUwgdW5lc2NhcGUgd2hlbiBuZWVkZWQgKEFwYWNoZSBDb21tb25zIFRleHQpICovCgogICAgcHVibGljIEtCQXR0YWNoRFRPIHVuZXNjYXBlTmFtZSgpIHsKCiAgICAgICAgLy8gdGhpcy5uYW1lID0gb3JnLmFwYWNoZS5jb21tb25zLnRleHQuU3RyaW5nRXNjYXBlVXRpbHMudW5lc2NhcGVIdG1sNCh0aGlzLm5hbWUpOwoKICAgICAgICByZXR1cm4gdGhpczsKCiAgICB9CgoKCiAgICAvLyAtLS0tLSBHZXR0ZXJzIC0tLS0tCgogICAgcHVibGljIFN0cmluZyBnZXRJZmFhU2lkKCkgeyByZXR1cm4gaWZhYVNpZDsgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgIHsgcmV0dXJuIHNvdXJjZTsgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpICAgIHsgcmV0dXJuIG5hbWU7IH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFdlYkZpbGUoKSB7IHJldHVybiB3ZWJGaWxlOyB9CgogICAgcHVibGljIFN0cmluZyBnZXRTaXplKCkgICAgeyByZXR1cm4gc2l6ZTsgfQoKCgogICAgLy8gLS0tLS0gVXRpbGl0eSAtLS0tLQoKICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzYWZlKFN0cmluZyBzKSB7IHJldHVybiBzID09IG51bGwgPyAiIiA6IHMudHJpbSgpOyB9CgoKCiAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCiAgICAgICAgcmV0dXJuICJLQkF0dGFjaERUT3tpZmFhU2lkPSciICsgaWZhYVNpZCArICInLCBuYW1lPSciICsgbmFtZSArICInLCB3ZWJGaWxlPSciICsgd2ViRmlsZSArICInfSI7CgogICAgfQoKfQo=