• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

evolvedbinary / elemental / 982

29 Apr 2025 08:34PM UTC coverage: 56.409% (+0.007%) from 56.402%
982

push

circleci

adamretter
[feature] Improve README.md badges

28451 of 55847 branches covered (50.94%)

Branch coverage included in aggregate %.

77468 of 131924 relevant lines covered (58.72%)

0.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/exist-core/src/main/java/org/exist/client/security/UserManagerDialog.java
1
/*
2
 * Elemental
3
 * Copyright (C) 2024, Evolved Binary Ltd
4
 *
5
 * admin@evolvedbinary.com
6
 * https://www.evolvedbinary.com | https://www.elemental.xyz
7
 *
8
 * Use of this software is governed by the Business Source License 1.1
9
 * included in the LICENSE file and at www.mariadb.com/bsl11.
10
 *
11
 * Change Date: 2028-04-27
12
 *
13
 * On the date above, in accordance with the Business Source License, use
14
 * of this software will be governed by the Apache License, Version 2.0.
15
 *
16
 * Additional Use Grant: Production use of the Licensed Work for a permitted
17
 * purpose. A Permitted Purpose is any purpose other than a Competing Use.
18
 * A Competing Use means making the Software available to others in a commercial
19
 * product or service that: substitutes for the Software; substitutes for any
20
 * other product or service we offer using the Software that exists as of the
21
 * date we make the Software available; or offers the same or substantially
22
 * similar functionality as the Software.
23
 *
24
 * NOTE: Parts of this file contain code from 'The eXist-db Authors'.
25
 *       The original license header is included below.
26
 *
27
 * =====================================================================
28
 *
29
 * eXist-db Open Source Native XML Database
30
 * Copyright (C) 2001 The eXist-db Authors
31
 *
32
 * info@exist-db.org
33
 * http://www.exist-db.org
34
 *
35
 * This library is free software; you can redistribute it and/or
36
 * modify it under the terms of the GNU Lesser General Public
37
 * License as published by the Free Software Foundation; either
38
 * version 2.1 of the License, or (at your option) any later version.
39
 *
40
 * This library is distributed in the hope that it will be useful,
41
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
43
 * Lesser General Public License for more details.
44
 *
45
 * You should have received a copy of the GNU Lesser General Public
46
 * License along with this library; if not, write to the Free Software
47
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
48
 */
49
package org.exist.client.security;
50

51
import org.exist.client.DialogCompleteWithResponse;
52
import java.awt.event.WindowAdapter;
53
import java.awt.event.WindowEvent;
54
import java.util.Arrays;
55
import java.util.Properties;
56
import javax.swing.JOptionPane;
57
import javax.swing.table.DefaultTableModel;
58
import javax.swing.table.TableModel;
59
import org.exist.client.ClientFrame;
60
import org.exist.client.HighlightedTableCellRenderer;
61
import org.exist.client.InteractiveClient;
62
import org.exist.security.AXSchemaType;
63
import org.exist.security.Account;
64
import org.exist.security.AccountComparator;
65
import org.exist.security.EXistSchemaType;
66
import org.exist.security.Group;
67
import org.exist.security.SecurityManager;
68
import org.exist.xmldb.UserManagementService;
69
import org.xmldb.api.base.XMLDBException;
70

71
/**
72
 *
73
 * @author <a href="mailto:adam@evolvedbinary.com">Adam Retter</a>
74
 */
