import org.apache.axis.message.MessageElement;
import org.w3c.dom.*;
import java.util.*;
public List<KBAttachDTO> getKBAttachList(int ifqSid, String userType) throws Exception {
List<KBAttachDTO> listOut = new ArrayList<>();
IQKB_XMLSoapProxy service = new IQKB_XMLSoapProxy();
// call the WS that returns attachments for a KB item (adjust API if different)
WsGetKBAttachResponseWsGetKBAttachResult result =
service.wsGetKBAttach(strValidCode, 1, channelMap.get(userType), ifqSid);
MessageElement[] anyArr = result.get_any();
// keep your original logging style
LOGGER.info(vaildLog("### method:getKBAttachList, webservice:wsGetKBAttach"));
LOGGER.info(vaildLog("### req:" + "wsGetKBAttach(" + strValidCode + ", 1, "
+ channelMap.get(userType) + ", " + ifqSid + ")"));
LOGGER.info(vaildLog("### anyData:" + (anyArr != null && anyArr.length > 0 ? anyArr[0] : "null")));
if (anyArr == null || anyArr.length == 0) return listOut;
// 1) find <diffgram> (skip xs:schema)
Element diffgram = null;
for (MessageElement me : anyArr) {
String ln = me.getLocalName();
if ("diffgram".equalsIgnoreCase(ln)) { diffgram = me; break; }
}
if (diffgram == null) return listOut;
// 2) enter <IQKB>
Element dataRoot = firstChildElementByLocalName(diffgram, "IQKB");
if (dataRoot == null) dataRoot = diffgram;
// 3) each row is <KBAttach>
NodeList rows = dataRoot.getElementsByTagName("KBAttach");
if (rows == null || rows.getLength() == 0) return listOut;
for (int i = 0; i < rows.getLength(); i++) {
Element row = (Element) rows.item(i);
KBAttachDTO dto = new KBAttachDTO();
dto.ifaaSid = getChildText(row, "ifaa_sid");
dto.source = getChildText(row, "sfaa_source");
dto.name = getChildText(row, "sfaa_name"); // may contain entities like <...>
dto.webFile = getChildText(row, "sWebFile"); // looks like "/Attach/1/current/5563.pptx"
dto.size = getChildText(row, "ifaa_size");
// optional: HTML unescape if needed
// dto.name = org.apache.commons.text.StringEscapeUtils.unescapeHtml4(dto.name);
listOut.add(dto);
}
LOGGER.info("getKBAttachList: rows=" + rows.getLength() + ", mapped=" + listOut.size());
return listOut;
}
aW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLk1lc3NhZ2VFbGVtZW50OwoKaW1wb3J0IG9yZy53M2MuZG9tLio7CgppbXBvcnQgamF2YS51dGlsLio7CgoKCnB1YmxpYyBMaXN0PEtCQXR0YWNoRFRPPiBnZXRLQkF0dGFjaExpc3QoaW50IGlmcVNpZCwgU3RyaW5nIHVzZXJUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICBMaXN0PEtCQXR0YWNoRFRPPiBsaXN0T3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7CgoKCiAgICBJUUtCX1hNTFNvYXBQcm94eSBzZXJ2aWNlID0gbmV3IElRS0JfWE1MU29hcFByb3h5KCk7CgogICAgLy8gY2FsbCB0aGUgV1MgdGhhdCByZXR1cm5zIGF0dGFjaG1lbnRzIGZvciBhIEtCIGl0ZW0gKGFkanVzdCBBUEkgaWYgZGlmZmVyZW50KQoKICAgIFdzR2V0S0JBdHRhY2hSZXNwb25zZVdzR2V0S0JBdHRhY2hSZXN1bHQgcmVzdWx0ID0KCiAgICAgICAgICAgIHNlcnZpY2Uud3NHZXRLQkF0dGFjaChzdHJWYWxpZENvZGUsIDEsIGNoYW5uZWxNYXAuZ2V0KHVzZXJUeXBlKSwgaWZxU2lkKTsKCgoKICAgIE1lc3NhZ2VFbGVtZW50W10gYW55QXJyID0gcmVzdWx0LmdldF9hbnkoKTsKCgoKICAgIC8vIGtlZXAgeW91ciBvcmlnaW5hbCBsb2dnaW5nIHN0eWxlCgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyBtZXRob2Q6Z2V0S0JBdHRhY2hMaXN0LCB3ZWJzZXJ2aWNlOndzR2V0S0JBdHRhY2giKSk7CgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyByZXE6IiArICJ3c0dldEtCQXR0YWNoKCIgKyBzdHJWYWxpZENvZGUgKyAiLCAxLCAiCgogICAgICAgICAgICArIGNoYW5uZWxNYXAuZ2V0KHVzZXJUeXBlKSArICIsICIgKyBpZnFTaWQgKyAiKSIpKTsKCiAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIGFueURhdGE6IiArIChhbnlBcnIgIT0gbnVsbCAmJiBhbnlBcnIubGVuZ3RoID4gMCA/IGFueUFyclswXSA6ICJudWxsIikpKTsKCgoKICAgIGlmIChhbnlBcnIgPT0gbnVsbCB8fCBhbnlBcnIubGVuZ3RoID09IDApIHJldHVybiBsaXN0T3V0OwoKCgogICAgLy8gMSkgZmluZCA8ZGlmZmdyYW0+IChza2lwIHhzOnNjaGVtYSkKCiAgICBFbGVtZW50IGRpZmZncmFtID0gbnVsbDsKCiAgICBmb3IgKE1lc3NhZ2VFbGVtZW50IG1lIDogYW55QXJyKSB7CgogICAgICAgIFN0cmluZyBsbiA9IG1lLmdldExvY2FsTmFtZSgpOwoKICAgICAgICBpZiAoImRpZmZncmFtIi5lcXVhbHNJZ25vcmVDYXNlKGxuKSkgeyBkaWZmZ3JhbSA9IG1lOyBicmVhazsgfQoKICAgIH0KCiAgICBpZiAoZGlmZmdyYW0gPT0gbnVsbCkgcmV0dXJuIGxpc3RPdXQ7CgoKCiAgICAvLyAyKSBlbnRlciA8SVFLQj4KCiAgICBFbGVtZW50IGRhdGFSb290ID0gZmlyc3RDaGlsZEVsZW1lbnRCeUxvY2FsTmFtZShkaWZmZ3JhbSwgIklRS0IiKTsKCiAgICBpZiAoZGF0YVJvb3QgPT0gbnVsbCkgZGF0YVJvb3QgPSBkaWZmZ3JhbTsKCgoKICAgIC8vIDMpIGVhY2ggcm93IGlzIDxLQkF0dGFjaD4KCiAgICBOb2RlTGlzdCByb3dzID0gZGF0YVJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIktCQXR0YWNoIik7CgogICAgaWYgKHJvd3MgPT0gbnVsbCB8fCByb3dzLmdldExlbmd0aCgpID09IDApIHJldHVybiBsaXN0T3V0OwoKCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzLmdldExlbmd0aCgpOyBpKyspIHsKCiAgICAgICAgRWxlbWVudCByb3cgPSAoRWxlbWVudCkgcm93cy5pdGVtKGkpOwoKCgogICAgICAgIEtCQXR0YWNoRFRPIGR0byA9IG5ldyBLQkF0dGFjaERUTygpOwoKICAgICAgICBkdG8uaWZhYVNpZCA9IGdldENoaWxkVGV4dChyb3csICJpZmFhX3NpZCIpOwoKICAgICAgICBkdG8uc291cmNlICA9IGdldENoaWxkVGV4dChyb3csICJzZmFhX3NvdXJjZSIpOwoKICAgICAgICBkdG8ubmFtZSAgICA9IGdldENoaWxkVGV4dChyb3csICJzZmFhX25hbWUiKTsgLy8gbWF5IGNvbnRhaW4gZW50aXRpZXMgbGlrZSAmbHQ7Li4uJmd0OwoKICAgICAgICBkdG8ud2ViRmlsZSA9IGdldENoaWxkVGV4dChyb3csICJzV2ViRmlsZSIpOyAgLy8gbG9va3MgbGlrZSAiL0F0dGFjaC8xL2N1cnJlbnQvNTU2My5wcHR4IgoKICAgICAgICBkdG8uc2l6ZSAgICA9IGdldENoaWxkVGV4dChyb3csICJpZmFhX3NpemUiKTsKCgoKICAgICAgICAvLyBvcHRpb25hbDogSFRNTCB1bmVzY2FwZSBpZiBuZWVkZWQKCiAgICAgICAgLy8gZHRvLm5hbWUgPSBvcmcuYXBhY2hlLmNvbW1vbnMudGV4dC5TdHJpbmdFc2NhcGVVdGlscy51bmVzY2FwZUh0bWw0KGR0by5uYW1lKTsKCgoKICAgICAgICBsaXN0T3V0LmFkZChkdG8pOwoKICAgIH0KCgoKICAgIExPR0dFUi5pbmZvKCJnZXRLQkF0dGFjaExpc3Q6IHJvd3M9IiArIHJvd3MuZ2V0TGVuZ3RoKCkgKyAiLCBtYXBwZWQ9IiArIGxpc3RPdXQuc2l6ZSgpKTsKCiAgICByZXR1cm4gbGlzdE91dDsKCn0K