Skip to content

Commit 21eb0e0

Browse files
committed
ARTEMIS-5367 - add a max address preference for the broker diagram and also a filter
1 parent cb5596b commit 21eb0e0

File tree

4 files changed

+61
-11
lines changed

4 files changed

+61
-11
lines changed

artemis-console-extension/artemis-extension/src/artemis-extension/artemis/ArtemisPreferences.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717
import { CardBody, Flex, FlexItem, Form, FormGroup, FormSection, MenuToggle, MenuToggleElement, Select, SelectList, SelectOption, TextInput } from '@patternfly/react-core'
18-
import React, { useState } from 'react'
18+
import React, { FormEvent, useState } from 'react'
1919
import { artemisPreferencesService, ArtemisOptions } from './artemis-preferences-service'
2020
import { Icon, Tooltip } from '@patternfly/react-core'
2121
import { HelpIcon } from '@patternfly/react-icons'
@@ -60,6 +60,8 @@ const ArtemisPreferencesForm: React.FunctionComponent = () => {
6060
const [selectedFormat, setSelectedFormat] = useState(format ? format.description : off.description);
6161

6262
const [selectedPageSize, setSelectedPageSize] = useState(artemisPreferencesService.loadArtemisPreferences().artemisDefaultPageSize)
63+
const [artemisMaxDiagramAddressSize, setArtemisMaxDiagramAddressSize] = useState(artemisPreferencesService.loadArtemisPreferences().artemisMaxDiagramAddressSize)
64+
6365
const [isPageSizeDropdownOpen, setPageSizeDropdownOpen] = React.useState(false);
6466

6567
const updatePreferences = (value: string | number | boolean, key: keyof ArtemisOptions): void => {
@@ -101,6 +103,10 @@ const ArtemisPreferencesForm: React.FunctionComponent = () => {
101103
artemisPreferencesService.resetPageSizes();
102104
}
103105

106+
const handleMaxDiagramAddressSize = (event: FormEvent<HTMLInputElement>, value: string) => {
107+
setArtemisMaxDiagramAddressSize(Number(value));
108+
updatePreferences(Number(value), 'artemisMaxDiagramAddressSize');
109+
}
104110

105111
return (
106112
<FormSection title='Artemis' titleElement='h2'>
@@ -197,6 +203,20 @@ const ArtemisPreferencesForm: React.FunctionComponent = () => {
197203
</Flex>
198204
</FormGroup>
199205

206+
<FormGroup
207+
hasNoPaddingTop
208+
label='Max Diagram Address Size'
209+
fieldId='artemis-form-diagram'
210+
labelIcon={<TooltipHelpIcon tooltip='How many addresses will be loaded in the broker diagram tab' />}
211+
>
212+
<TextInput
213+
id='artemis-input-diagram'
214+
type='number'
215+
value={artemisMaxDiagramAddressSize}
216+
onChange={handleMaxDiagramAddressSize}
217+
/>
218+
</FormGroup>
219+
200220
</FormSection>
201221
)
202222
}

artemis-console-extension/artemis-extension/src/artemis-extension/artemis/artemis-preferences-service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ export type ArtemisOptions = {
3939
artemisExpiryQueue: string
4040
artemisBrowseBytesMessages: number
4141
artemisDefaultPageSize: number
42+
artemisMaxDiagramAddressSize: number
4243
}
4344

4445
export const ARTEMIS_PREFERENCES_DEFAULT_VALUES: ArtemisOptions = {
4546
artemisDLQ: "^DLQ$",
4647
artemisExpiryQueue: "^ExpiryQueue$",
4748
artemisBrowseBytesMessages: 99,
48-
artemisDefaultPageSize: 10
49+
artemisDefaultPageSize: 10,
50+
artemisMaxDiagramAddressSize: 20
4951
} as const
5052

5153
export const STORAGE_KEY_ARTEMIS_PREFERENCES = 'artemis.preferences'

artemis-console-extension/artemis-extension/src/artemis-extension/artemis/artemis-service.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class ArtemisService {
202202
return await this.brokerInfo;
203203
}
204204

205-
async createBrokerTopology(): Promise<BrokerTopology> {
205+
async createBrokerTopology(maxAddresses: number, addressFilter: string): Promise<BrokerTopology> {
206206
return new Promise<BrokerTopology>(async (resolve, reject) => {
207207
try {
208208
var brokerInfo = await this.getBrokerInfo();
@@ -213,7 +213,10 @@ class ArtemisService {
213213
broker: brokerInfo,
214214
addresses: []
215215
}
216-
var addresses: string[] = await this.getAllAddresses();
216+
var addresses: string[] = (await this.getAllAddresses(addressFilter));
217+
var max: number = maxAddresses < addresses.length ? maxAddresses: addresses.length;
218+
addresses = addresses.slice(0, max);
219+
log.info()
217220
for (const address of addresses) {
218221
var queuesJson: string = await this.getQueuesForAddress(address);
219222
var queues: Queue[] = JSON.parse(queuesJson).data;
@@ -395,11 +398,18 @@ class ArtemisService {
395398
return await jolokiaService.execute(await this.getBrokerObjectName(), LIST_ADDRESSES_SIG, [JSON.stringify(addressesFilter), page, perPage]) as string;
396399
}
397400

398-
async getAllAddresses(): Promise<string[]> {
401+
async getAllAddresses(addressFilter: string): Promise<string[]> {
399402
return new Promise<string[]>(async (resolve, reject) => {
400403
var addressesString = await jolokiaService.execute(await this.getBrokerObjectName(), LIST_ALL_ADDRESSES_SIG, [',']) as string;
401404
if (addressesString) {
402-
resolve(addressesString.split(','));
405+
406+
var addressArray = addressesString.split(',')
407+
if (addressFilter && addressFilter.length > 0) {
408+
var filtered = addressArray.filter(function (str) { return str.includes(addressFilter); });
409+
resolve(filtered);
410+
} else {
411+
resolve(addressArray);
412+
}
403413
}
404414
reject("invalid response:" + addressesString);
405415
});

artemis-console-extension/artemis-extension/src/artemis-extension/artemis/brokers/BrokerDiagram.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,11 @@ import {
6060
import { useEffect, useState } from 'react';
6161
import { artemisService, BrokerInfo, BrokerTopology } from '../artemis-service';
6262
import { Attributes } from '@hawtio/react';
63-
import { ToolbarItem, Select, SelectOption, Button, MenuToggleElement, MenuToggle, SelectList } from '@patternfly/react-core';
63+
import { ToolbarItem, Select, SelectOption, Button, MenuToggleElement, MenuToggle, SelectList, TextInput, Label, SearchInput, Text } from '@patternfly/react-core';
6464
import { createAddressObjectName, createQueueObjectName } from '../util/jmx';
6565
import { ArtemisContext } from '../context';
6666
import { log } from '../globals';
67+
import { artemisPreferencesService } from '../artemis-preferences-service';
6768

6869

6970
const BadgeColors = [
@@ -302,12 +303,17 @@ export const BrokerDiagram: React.FunctionComponent = () => {
302303
const [ showSidebar, setShowSidebar ] = React.useState(false);
303304
const [ sidebarTitle, setSidebarTitle ] = React.useState("");
304305
const [ brokerTopology, setBrokerTopology ] = React.useState<BrokerTopology>();
305-
const[ topologyLoaded, setTopologyLoaded ] = React.useState(false);
306+
const [ topologyLoaded, setTopologyLoaded ] = React.useState(false);
307+
const [ addressFilter, setAddressFilter ] = React.useState('');
306308

307309

310+
const maxAddresses: number = artemisPreferencesService.loadArtemisPreferences().artemisMaxDiagramAddressSize;
308311

309312
const { findAndSelectNode } = React.useContext(ArtemisContext);
310313

314+
const onSearchTextChange = (newValue: string) => {
315+
setAddressFilter(newValue);
316+
};
311317

312318
const selectNode = React.useCallback((data: any) => {
313319
if (data.queue != null) {
@@ -367,7 +373,7 @@ export const BrokerDiagram: React.FunctionComponent = () => {
367373

368374
useEffect(() => {
369375
if (!topologyLoaded) {
370-
artemisService.createBrokerTopology().then(brokerTopology => {
376+
artemisService.createBrokerTopology(maxAddresses, addressFilter).then(brokerTopology => {
371377
setTopologyLoaded(true);
372378
setBrokerTopology(brokerTopology);
373379
});
@@ -563,9 +569,21 @@ export const BrokerDiagram: React.FunctionComponent = () => {
563569
onClick={() => setViewOptions(prev => ({ ...prev, showConnectors: !prev.showConnectors }))}>Connectors</SelectOption>
564570
</SelectList>
565571
</Select>
566-
</ToolbarItem><ToolbarItem>
572+
</ToolbarItem>
573+
<ToolbarItem>
574+
<SearchInput
575+
aria-label="With filters example search input" hint={addressFilter == '' ? 'Address Filter':''}
576+
onChange={(_event, value) => onSearchTextChange(value)}
577+
value={addressFilter}
578+
onClear={() => {
579+
onSearchTextChange('');
580+
}}
581+
/>
582+
583+
</ToolbarItem>
584+
<ToolbarItem>
567585
<Button onClick={() => setTopologyLoaded(false)}>Refresh</Button>
568-
</ToolbarItem></>
586+
</ToolbarItem></>
569587
);
570588

571589
const topologySideBar = (

0 commit comments

Comments
 (0)