75
public class UserManagerDialog extends javax.swing.JFrame {
76

77
    private static final long serialVersionUID = 2091215304766070041L;
78

79
    private UserManagementService userManagementService;
80
    private final String currentUser;
81
    private final ClientFrame client;
82
    
83
    private DefaultTableModel usersTableModel = null;
×
84
    private DefaultTableModel groupsTableModel = null;
×
85

86
    public UserManagerDialog(final UserManagementService userManagementService, final String currentUser, final ClientFrame client) {
×
87
        this.userManagementService = userManagementService;
×
88
        this.currentUser = currentUser;
×
89
        this.client = client;
×
90
        this.setIconImage(InteractiveClient.getElementalIcon(getClass()).getImage());
×
91
        initComponents();
×
92
        tblUsers.setDefaultRenderer(Object.class, new HighlightedTableCellRenderer());
×
93
        tblGroups.setDefaultRenderer(Object.class, new HighlightedTableCellRenderer());
×
94
    }
×
95
    
96
    private TableModel getUsersTableModel() {
97
        if(usersTableModel == null) {
×
98
            
99
            try {
100
                final Account accounts[] = userManagementService.getAccounts();
×
101
                
102
                Arrays.sort(accounts, new AccountComparator());
×
103

104
                final String tableData[][] = new String[accounts.length][3];
×
105
                for(int i = 0; i < accounts.length; i++) {
×
106
                    tableData[i][0] = accounts[i].getName();
×
107
                    tableData[i][1] = accounts[i].getMetadataValue(AXSchemaType.FULLNAME);
×
108
                    tableData[i][2] = accounts[i].getMetadataValue(EXistSchemaType.DESCRIPTION);
×
109
                }
110

111
                usersTableModel = new ReadOnlyDefaultTableModel(
×
112
                    tableData,
×
113
                    new String [] {
×
114
                        "User", "Full Name", "Description"
×
115
                    }
116
                );
117
            } catch(final XMLDBException xmldbe) {
×
118
                JOptionPane.showMessageDialog(this, "Could not get users list: " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
119
            }
120
        }
121
        return usersTableModel;
×
122
    }
123
    
124
    private TableModel getGroupsTableModel() {
125
        if(groupsTableModel == null) {
×
126
            
127
            try {
128
                final String groupNames[] = userManagementService.getGroups();
×
129

130
                Arrays.sort(groupNames);
×
131
                
132
                final String tableData[][] = new String[groupNames.length][2];
×
133
                for(int i = 0; i < groupNames.length; i++) {
×
134
                    tableData[i][0] = groupNames[i];
×
135
                    tableData[i][1] = userManagementService.getGroup(groupNames[i]).getMetadataValue(EXistSchemaType.DESCRIPTION);
×
136
                }
137

138
                groupsTableModel = new ReadOnlyDefaultTableModel(
×
139
                    tableData,
×
140
                    new String [] {
×
141
                        "Group", "Description"
×
142
                    }
143
                );
144
            } catch(final XMLDBException xmldbe) {
×
145
                JOptionPane.showMessageDialog(this, "Could not get groups list: " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
146
            }
147
        }
148
        return groupsTableModel;
×
149
    }
150
    
151
    public void refreshUsersTableModel() {
152
        final int rowCount = usersTableModel.getRowCount();
×
153
        for(int i = 0; i < rowCount; i++) {
×
154
            usersTableModel.removeRow(0);
×
155
        }
156
        
157
        try {
158
            final Account accounts[] = userManagementService.getAccounts();
×
159

160
            Arrays.sort(accounts, new AccountComparator());
×
161

162
            for (Account account : accounts) {
×
163
                usersTableModel.addRow(new String[]{
×
164
                        account.getName(),
×
165
                        account.getMetadataValue(AXSchemaType.FULLNAME),
×
166
                        account.getMetadataValue(EXistSchemaType.DESCRIPTION)
×
167
                });
168
            }
169
        } catch(final XMLDBException xmldbe) {
×
170
            JOptionPane.showMessageDialog(this, "Could not get users list: " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
171
        }
172
    }
×
173
    
174
    public void refreshGroupsTableModel() {
175
        final int rowCount = groupsTableModel.getRowCount();
×
176
        for(int i = 0; i < rowCount; i++) {
×
177
            groupsTableModel.removeRow(0);
×
178
        }
179
        
180
        try {
181
            final String groupNames[] = userManagementService.getGroups();
×
182

183
            Arrays.sort(groupNames);
×
184

185
            for (String groupName : groupNames) {
×
186
                groupsTableModel.addRow(new String[]{
×
187
                        groupName,
×
188
                        userManagementService.getGroup(groupName).getMetadataValue(EXistSchemaType.DESCRIPTION)
×
189
                });
190
            }
191
        } catch(final XMLDBException xmldbe) {
×
192
            JOptionPane.showMessageDialog(this, "Could not get groups list: " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
193
        }
194
    }
×
195
    
196
    private void showUserDialog() {
197
        final UserDialog userDialog = new UserDialog(userManagementService);
×
198
        
199
        userDialog.addWindowListener(new WindowAdapter(){           
×
200
            @Override
201
            public void windowClosed(final WindowEvent e) {
202
                refreshUsersTableModel();
×
203
                refreshGroupsTableModel(); //creating a user may have created a private group for that user
×
204
            }
×
205
        });
206
        
207
        userDialog.setVisible(true);
×
208
    }
×
209
    
210
    private void showGroupDialog() {
211
        final GroupDialog groupDialog = new GroupDialog(userManagementService, currentUser);
×
212
        
213
        groupDialog.addWindowListener(new WindowAdapter(){           
×
214
            @Override
215
            public void windowClosed(final WindowEvent e) {
216
                refreshGroupsTableModel();
×
217
            }
×
218
        });
219
        
220
        groupDialog.setVisible(true);
×
221
    }
×
222

223
    /**
224
     * This method is called from within the constructor to initialize the form.
225
     * WARNING: Do NOT modify this code. The content of this method is always
226
     * regenerated by the Form Editor.
227
     */
228
    @SuppressWarnings("unchecked")
229
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
230
    private void initComponents() {
231

232
        pmUsers = new javax.swing.JPopupMenu();
×
233
        miNewUser = new javax.swing.JMenuItem();
×
234
        miEditUser = new javax.swing.JMenuItem();
×
235
        miRemoveUser = new javax.swing.JMenuItem();
×
236
        pmGroups = new javax.swing.JPopupMenu();
×
237
        miNewGroup = new javax.swing.JMenuItem();
×
238
        miEditGroup = new javax.swing.JMenuItem();
×
239
        miRemoveGroup = new javax.swing.JMenuItem();
×
240
        tpUserManager = new javax.swing.JTabbedPane();
×
241
        spUsers = new javax.swing.JScrollPane();
×
242
        tblUsers = new javax.swing.JTable();
×
243
        spGroups = new javax.swing.JScrollPane();
×
244
        tblGroups = new javax.swing.JTable();
×
245
        jSeparator1 = new javax.swing.JSeparator();
×
246
        btnCreate = new javax.swing.JButton();
×
247
        btnClose = new javax.swing.JButton();
×
248

249
        miNewUser.setText("New User...");
×
250
        miNewUser.addActionListener(this::miNewUserActionPerformed);
×
251
        pmUsers.add(miNewUser);
×
252
        miNewUser.getAccessibleContext().setAccessibleName("New User");
×
253

254
        miEditUser.setText("Edit User...");
×
255
        miEditUser.addActionListener(this::miEditUserActionPerformed);
×
256
        pmUsers.add(miEditUser);
×
257
        miEditUser.getAccessibleContext().setAccessibleName("Edit User");
×
258

259
        miRemoveUser.setText("Remove User");
×
260
        miRemoveUser.addActionListener(this::miRemoveUserActionPerformed);
×
261
        pmUsers.add(miRemoveUser);
×
262

263
        miNewGroup.setText("New Group...");
×
264
        miNewGroup.addActionListener(this::miNewGroupActionPerformed);
×
265
        pmGroups.add(miNewGroup);
×
266
        miNewGroup.getAccessibleContext().setAccessibleName("New Group");
×
267

268
        miEditGroup.setText("Edit Group...");
×
269
        miEditGroup.addActionListener(this::miEditGroupActionPerformed);
×
270
        pmGroups.add(miEditGroup);
×
271
        miEditGroup.getAccessibleContext().setAccessibleName("Edit Group");
×
272

273
        miRemoveGroup.setText("Remove Group");
×
274
        miRemoveGroup.addActionListener(this::miRemoveGroupActionPerformed);
×
275
        pmGroups.add(miRemoveGroup);
×
276

277
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
×
278
        setTitle("User Manager");
×
279

280
        tblUsers.setModel(getUsersTableModel());
×
281
        tblUsers.setAutoCreateRowSorter(true);
×
282
        tblUsers.setComponentPopupMenu(pmUsers);
×
283
        tblUsers.setShowGrid(true);
×
284
        tblUsers.addMouseListener(new java.awt.event.MouseAdapter() {
×
285
            public void mouseClicked(java.awt.event.MouseEvent evt) {
286
                tblUsersMouseClicked(evt);
×
287
            }
×
288
        });
289
        spUsers.setViewportView(tblUsers);
×
290

291
        tpUserManager.addTab("Users", spUsers);
×
292

293
        tblGroups.setModel(getGroupsTableModel());
×
294
        tblGroups.setAutoCreateRowSorter(true);
×
295
        tblGroups.setComponentPopupMenu(pmGroups);
×
296
        tblGroups.setShowGrid(true);
×
297
        tblGroups.addMouseListener(new java.awt.event.MouseAdapter() {
×
298
            public void mouseClicked(java.awt.event.MouseEvent evt) {
299
                tblGroupsMouseClicked(evt);
×
300
            }
×
301
        });
302
        spGroups.setViewportView(tblGroups);
×
303

304
        tpUserManager.addTab("Groups", spGroups);
×
305
        spGroups.getAccessibleContext().setAccessibleName("Groups");
×
306

307
        btnCreate.setText("Create");
×
308
        btnCreate.addActionListener(this::btnCreateActionPerformed);
×
309

310
        btnClose.setText("Close");
×
311
        btnClose.addActionListener(this::btnCloseActionPerformed);
×
312

313
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
×
314
        getContentPane().setLayout(layout);
×
315
        layout.setHorizontalGroup(
×
316
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
317
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
318
                .addContainerGap(250, Short.MAX_VALUE)
×
319
                .addComponent(btnClose)
×
320
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
321
                .addComponent(btnCreate)
×
322
                .addGap(20, 20, 20))
×
323
            .addGroup(layout.createSequentialGroup()
×
324
                .addContainerGap()
×
325
                .addComponent(jSeparator1)
×
326
                .addContainerGap())
×
327
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
328
                .addComponent(tpUserManager, javax.swing.GroupLayout.DEFAULT_SIZE, 439, Short.MAX_VALUE))
×
329
        );
330
        layout.setVerticalGroup(
×
331
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
332
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
333
                .addGap(0, 291, Short.MAX_VALUE)
×
334
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
×
335
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
336
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
337
                    .addComponent(btnCreate)
×
338
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
339
                        .addComponent(btnClose)
×
340
                        .addContainerGap())))
×
341
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
342
                .addGroup(layout.createSequentialGroup()
×
343
                    .addComponent(tpUserManager, javax.swing.GroupLayout.PREFERRED_SIZE, 291, javax.swing.GroupLayout.PREFERRED_SIZE)
×
344
                    .addGap(0, 51, Short.MAX_VALUE)))
×
345
        );
