in artemis-console-extension/artemis-extension/packages/artemis-console-plugin/src/context.ts [27:107]
export function useArtemisTree() {
const [tree, setTree] = useState(MBeanTree.createEmpty(artemisPluginName))
const [loaded, setLoaded] = useState(false)
const [brokerNode, setBrokerNode] = useState<MBeanNode>();
const { selectedNode, setSelectedNode } = useContext(PluginNodeSelectionContext)
const navigate = useNavigate();
const populateTree = async () => {
const wkspTree: MBeanTree = await workspace.getTree();
const config = await configManager.getArtemisconfig();
const rootNode = wkspTree.find(node => node.name === config.jmx.domain)
if (rootNode && rootNode.children && rootNode.children.length > 0) {
if (rootNode.children[0].objectName) {
rootNode.children[0].addMetadata("type", "brokerType");
setBrokerNode(rootNode.children[0]);
}
if (rootNode.children[1].objectName) {
rootNode.children[1].addMetadata("type", "brokerType");
setBrokerNode(rootNode.children[1]);
}
// Expand the nodes to redisplay the path
if (selectedNode) {
rootNode.forEach(selectedNode?.path(), (node: MBeanNode) => {
const tvd = node as TreeViewDataItem
tvd.defaultExpanded = true
})
}
var subTree: MBeanTree = MBeanTree.createFromNodes(artemisPluginName, [rootNode])
setTree(subTree)
} else {
setTree(wkspTree)
// No Artemis contexts so redirect to the JMX view and select the first tree node
navigate('jmx')
eventService.notify({
type: 'warning',
message: 'No Artemis domain detected in target. Redirecting to back to jmx.',
})
}
}
useEffect(() => {
const loadTree = async () => {
await populateTree()
setLoaded(true)
}
const listener = () => {
setLoaded(false)
loadTree()
}
eventService.onRefresh(listener)
loadTree()
return () => eventService.removeListener(EVENT_REFRESH, listener)
/*
* This effect should only be called on mount so cannot depend on selectedNode
* But cannot have [] removed either as this seems to execute the effect repeatedly
* So disable the lint check.
*/
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const findAndSelectNode = (objectName: string, name: string) => {
var node: MBeanNode | null = tree.find(node => {
return node.objectName === objectName
});
if (!node) {
//need some special sauce here if we are lazy loading to populate the mbean
const parentNode = tree.find(node => node.name === "addresses");
node = new MBeanNode(parentNode, name, false);
node.objectName = objectName;
parentNode?.children?.push(node);
}
setSelectedNode(node);
}
return { tree, loaded, brokerNode, selectedNode, setSelectedNode, findAndSelectNode }
}