public List<TreeNodeBean> transformTree(String userType) throws Exception {
WsGetTreeSubdirResponseWsGetTreeSubdirResult result =
service.wsGetTreeSubdir(strValidCode, 1, channelMap.get(userType), 0);
MessageElement[] anyArray = result.get_any();
if (anyArray == null || anyArray.length == 0) {
return List.of();
}
// 1) 取第一個 MessageElement (其實就是 <diffgr:diffgram>)
MessageElement diffgram = anyArray[0];
// 2) 找內層 <TreeSubdir>
NodeList list = diffgram.getElementsByTagName("TreeSubdir");
if (list == null || list.getLength() == 0) {
LOGGER.warn("找不到任何 TreeSubdir 節點");
return List.of();
}
// 3) flat list
List<TreeNodeBean> flatList = new ArrayList<>(list.getLength());
for (int i = 0; i < list.getLength(); i++) {
Element e = (Element) list.item(i);
String sftPath = getChildText(e, "sft_path");
String iftSid = getChildText(e, "ift_sid");
String sftName = getChildText(e, "sft_name");
String iKBCount = getChildText(e, "iKBCount");
String dInit = getChildText(e, "dinit_time");
String dModi = getChildText(e, "dmodi_time");
String iftPrev = getChildText(e, "ift_prev");
TreeNodeBean child = new TreeNodeBean.Builder()
.ftSid(iftSid)
.ftName(sftName)
.parent(iftPrev)
.pathRaw(sftPath)
.pathParts(splitPathSafe(sftPath))
.kBCount(parseIntOrNull(iKBCount))
.initTime(parseDateTimeSafely(dInit, FORMATTER))
.modiTime(parseDateTimeSafely(dModi, FORMATTER))
.build();
flatList.add(child);
}
// 4) 建樹
List<TreeNodeBean> roots = TreeUtils.buildTree(flatList);
return roots.isEmpty() ? List.of() : roots.get(0).getChildren();
}
cHVibGljIExpc3Q8VHJlZU5vZGVCZWFuPiB0cmFuc2Zvcm1UcmVlKFN0cmluZyB1c2VyVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CgogICAgV3NHZXRUcmVlU3ViZGlyUmVzcG9uc2VXc0dldFRyZWVTdWJkaXJSZXN1bHQgcmVzdWx0ID0KCiAgICAgICAgICAgIHNlcnZpY2Uud3NHZXRUcmVlU3ViZGlyKHN0clZhbGlkQ29kZSwgMSwgY2hhbm5lbE1hcC5nZXQodXNlclR5cGUpLCAwKTsKCgoKICAgIE1lc3NhZ2VFbGVtZW50W10gYW55QXJyYXkgPSByZXN1bHQuZ2V0X2FueSgpOwoKICAgIGlmIChhbnlBcnJheSA9PSBudWxsIHx8IGFueUFycmF5Lmxlbmd0aCA9PSAwKSB7CgogICAgICAgIHJldHVybiBMaXN0Lm9mKCk7CgogICAgfQoKCgogICAgLy8gMSkg5Y+W56ys5LiA5YCLIE1lc3NhZ2VFbGVtZW50ICjlhbblr6blsLHmmK8gPGRpZmZncjpkaWZmZ3JhbT4pCgogICAgTWVzc2FnZUVsZW1lbnQgZGlmZmdyYW0gPSBhbnlBcnJheVswXTsKCgoKICAgIC8vIDIpIOaJvuWFp+WxpCA8VHJlZVN1YmRpcj4KCiAgICBOb2RlTGlzdCBsaXN0ID0gZGlmZmdyYW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRyZWVTdWJkaXIiKTsKCiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewoKICAgICAgICBMT0dHRVIud2Fybigi5om+5LiN5Yiw5Lu75L2VIFRyZWVTdWJkaXIg56+A6bueIik7CgogICAgICAgIHJldHVybiBMaXN0Lm9mKCk7CgogICAgfQoKCgogICAgLy8gMykgZmxhdCBsaXN0CgogICAgTGlzdDxUcmVlTm9kZUJlYW4+IGZsYXRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KGxpc3QuZ2V0TGVuZ3RoKCkpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CgogICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSBsaXN0Lml0ZW0oaSk7CgoKCiAgICAgICAgU3RyaW5nIHNmdFBhdGggID0gZ2V0Q2hpbGRUZXh0KGUsICJzZnRfcGF0aCIpOwoKICAgICAgICBTdHJpbmcgaWZ0U2lkICAgPSBnZXRDaGlsZFRleHQoZSwgImlmdF9zaWQiKTsKCiAgICAgICAgU3RyaW5nIHNmdE5hbWUgID0gZ2V0Q2hpbGRUZXh0KGUsICJzZnRfbmFtZSIpOwoKICAgICAgICBTdHJpbmcgaUtCQ291bnQgPSBnZXRDaGlsZFRleHQoZSwgImlLQkNvdW50Iik7CgogICAgICAgIFN0cmluZyBkSW5pdCAgICA9IGdldENoaWxkVGV4dChlLCAiZGluaXRfdGltZSIpOwoKICAgICAgICBTdHJpbmcgZE1vZGkgICAgPSBnZXRDaGlsZFRleHQoZSwgImRtb2RpX3RpbWUiKTsKCiAgICAgICAgU3RyaW5nIGlmdFByZXYgID0gZ2V0Q2hpbGRUZXh0KGUsICJpZnRfcHJldiIpOwoKCgogICAgICAgIFRyZWVOb2RlQmVhbiBjaGlsZCA9IG5ldyBUcmVlTm9kZUJlYW4uQnVpbGRlcigpCgogICAgICAgICAgICAgICAgLmZ0U2lkKGlmdFNpZCkKCiAgICAgICAgICAgICAgICAuZnROYW1lKHNmdE5hbWUpCgogICAgICAgICAgICAgICAgLnBhcmVudChpZnRQcmV2KQoKICAgICAgICAgICAgICAgIC5wYXRoUmF3KHNmdFBhdGgpCgogICAgICAgICAgICAgICAgLnBhdGhQYXJ0cyhzcGxpdFBhdGhTYWZlKHNmdFBhdGgpKQoKICAgICAgICAgICAgICAgIC5rQkNvdW50KHBhcnNlSW50T3JOdWxsKGlLQkNvdW50KSkKCiAgICAgICAgICAgICAgICAuaW5pdFRpbWUocGFyc2VEYXRlVGltZVNhZmVseShkSW5pdCwgRk9STUFUVEVSKSkKCiAgICAgICAgICAgICAgICAubW9kaVRpbWUocGFyc2VEYXRlVGltZVNhZmVseShkTW9kaSwgRk9STUFUVEVSKSkKCiAgICAgICAgICAgICAgICAuYnVpbGQoKTsKCgoKICAgICAgICBmbGF0TGlzdC5hZGQoY2hpbGQpOwoKICAgIH0KCgoKICAgIC8vIDQpIOW7uuaouQoKICAgIExpc3Q8VHJlZU5vZGVCZWFuPiByb290cyA9IFRyZWVVdGlscy5idWlsZFRyZWUoZmxhdExpc3QpOwoKCgogICAgcmV0dXJuIHJvb3RzLmlzRW1wdHkoKSA/IExpc3Qub2YoKSA6IHJvb3RzLmdldCgwKS5nZXRDaGlsZHJlbigpOwoKfQo=