346

347
        tpUserManager.getAccessibleContext().setAccessibleName("Users");
×
348

349
        pack();
×
350
    }// </editor-fold>//GEN-END:initComponents
×
351

352
    private void miNewUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miNewUserActionPerformed
353
        showUserDialog();
×
354
    }//GEN-LAST:event_miNewUserActionPerformed
×
355

356
    private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed
357
        setVisible(false);
×
358
        dispose();
×
359
    }//GEN-LAST:event_btnCloseActionPerformed
×
360

361
    private String getSelectedUsername() {
362
        return (String)tblUsers.getValueAt(tblUsers.getSelectedRow(), 0);
×
363
    }
364
    
365
    private String getSelectedGroup() {
366
        return (String)tblGroups.getValueAt(tblGroups.getSelectedRow(), 0);
×
367
    }
368
    
369
    private void miRemoveUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miRemoveUserActionPerformed
370

371
        final String selectedUsername = getSelectedUsername();
×
372
        try {
373
            final Account account = userManagementService.getAccount(selectedUsername);
×
374
            userManagementService.removeAccount(account);
×
375
        
376
            usersTableModel.removeRow(tblUsers.getSelectedRow());
×
377
        } catch(final XMLDBException xmldbe) {
×
378
            JOptionPane.showMessageDialog(this, "Could not remove user '" + selectedUsername + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
379
        }
380
    }//GEN-LAST:event_miRemoveUserActionPerformed
