James Moger
2011-10-16 4b430b4b02e96f0257fb70f1aacab1269b0c2aec
commit | author | age
19c634 1 /*
JM 2  * Copyright 2011 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.client;
17
18 import java.awt.BorderLayout;
841651 19 import java.awt.Color;
19c634 20 import java.awt.Component;
841651 21 import java.awt.Desktop;
JM 22 import java.awt.Insets;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
19c634 25 import java.io.IOException;
841651 26 import java.net.URI;
JM 27 import java.text.MessageFormat;
28 import java.util.ArrayList;
29 import java.util.List;
19c634 30
841651 31 import javax.swing.JButton;
JM 32 import javax.swing.JLabel;
da0269 33 import javax.swing.JOptionPane;
19c634 34 import javax.swing.JPanel;
JM 35 import javax.swing.JScrollPane;
36 import javax.swing.JTabbedPane;
37 import javax.swing.JTable;
841651 38 import javax.swing.JTextField;
JM 39 import javax.swing.RowFilter;
40 import javax.swing.SwingConstants;
41 import javax.swing.event.ListSelectionEvent;
42 import javax.swing.event.ListSelectionListener;
43 import javax.swing.table.DefaultTableCellRenderer;
19c634 44 import javax.swing.table.TableCellRenderer;
841651 45 import javax.swing.table.TableRowSorter;
19c634 46
da0269 47 import com.gitblit.Constants.RpcRequest;
841651 48 import com.gitblit.client.ClosableTabComponent.CloseTabListener;
19c634 49 import com.gitblit.models.RepositoryModel;
841651 50 import com.gitblit.models.UserModel;
JM 51 import com.gitblit.utils.StringUtils;
19c634 52
841651 53 /**
JM 54  * GitblitPanel performs the login, all business logic, and contains all widgets
55  * to represent the state of a repository for the given account credentials.
56  * 
57  * @author James Moger
58  * 
59  */
60 public class GitblitPanel extends JPanel implements CloseTabListener {
19c634 61
JM 62     private static final long serialVersionUID = 1L;
63
841651 64     private final int margin = 5;
19c634 65
841651 66     private final Insets insets = new Insets(margin, margin, margin, margin);
JM 67
15a51d 68     private GitblitModel gitblit;
841651 69
JM 70     private JTabbedPane tabs;
19c634 71
JM 72     private JTable repositoriesTable;
841651 73
JM 74     private RepositoriesModel repositoriesModel;
75
4b430b 76     private JTable usersTable;
JM 77
78     private UsersModel usersModel;
841651 79
JM 80     private JPanel usersPanel;
81
82     private JButton createRepository;
83
84     private JButton delRepository;
85
86     private NameRenderer nameRenderer;
87
b7f591 88     private IndicatorsRenderer typeRenderer;
841651 89
JM 90     private DefaultTableCellRenderer ownerRenderer;
91
92     private DefaultTableCellRenderer sizeRenderer;
93
4b430b 94     private TableRowSorter<RepositoriesModel> defaultRepositoriesSorter;
JM 95
96     private TableRowSorter<UsersModel> defaultUsersSorter;
97
98     private JButton editRepository;
841651 99
JM 100     public GitblitPanel(GitblitRegistration reg) {
101         this(reg.url, reg.account, reg.password);
102     }
19c634 103
JM 104     public GitblitPanel(String url, String account, char[] password) {
15a51d 105         this.gitblit = new GitblitModel(url, account, password);
19c634 106
b7f591 107         final JButton browseRepository = new JButton(Translation.get("gb.browse"));
841651 108         browseRepository.setEnabled(false);
JM 109         browseRepository.addActionListener(new ActionListener() {
110             public void actionPerformed(ActionEvent e) {
111                 RepositoryModel model = getSelectedRepositories().get(0);
15a51d 112                 String u = MessageFormat.format("{0}/summary/{1}", gitblit.url,
841651 113                         StringUtils.encodeURL(model.name));
JM 114                 try {
115                     Desktop.getDesktop().browse(new URI(u));
116                 } catch (Exception x) {
117                     x.printStackTrace();
118                 }
119             }
120         });
19c634 121
b7f591 122         JButton refreshRepositories = new JButton(Translation.get("gb.refresh"));
da0269 123         refreshRepositories.addActionListener(new ActionListener() {
JM 124             public void actionPerformed(ActionEvent e) {
15a51d 125                 refreshRepositories();
da0269 126             }
JM 127         });
128
b7f591 129         createRepository = new JButton(Translation.get("gb.create"));
841651 130         createRepository.addActionListener(new ActionListener() {
JM 131             public void actionPerformed(ActionEvent e) {
da0269 132                 createRepository();
841651 133             }
JM 134         });
135
4b430b 136         editRepository = new JButton(Translation.get("gb.edit"));
841651 137         editRepository.setEnabled(false);
JM 138         editRepository.addActionListener(new ActionListener() {
139             public void actionPerformed(ActionEvent e) {
da0269 140                 editRepository(getSelectedRepositories().get(0));
841651 141             }
JM 142         });
143
b7f591 144         delRepository = new JButton(Translation.get("gb.delete"));
841651 145         delRepository.setEnabled(false);
JM 146         delRepository.addActionListener(new ActionListener() {
147             public void actionPerformed(ActionEvent e) {
da0269 148                 deleteRepositories(getSelectedRepositories());
841651 149             }
JM 150         });
151
b7f591 152         final JButton cloneRepository = new JButton(Translation.get("gb.clone"));
841651 153         cloneRepository.setEnabled(false);
JM 154         cloneRepository.addActionListener(new ActionListener() {
155             public void actionPerformed(ActionEvent e) {
156                 for (RepositoryModel model : getSelectedRepositories()) {
157                     System.out.println("TODO Clone " + model);
158                 }
159             }
160         });
161
da0269 162         nameRenderer = new NameRenderer();
b7f591 163         typeRenderer = new IndicatorsRenderer();
841651 164
JM 165         sizeRenderer = new DefaultTableCellRenderer();
166         sizeRenderer.setHorizontalAlignment(SwingConstants.RIGHT);
167         sizeRenderer.setForeground(new Color(0, 0x80, 0));
168
169         ownerRenderer = new DefaultTableCellRenderer();
170         ownerRenderer.setForeground(Color.gray);
171         ownerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
172
173         repositoriesModel = new RepositoriesModel();
4b430b 174         defaultRepositoriesSorter = new TableRowSorter<RepositoriesModel>(repositoriesModel);
JM 175         repositoriesTable = Utils.newTable(repositoriesModel);
176         repositoriesTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
177         repositoriesTable.setRowSorter(defaultRepositoriesSorter);
841651 178         repositoriesTable.getRowSorter().toggleSortOrder(RepositoriesModel.Columns.Name.ordinal());
JM 179
4b430b 180         setRepositoryRenderer(RepositoriesModel.Columns.Name, nameRenderer);
JM 181         setRepositoryRenderer(RepositoriesModel.Columns.Indicators, typeRenderer);
182         setRepositoryRenderer(RepositoriesModel.Columns.Owner, ownerRenderer);
183         setRepositoryRenderer(RepositoriesModel.Columns.Size, sizeRenderer);
841651 184
JM 185         repositoriesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
186             @Override
187             public void valueChanged(ListSelectionEvent e) {
188                 if (e.getValueIsAdjusting()) {
189                     return;
190                 }
191                 boolean singleSelection = repositoriesTable.getSelectedRowCount() == 1;
192                 boolean selected = repositoriesTable.getSelectedRow() > -1;
193                 browseRepository.setEnabled(singleSelection);
194                 delRepository.setEnabled(selected);
195                 cloneRepository.setEnabled(selected);
196                 if (selected) {
197                     int viewRow = repositoriesTable.getSelectedRow();
198                     int modelRow = repositoriesTable.convertRowIndexToModel(viewRow);
199                     RepositoryModel model = ((RepositoriesModel) repositoriesTable.getModel()).list
200                             .get(modelRow);
201                     editRepository.setEnabled(singleSelection
15a51d 202                             && (gitblit.allowAdmin() || gitblit.isOwner(model)));
841651 203                 } else {
JM 204                     editRepository.setEnabled(false);
205                 }
206             }
207         });
208
209         final JTextField repositoryFilter = new JTextField();
210         repositoryFilter.addActionListener(new ActionListener() {
211             public void actionPerformed(ActionEvent e) {
212                 filterRepositories(repositoryFilter.getText());
213             }
214         });
215
216         JPanel filterPanel = new JPanel(new BorderLayout(margin, margin));
b7f591 217         filterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST);
841651 218         filterPanel.add(repositoryFilter, BorderLayout.CENTER);
JM 219
220         JPanel tablePanel = new JPanel(new BorderLayout(margin, margin));
221         tablePanel.add(filterPanel, BorderLayout.NORTH);
222         tablePanel.add(new JScrollPane(repositoriesTable), BorderLayout.CENTER);
223
224         JPanel repositoryControls = new JPanel();
15a51d 225         repositoryControls.add(refreshRepositories);
841651 226         repositoryControls.add(browseRepository);
JM 227         repositoryControls.add(cloneRepository);
228         repositoryControls.add(createRepository);
229         repositoryControls.add(editRepository);
230         repositoryControls.add(delRepository);
231
232         JPanel repositoriesPanel = new JPanel(new BorderLayout(margin, margin));
b7f591 233         repositoriesPanel.add(newHeaderLabel(Translation.get("gb.repositories")),
JM 234                 BorderLayout.NORTH);
841651 235         repositoriesPanel.add(tablePanel, BorderLayout.CENTER);
JM 236         repositoriesPanel.add(repositoryControls, BorderLayout.SOUTH);
237
b7f591 238         JButton refreshUsers = new JButton(Translation.get("gb.refresh"));
da0269 239         refreshUsers.addActionListener(new ActionListener() {
JM 240             public void actionPerformed(ActionEvent e) {
15a51d 241                 refreshUsers();
da0269 242             }
JM 243         });
244
b7f591 245         JButton createUser = new JButton(Translation.get("gb.create"));
841651 246         createUser.addActionListener(new ActionListener() {
JM 247             public void actionPerformed(ActionEvent e) {
da0269 248                 createUser();
841651 249             }
JM 250         });
251
b7f591 252         final JButton editUser = new JButton(Translation.get("gb.edit"));
841651 253         editUser.setEnabled(false);
JM 254         editUser.addActionListener(new ActionListener() {
255             public void actionPerformed(ActionEvent e) {
da0269 256                 editUser(getSelectedUsers().get(0));
841651 257             }
JM 258         });
259
b7f591 260         final JButton delUser = new JButton(Translation.get("gb.delete"));
841651 261         delUser.setEnabled(false);
JM 262         delUser.addActionListener(new ActionListener() {
263             public void actionPerformed(ActionEvent e) {
da0269 264                 deleteUsers(getSelectedUsers());
841651 265             }
JM 266         });
267
4b430b 268         usersModel = new UsersModel();
JM 269         defaultUsersSorter = new TableRowSorter<UsersModel>(usersModel);
270         usersTable = Utils.newTable(usersModel);
271         String name = usersTable.getColumnName(UsersModel.Columns.Name.ordinal());
272         usersTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
273         usersTable.getColumn(name).setCellRenderer(nameRenderer);
274         usersTable.setRowSorter(defaultUsersSorter);
275         usersTable.getRowSorter().toggleSortOrder(UsersModel.Columns.Name.ordinal());
276         usersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
841651 277
JM 278             @Override
279             public void valueChanged(ListSelectionEvent e) {
280                 if (e.getValueIsAdjusting()) {
281                     return;
282                 }
4b430b 283                 boolean selected = usersTable.getSelectedRow() > -1;
JM 284                 boolean singleSelection = usersTable.getSelectedRows().length == 1;
841651 285                 editUser.setEnabled(singleSelection && selected);
JM 286                 delUser.setEnabled(selected);
287             }
288         });
289
4b430b 290         JPanel userControls = new JPanel();
da0269 291         userControls.add(refreshUsers);
841651 292         userControls.add(createUser);
JM 293         userControls.add(editUser);
294         userControls.add(delUser);
295
296         usersPanel = new JPanel(new BorderLayout(margin, margin));
b7f591 297         usersPanel.add(newHeaderLabel(Translation.get("gb.users")), BorderLayout.NORTH);
4b430b 298         usersPanel.add(new JScrollPane(usersTable), BorderLayout.CENTER);
841651 299         usersPanel.add(userControls, BorderLayout.SOUTH);
JM 300
301         tabs = new JTabbedPane(JTabbedPane.BOTTOM);
4b430b 302         tabs.addTab(Translation.get("gb.repositories"), repositoriesPanel);
JM 303         tabs.addTab(Translation.get("gb.users"), usersPanel);
b7f591 304         tabs.addTab(Translation.get("gb.federation"), new JPanel());
19c634 305
JM 306         setLayout(new BorderLayout());
307         add(tabs, BorderLayout.CENTER);
308     }
309
841651 310     private JLabel newHeaderLabel(String text) {
JM 311         JLabel label = new JLabel(text);
312         label.setOpaque(true);
313         label.setForeground(Color.white);
314         label.setBackground(Color.gray);
315         label.setFont(label.getFont().deriveFont(14f));
316         return label;
317     }
318
4b430b 319     private void setRepositoryRenderer(RepositoriesModel.Columns col, TableCellRenderer renderer) {
15a51d 320         String name = repositoriesTable.getColumnName(col.ordinal());
JM 321         repositoriesTable.getColumn(name).setCellRenderer(renderer);
322     }
841651 323
15a51d 324     public void login() throws IOException {
JM 325         gitblit.login();
326
327         updateRepositoriesTable();
328         Utils.packColumns(repositoriesTable, 2);
329
330         if (gitblit.allowAdmin()) {
331             updateUsersTable();
332         } else {
841651 333             // user does not have administrator privileges
JM 334             // hide admin repository buttons
335             createRepository.setVisible(false);
4b430b 336             editRepository.setVisible(false);
841651 337             delRepository.setVisible(false);
JM 338
339             // hide users panel
340             usersPanel.setVisible(false);
341
4b430b 342             while (tabs.getTabCount() > 1) {
JM 343                 // remove admin tabs
344                 tabs.removeTabAt(1);
345             }
841651 346         }
19c634 347     }
JM 348
15a51d 349     private void updateRepositoriesTable() {
841651 350         repositoriesModel.list.clear();
15a51d 351         repositoriesModel.list.addAll(gitblit.getRepositories());
841651 352         repositoriesModel.fireTableDataChanged();
JM 353     }
354
15a51d 355     private void updateUsersTable() {
4b430b 356         usersModel.list.clear();
JM 357         usersModel.list.addAll(gitblit.getUsers());
358         usersModel.fireTableDataChanged();
841651 359     }
JM 360
361     private void filterRepositories(final String fragment) {
362         if (StringUtils.isEmpty(fragment)) {
4b430b 363             repositoriesTable.setRowSorter(defaultRepositoriesSorter);
841651 364             return;
JM 365         }
366         RowFilter<RepositoriesModel, Object> containsFilter = new RowFilter<RepositoriesModel, Object>() {
367             public boolean include(Entry<? extends RepositoriesModel, ? extends Object> entry) {
368                 for (int i = entry.getValueCount() - 1; i >= 0; i--) {
369                     if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) {
370                         return true;
371                     }
372                 }
373                 return false;
374             }
375         };
376         RepositoriesModel model = (RepositoriesModel) repositoriesTable.getModel();
377         TableRowSorter<RepositoriesModel> sorter = new TableRowSorter<RepositoriesModel>(model);
378         sorter.setRowFilter(containsFilter);
379         repositoriesTable.setRowSorter(sorter);
380     }
381
382     private List<RepositoryModel> getSelectedRepositories() {
383         List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
384         for (int viewRow : repositoriesTable.getSelectedRows()) {
385             int modelRow = repositoriesTable.convertRowIndexToModel(viewRow);
4b430b 386             RepositoryModel model = repositoriesModel.list.get(modelRow);
841651 387             repositories.add(model);
JM 388         }
389         return repositories;
390     }
391
392     private List<UserModel> getSelectedUsers() {
393         List<UserModel> users = new ArrayList<UserModel>();
4b430b 394         for (int viewRow : usersTable.getSelectedRows()) {
JM 395             int modelRow = usersTable.convertRowIndexToModel(viewRow);
396             UserModel model = usersModel.list.get(modelRow);
841651 397             users.add(model);
JM 398         }
399         return users;
19c634 400     }
JM 401
841651 402     @Override
JM 403     public Insets getInsets() {
404         return insets;
405     }
406
407     @Override
408     public void closeTab(Component c) {
15a51d 409         gitblit = null;
JM 410     }
411
412     protected void refreshRepositories() {
413         GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_REPOSITORIES) {
414             @Override
415             protected Boolean doRequest() throws IOException {
416                 gitblit.refreshRepositories();
417                 return true;
418             }
419
420             @Override
421             protected void onSuccess() {
422                 updateRepositoriesTable();
423             }
424         };
425         worker.execute();
841651 426     }
da0269 427
JM 428     /**
429      * Displays the create repository dialog and fires a SwingWorker to update
430      * the server, if appropriate.
431      * 
432      */
433     protected void createRepository() {
bcc616 434         EditRepositoryDialog dialog = new EditRepositoryDialog();
15a51d 435         dialog.setUsers(null, gitblit.getUsernames(), null);
JM 436         dialog.setRepositories(gitblit.getRepositories());
da0269 437         dialog.setVisible(true);
JM 438         final RepositoryModel newRepository = dialog.getRepository();
bcc616 439         final List<String> permittedUsers = dialog.getPermittedUsers();
da0269 440         if (newRepository == null) {
JM 441             return;
442         }
443
15a51d 444         GitblitWorker worker = new GitblitWorker(this, RpcRequest.CREATE_REPOSITORY) {
da0269 445
JM 446             @Override
15a51d 447             protected Boolean doRequest() throws IOException {
JM 448                 boolean success = gitblit.createRepository(newRepository, permittedUsers);
449                 if (success) {
450                     gitblit.refreshRepositories();
451                     if (permittedUsers.size() > 0) {
452                         gitblit.refreshUsers();
453                     }
bcc616 454                 }
JM 455                 return success;
da0269 456             }
JM 457
458             @Override
15a51d 459             protected void onSuccess() {
JM 460                 updateRepositoriesTable();
461                 updateUsersTable();
462             }
463
464             @Override
465             protected void onFailure() {
466                 showFailure("Failed to execute request \"{0}\" for repository \"{1}\".",
467                         getRequestType(), newRepository.name);
da0269 468             }
JM 469         };
470         worker.execute();
471     }
472
473     /**
474      * Displays the edit repository dialog and fires a SwingWorker to update the
475      * server, if appropriate.
476      * 
477      * @param repository
478      */
479     protected void editRepository(final RepositoryModel repository) {
bcc616 480         EditRepositoryDialog dialog = new EditRepositoryDialog(repository);
15a51d 481         List<String> usernames = gitblit.getUsernames();
JM 482         List<String> members = gitblit.getPermittedUsernames(repository);
bcc616 483         dialog.setUsers(repository.owner, usernames, members);
15a51d 484         dialog.setFederationSets(gitblit.getFederationSets(), repository.federationSets);
da0269 485         dialog.setVisible(true);
JM 486         final RepositoryModel revisedRepository = dialog.getRepository();
bcc616 487         final List<String> permittedUsers = dialog.getPermittedUsers();
da0269 488         if (revisedRepository == null) {
JM 489             return;
490         }
491
15a51d 492         GitblitWorker worker = new GitblitWorker(this, RpcRequest.EDIT_REPOSITORY) {
da0269 493
JM 494             @Override
15a51d 495             protected Boolean doRequest() throws IOException {
JM 496                 boolean success = gitblit.updateRepository(repository.name, revisedRepository,
497                         permittedUsers);
498                 if (success) {
499                     gitblit.refreshRepositories();
500                     gitblit.refreshUsers();
501                 }
bcc616 502                 return success;
da0269 503             }
JM 504
505             @Override
15a51d 506             protected void onSuccess() {
JM 507                 updateRepositoriesTable();
508                 updateUsersTable();
509             }
510
511             @Override
512             protected void onFailure() {
513                 showFailure("Failed to execute request \"{0}\" for repository \"{1}\".",
514                         getRequestType(), repository.name);
da0269 515             }
JM 516         };
517         worker.execute();
518     }
519
520     protected void deleteRepositories(final List<RepositoryModel> repositories) {
521         if (repositories == null || repositories.size() == 0) {
522             return;
523         }
524         StringBuilder message = new StringBuilder("Delete the following repositories?\n\n");
525         for (RepositoryModel repository : repositories) {
526             message.append(repository.name).append("\n");
527         }
528         int result = JOptionPane.showConfirmDialog(GitblitPanel.this, message.toString(),
529                 "Delete Repositories?", JOptionPane.YES_NO_OPTION);
530         if (result == JOptionPane.YES_OPTION) {
15a51d 531             GitblitWorker worker = new GitblitWorker(this, RpcRequest.DELETE_REPOSITORY) {
da0269 532                 @Override
15a51d 533                 protected Boolean doRequest() throws IOException {
da0269 534                     boolean success = true;
JM 535                     for (RepositoryModel repository : repositories) {
15a51d 536                         success &= gitblit.deleteRepository(repository);
JM 537                     }
538                     if (success) {
539                         gitblit.refreshUsers();
da0269 540                     }
JM 541                     return success;
542                 }
543
544                 @Override
15a51d 545                 protected void onSuccess() {
JM 546                     updateRepositoriesTable();
547                     updateUsersTable();
548                 }
549
550                 @Override
551                 protected void onFailure() {
552                     showFailure("Failed to delete specified repositories!");
da0269 553                 }
JM 554             };
555             worker.execute();
556         }
15a51d 557     }
JM 558
559     protected void refreshUsers() {
560         GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_USERS) {
561             @Override
562             protected Boolean doRequest() throws IOException {
563                 gitblit.refreshUsers();
564                 return true;
565             }
566
567             @Override
568             protected void onSuccess() {
569                 updateUsersTable();
570             }
571         };
572         worker.execute();
da0269 573     }
JM 574
575     /**
576      * Displays the create user dialog and fires a SwingWorker to update the
577      * server, if appropriate.
578      * 
579      */
580     protected void createUser() {
15a51d 581         EditUserDialog dialog = new EditUserDialog(gitblit.getSettings());
JM 582         dialog.setUsers(gitblit.getUsers());
583         dialog.setRepositories(gitblit.getRepositories(), null);
da0269 584         dialog.setVisible(true);
JM 585         final UserModel newUser = dialog.getUser();
586         if (newUser == null) {
587             return;
588         }
589
15a51d 590         GitblitWorker worker = new GitblitWorker(this, RpcRequest.CREATE_USER) {
da0269 591
JM 592             @Override
15a51d 593             protected Boolean doRequest() throws IOException {
JM 594                 boolean success = gitblit.createUser(newUser);
595                 if (success) {
596                     gitblit.refreshUsers();
597                 }
598                 return success;
da0269 599             }
JM 600
601             @Override
15a51d 602             protected void onSuccess() {
JM 603                 updateUsersTable();
604             }
605
606             @Override
607             protected void onFailure() {
608                 showFailure("Failed to execute request \"{0}\" for user \"{1}\".",
609                         getRequestType(), newUser.username);
da0269 610             }
JM 611         };
612         worker.execute();
613     }
614
615     /**
616      * Displays the edit user dialog and fires a SwingWorker to update the
617      * server, if appropriate.
618      * 
619      * @param user
620      */
621     protected void editUser(final UserModel user) {
15a51d 622         EditUserDialog dialog = new EditUserDialog(user, gitblit.getSettings());
JM 623         dialog.setRepositories(gitblit.getRepositories(), new ArrayList<String>(user.repositories));
da0269 624         dialog.setVisible(true);
JM 625         final UserModel revisedUser = dialog.getUser();
626         if (revisedUser == null) {
627             return;
628         }
629
15a51d 630         GitblitWorker worker = new GitblitWorker(this, RpcRequest.EDIT_USER) {
da0269 631             @Override
15a51d 632             protected Boolean doRequest() throws IOException {
JM 633                 boolean success = gitblit.updateUser(user.username, revisedUser);
634                 if (success) {
635                     gitblit.refreshUsers();
636                 }
637                 return success;
da0269 638             }
JM 639
640             @Override
15a51d 641             protected void onSuccess() {
JM 642                 updateUsersTable();
643             }
644
645             @Override
646             protected void onFailure() {
647                 showFailure("Failed to execute request \"{0}\" for user \"{1}\".",
648                         getRequestType(), user.username);
da0269 649             }
JM 650         };
651         worker.execute();
652     }
653
654     protected void deleteUsers(final List<UserModel> users) {
655         if (users == null || users.size() == 0) {
656             return;
657         }
658         StringBuilder message = new StringBuilder("Delete the following users?\n\n");
659         for (UserModel user : users) {
660             message.append(user.username).append("\n");
661         }
662         int result = JOptionPane.showConfirmDialog(GitblitPanel.this, message.toString(),
663                 "Delete Users?", JOptionPane.YES_NO_OPTION);
664         if (result == JOptionPane.YES_OPTION) {
15a51d 665             GitblitWorker worker = new GitblitWorker(this, RpcRequest.DELETE_USER) {
da0269 666                 @Override
15a51d 667                 protected Boolean doRequest() throws IOException {
da0269 668                     boolean success = true;
JM 669                     for (UserModel user : users) {
15a51d 670                         success &= gitblit.deleteUser(user);
JM 671                     }
672                     if (success) {
673                         gitblit.refreshUsers();
da0269 674                     }
JM 675                     return success;
676                 }
677
678                 @Override
15a51d 679                 protected void onSuccess() {
JM 680                     updateUsersTable();
681                 }
682
683                 @Override
684                 protected void onFailure() {
685                     showFailure("Failed to delete specified users!");
da0269 686                 }
JM 687             };
688             worker.execute();
689         }
690     }
15a51d 691 }