import org.apache.axis.message.MessageElement;
import org.w3c.dom.*;
import java.util.LinkedHashMap;
public LinkedHashMap<String, String> getTitleData(int iftSid, String userType) throws Exception {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
IQKB_XMLSoapProxy service = new IQKB_XMLSoapProxy();
WsGetTreeAllKBResponseWsGetTreeAllKBResult result =
service.wsGetTreeAllKB(strValidCode, 1, channelMap.get(userType), iftSid, 1);
MessageElement[] anyArr = result.get_any();
LOGGER.info(vaildLog("### method:getTitleData, webservice:wsGetTreeAllKB"));
LOGGER.info(vaildLog("### req:" + "wsGetTreeAllKB(" + strValidCode + ", 1, "
+ channelMap.get(userType) + ", " + iftSid + ", 1)"));
LOGGER.info(vaildLog("### data:" + (anyArr != null && anyArr.length > 0 ? anyArr[0] : "null")));
if (anyArr == null || anyArr.length == 0) {
LOGGER.warn("getTitleData: result.get_any() is empty");
return map;
}
// 1) Find <diffgram> element (skip schema)
Element diffgram = null;
for (MessageElement me : anyArr) {
String ln = me.getLocalName();
if ("diffgram".equalsIgnoreCase(ln)) {
diffgram = me;
break;
}
}
if (diffgram == null) {
LOGGER.warn("getTitleData: <diffgram> not found");
return map;
}
// 2) Navigate into <IQKB> (sometimes data root is here)
Element dataRoot = firstChildElementByLocalName(diffgram, "IQKB");
if (dataRoot == null) dataRoot = diffgram;
// 3) Each row is <TreeAllKB>
NodeList rows = dataRoot.getElementsByTagName("TreeAllKB");
if (rows == null || rows.getLength() == 0) {
LOGGER.warn("getTitleData: no <TreeAllKB> rows inside <IQKB>");
return map;
}
for (int i = 0; i < rows.getLength(); i++) {
Element row = (Element) rows.item(i);
// Extract fields inside the same row
String sid = getChildText(row, "ifq_sid");
String name = getChildText(row, "sfq_name");
if (!sid.isBlank()) {
map.put(sid.trim(), name == null ? "" : name.trim());
}
}
LOGGER.info("getTitleData: rows=" + rows.getLength() + ", mapped=" + map.size());
return map;
}
/* ===================== Shared Private Helpers ===================== */
/** Find the first child element by localName or nodeName (ignores prefix) */
private static Element firstChildElementByLocalName(Element parent, String local) {
for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
if (n.getNodeType() == Node.ELEMENT_NODE) {
String ln = n.getLocalName(); // may be null (no namespace)
String nn = n.getNodeName(); // e.g. "diffgr:diffgram"
if (local.equals(nn) || local.equalsIgnoreCase(ln)) {
return (Element) n;
}
}
}
return null;
}
/** Get the text value of a tag (Axis compatible; avoids getTextContent()) */
private static String getChildText(Element parent, String tag) {
NodeList nl = parent.getElementsByTagName(tag);
if (nl == null || nl.getLength() == 0) return "";
return getNodeTextCompat(nl.item(0)).trim();
}
/** Collect text content from TEXT_NODE or CDATA_SECTION_NODE */
private static String getNodeTextCompat(Node node) {
if (node == null) return "";
StringBuilder sb = new StringBuilder();
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node c = children.item(i);
short t = c.getNodeType();
if (t == Node.TEXT_NODE || t == Node.CDATA_SECTION_NODE) {
sb.append(c.getNodeValue());
}
}
return sb.toString();
}
aW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLk1lc3NhZ2VFbGVtZW50OwoKaW1wb3J0IG9yZy53M2MuZG9tLio7CgoKCmltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKCgoKcHVibGljIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFRpdGxlRGF0YShpbnQgaWZ0U2lkLCBTdHJpbmcgdXNlclR5cGUpIHRocm93cyBFeGNlcHRpb24gewoKICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCgoKICAgIElRS0JfWE1MU29hcFByb3h5IHNlcnZpY2UgPSBuZXcgSVFLQl9YTUxTb2FwUHJveHkoKTsKCiAgICBXc0dldFRyZWVBbGxLQlJlc3BvbnNlV3NHZXRUcmVlQWxsS0JSZXN1bHQgcmVzdWx0ID0KCiAgICAgICAgICAgIHNlcnZpY2Uud3NHZXRUcmVlQWxsS0Ioc3RyVmFsaWRDb2RlLCAxLCBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSksIGlmdFNpZCwgMSk7CgoKCiAgICBNZXNzYWdlRWxlbWVudFtdIGFueUFyciA9IHJlc3VsdC5nZXRfYW55KCk7CgoKCiAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIG1ldGhvZDpnZXRUaXRsZURhdGEsIHdlYnNlcnZpY2U6d3NHZXRUcmVlQWxsS0IiKSk7CgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyByZXE6IiArICJ3c0dldFRyZWVBbGxLQigiICsgc3RyVmFsaWRDb2RlICsgIiwgMSwgIgoKICAgICAgICAgICAgKyBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSkgKyAiLCAiICsgaWZ0U2lkICsgIiwgMSkiKSk7CgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyBkYXRhOiIgKyAoYW55QXJyICE9IG51bGwgJiYgYW55QXJyLmxlbmd0aCA+IDAgPyBhbnlBcnJbMF0gOiAibnVsbCIpKSk7CgoKCiAgICBpZiAoYW55QXJyID09IG51bGwgfHwgYW55QXJyLmxlbmd0aCA9PSAwKSB7CgogICAgICAgIExPR0dFUi53YXJuKCJnZXRUaXRsZURhdGE6IHJlc3VsdC5nZXRfYW55KCkgaXMgZW1wdHkiKTsKCiAgICAgICAgcmV0dXJuIG1hcDsKCiAgICB9CgoKCiAgICAvLyAxKSBGaW5kIDxkaWZmZ3JhbT4gZWxlbWVudCAoc2tpcCBzY2hlbWEpCgogICAgRWxlbWVudCBkaWZmZ3JhbSA9IG51bGw7CgogICAgZm9yIChNZXNzYWdlRWxlbWVudCBtZSA6IGFueUFycikgewoKICAgICAgICBTdHJpbmcgbG4gPSBtZS5nZXRMb2NhbE5hbWUoKTsKCiAgICAgICAgaWYgKCJkaWZmZ3JhbSIuZXF1YWxzSWdub3JlQ2FzZShsbikpIHsKCiAgICAgICAgICAgIGRpZmZncmFtID0gbWU7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgfQoKICAgIH0KCiAgICBpZiAoZGlmZmdyYW0gPT0gbnVsbCkgewoKICAgICAgICBMT0dHRVIud2FybigiZ2V0VGl0bGVEYXRhOiA8ZGlmZmdyYW0+IG5vdCBmb3VuZCIpOwoKICAgICAgICByZXR1cm4gbWFwOwoKICAgIH0KCgoKICAgIC8vIDIpIE5hdmlnYXRlIGludG8gPElRS0I+IChzb21ldGltZXMgZGF0YSByb290IGlzIGhlcmUpCgogICAgRWxlbWVudCBkYXRhUm9vdCA9IGZpcnN0Q2hpbGRFbGVtZW50QnlMb2NhbE5hbWUoZGlmZmdyYW0sICJJUUtCIik7CgogICAgaWYgKGRhdGFSb290ID09IG51bGwpIGRhdGFSb290ID0gZGlmZmdyYW07CgoKCiAgICAvLyAzKSBFYWNoIHJvdyBpcyA8VHJlZUFsbEtCPgoKICAgIE5vZGVMaXN0IHJvd3MgPSBkYXRhUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVHJlZUFsbEtCIik7CgogICAgaWYgKHJvd3MgPT0gbnVsbCB8fCByb3dzLmdldExlbmd0aCgpID09IDApIHsKCiAgICAgICAgTE9HR0VSLndhcm4oImdldFRpdGxlRGF0YTogbm8gPFRyZWVBbGxLQj4gcm93cyBpbnNpZGUgPElRS0I+Iik7CgogICAgICAgIHJldHVybiBtYXA7CgogICAgfQoKCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzLmdldExlbmd0aCgpOyBpKyspIHsKCiAgICAgICAgRWxlbWVudCByb3cgPSAoRWxlbWVudCkgcm93cy5pdGVtKGkpOwoKCgogICAgICAgIC8vIEV4dHJhY3QgZmllbGRzIGluc2lkZSB0aGUgc2FtZSByb3cKCiAgICAgICAgU3RyaW5nIHNpZCAgPSBnZXRDaGlsZFRleHQocm93LCAiaWZxX3NpZCIpOwoKICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENoaWxkVGV4dChyb3csICJzZnFfbmFtZSIpOwoKCgogICAgICAgIGlmICghc2lkLmlzQmxhbmsoKSkgewoKICAgICAgICAgICAgbWFwLnB1dChzaWQudHJpbSgpLCBuYW1lID09IG51bGwgPyAiIiA6IG5hbWUudHJpbSgpKTsKCiAgICAgICAgfQoKICAgIH0KCgoKICAgIExPR0dFUi5pbmZvKCJnZXRUaXRsZURhdGE6IHJvd3M9IiArIHJvd3MuZ2V0TGVuZ3RoKCkgKyAiLCBtYXBwZWQ9IiArIG1hcC5zaXplKCkpOwoKICAgIHJldHVybiBtYXA7Cgp9CgoKCi8qID09PT09PT09PT09PT09PT09PT09PSBTaGFyZWQgUHJpdmF0ZSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09PSAqLwoKCgovKiogRmluZCB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBieSBsb2NhbE5hbWUgb3Igbm9kZU5hbWUgKGlnbm9yZXMgcHJlZml4KSAqLwoKcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBmaXJzdENoaWxkRWxlbWVudEJ5TG9jYWxOYW1lKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbG9jYWwpIHsKCiAgICBmb3IgKE5vZGUgbiA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG4gIT0gbnVsbDsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkgewoKICAgICAgICBpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CgogICAgICAgICAgICBTdHJpbmcgbG4gPSBuLmdldExvY2FsTmFtZSgpOyAvLyBtYXkgYmUgbnVsbCAobm8gbmFtZXNwYWNlKQoKICAgICAgICAgICAgU3RyaW5nIG5uID0gbi5nZXROb2RlTmFtZSgpOyAgLy8gZS5nLiAiZGlmZmdyOmRpZmZncmFtIgoKICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyhubikgfHwgbG9jYWwuZXF1YWxzSWdub3JlQ2FzZShsbikpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gKEVsZW1lbnQpIG47CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIG51bGw7Cgp9CgoKCi8qKiBHZXQgdGhlIHRleHQgdmFsdWUgb2YgYSB0YWcgKEF4aXMgY29tcGF0aWJsZTsgYXZvaWRzIGdldFRleHRDb250ZW50KCkpICovCgpwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnKSB7CgogICAgTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKCiAgICBpZiAobmwgPT0gbnVsbCB8fCBubC5nZXRMZW5ndGgoKSA9PSAwKSByZXR1cm4gIiI7CgogICAgcmV0dXJuIGdldE5vZGVUZXh0Q29tcGF0KG5sLml0ZW0oMCkpLnRyaW0oKTsKCn0KCgoKLyoqIENvbGxlY3QgdGV4dCBjb250ZW50IGZyb20gVEVYVF9OT0RFIG9yIENEQVRBX1NFQ1RJT05fTk9ERSAqLwoKcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0Q29tcGF0KE5vZGUgbm9kZSkgewoKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAiIjsKCiAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKCiAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewoKICAgICAgICBOb2RlIGMgPSBjaGlsZHJlbi5pdGVtKGkpOwoKICAgICAgICBzaG9ydCB0ID0gYy5nZXROb2RlVHlwZSgpOwoKICAgICAgICBpZiAodCA9PSBOb2RlLlRFWFRfTk9ERSB8fCB0ID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSB7CgogICAgICAgICAgICBzYi5hcHBlbmQoYy5nZXROb2RlVmFsdWUoKSk7CgogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgp9Cg==