×
381

382
    private void miEditUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miEditUserActionPerformed
383
        
384
        final String selectedUsername = getSelectedUsername();
×
385
        try {
386
            final Account account = userManagementService.getAccount(selectedUsername);
×
387
            showEditUserDialog(account);
×
388
        } catch(final XMLDBException xmldbe) {
×
389
            JOptionPane.showMessageDialog(this, "Could not edit user '" + selectedUsername + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
390
        }
391
    }//GEN-LAST:event_miEditUserActionPerformed
×
392
    
393
    private UserManagementService reconnectClientAndUserManager(final String password) throws XMLDBException {
394
        //get client to reconnect with edited users new password
395
        final Properties loginData = new Properties();
×
396
        loginData.setProperty(InteractiveClient.PASSWORD, password);
×
397
        client.reconnectClient(loginData);
×
398

399
        //get reconnected userManagementService
400
        return client.getUserManagementService();
×
401
    }
402
    
403
    private void showEditUserDialog(final Account account) {
404
        
405
        final UserManagerDialog that = this;
×
406
        
407
        final DialogCompleteWithResponse<String> callback = response -> {
×
408
            //get client to reconnect with edited users new password
409
            try {
410
                System.out.println("Detected logged-in user password change, reconnecting to server...");
×
411
                that.userManagementService = reconnectClientAndUserManager(response);
×
412
                System.out.println("Reconnected.");
×
413
            } catch(final XMLDBException xmldbe) {
×
414
                JOptionPane.showMessageDialog(that, "Could not edit user '" + getSelectedUsername() + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
415
            }
416
        };
×
417

418
        final EditUserDialog userDialog = new EditUserDialog(userManagementService, account);
×
419
        if(getSelectedUsername().equals(currentUser)) {
×
420
            //register for password update event, if we are changing the password
421
            //of the current user
422
            userDialog.addDialogCompleteWithResponseCallback(callback);
×
423
        }
424
        
425
        userDialog.addWindowListener(new WindowAdapter(){           
×
426
            @Override
427
            public void windowClosed(final WindowEvent e) {
428
                refreshUsersTableModel();
×
429
            }
×
430
        });
431
        
432
        userDialog.setVisible(true);
×
433
    }
×
434
    
435
    private void showEditGroupDialog(final Group group) {
436
        final EditGroupDialog groupDialog = new EditGroupDialog(userManagementService, currentUser, group);
×
437
        
438
        groupDialog.addWindowListener(new WindowAdapter(){           
×
439
            @Override
440
            public void windowClosed(final WindowEvent e) {
441
                refreshGroupsTableModel();
×
442
            }
×
443
        });
444
        
445
        groupDialog.setVisible(true);
×
446
    }
×
447
    
448
    private void btnCreateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCreateActionPerformed
449
        switch(tpUserManager.getSelectedIndex()) {
×
450
            case 0:
451
                showUserDialog();
×
452
                break;
×
453
            
454
            case 1:
455
                showGroupDialog();
×
456
                break;
×
457
            
458
            default:
459
                return;
×
460
        }
461
    }//GEN-LAST:event_btnCreateActionPerformed
