You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitblitPanel.java 21KB

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