×
462

463
    private void tblUsersMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblUsersMouseClicked
464
        final boolean userSelected = tblUsers.getSelectedRow() > -1;
×
465
        final String selectedUsername = getSelectedUsername();
×
466
        
467
        boolean canModify = userSelected && !selectedUsername.equals(SecurityManager.SYSTEM);
×
468
        boolean canDelete = userSelected && !(selectedUsername.equals(SecurityManager.SYSTEM) || selectedUsername.equals(SecurityManager.DBA_USER) || selectedUsername.equals(SecurityManager.GUEST_USER));
×
469
        miEditUser.setEnabled(canModify);
×
470
        miRemoveUser.setEnabled(canDelete);
×
471
        
472
        if(evt.getClickCount() == 2 && canModify) {
×
473
            
474
            try {
475
                final Account account = userManagementService.getAccount(selectedUsername);
×
476
                showEditUserDialog(account);
×
477
            } catch(final XMLDBException xmldbe) {
×
478
                JOptionPane.showMessageDialog(this, "Could not edit user '" + selectedUsername + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
479
            }
480
        }
481
    }//GEN-LAST:event_tblUsersMouseClicked
×
482

483
    private void miEditGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miEditGroupActionPerformed
484
        final String selectedGroup = getSelectedGroup();
×
485
            try {
486
                final Group group = userManagementService.getGroup(selectedGroup);
×
487
                showEditGroupDialog(group);
×
488
            } catch(final XMLDBException xmldbe) {
×
489
                JOptionPane.showMessageDialog(this, "Could not edit group '" + selectedGroup + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
490
            }
491
    }//GEN-LAST:event_miEditGroupActionPerformed
×
492
    
493
    private void miRemoveGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miRemoveGroupActionPerformed
494
        final String selectedGroup = getSelectedGroup();
×
495
        
496
        try {
497
            final Group group = userManagementService.getGroup(selectedGroup);
×
498
            userManagementService.removeGroup(group);
×
499
        
500
            groupsTableModel.removeRow(tblGroups.getSelectedRow());
×
501
        } catch(final XMLDBException xmldbe) {
×
502
            JOptionPane.showMessageDialog(this, "Could not remove group '" + selectedGroup + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
503
        }
504
    }//GEN-LAST:event_miRemoveGroupActionPerformed
×
505

506
    private void tblGroupsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblGroupsMouseClicked
507
        final boolean groupSelected = tblGroups.getSelectedRow() > -1;
×
508
        final String selectedGroup = getSelectedGroup();
×
509
        
510
        boolean canDelete = groupSelected && !(selectedGroup.equals(SecurityManager.DBA_GROUP) || selectedGroup.equals(SecurityManager.GUEST_GROUP));
×
511
        
512
        miRemoveGroup.setEnabled(canDelete);
×
513
        
514
         if(evt.getClickCount() == 2) {
×
515
            try {
516
                final Group group = userManagementService.getGroup(selectedGroup);
×
517
                showEditGroupDialog(group);
×
518
            } catch(final XMLDBException xmldbe) {
×
519
                JOptionPane.showMessageDialog(this, "Could not edit group '" + selectedGroup + "': " + xmldbe.getMessage(), "User Manager Error", JOptionPane.ERROR_MESSAGE);
×
520
            }
521
        }
522
    }//GEN-LAST:event_tblGroupsMouseClicked
×
523

524
    private void miNewGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miNewGroupActionPerformed
525
       showGroupDialog();
×
526
    }//GEN-LAST:event_miNewGroupActionPerformed
×
527

528
    // Variables declaration - do not modify//GEN-BEGIN:variables
529
    private javax.swing.JButton btnClose;
530
    private javax.swing.JButton btnCreate;
531
    private javax.swing.JSeparator jSeparator1;
532
    private javax.swing.JMenuItem miEditGroup;
533
    private javax.swing.JMenuItem miEditUser;
534
    private javax.swing.JMenuItem miNewGroup;
535
    private javax.swing.JMenuItem miNewUser;
536
    private javax.swing.JMenuItem miRemoveGroup;
537
    private javax.swing.JMenuItem miRemoveUser;
538
    private javax.swing.JPopupMenu pmGroups;
539
    private javax.swing.JPopupMenu pmUsers;
540
    private javax.swing.JScrollPane spGroups;
541
    private javax.swing.JScrollPane spUsers;
542
    private javax.swing.JTable tblGroups;
543
    private javax.swing.JTable tblUsers;
544
    private javax.swing.JTabbedPane tpUserManager;
545
    // End of variables declaration//GEN-END:variables
546
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc