From 9effe1630d97039b3e01cd9b58ed07e75be1d63c Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 25 Feb 2013 08:40:30 -0500 Subject: [PATCH] Merge pull request #75 from thefake/master --- src/com/gitblit/client/EditRepositoryDialog.java | 319 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 271 insertions(+), 48 deletions(-) diff --git a/src/com/gitblit/client/EditRepositoryDialog.java b/src/com/gitblit/client/EditRepositoryDialog.java index eaf7e0c..8851de4 100644 --- a/src/com/gitblit/client/EditRepositoryDialog.java +++ b/src/com/gitblit/client/EditRepositoryDialog.java @@ -24,15 +24,21 @@ import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; -import javax.swing.DefaultComboBoxModel; +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; @@ -43,14 +49,20 @@ import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.JRootPane; +import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; +import javax.swing.ScrollPaneConstants; import com.gitblit.Constants.AccessRestrictionType; +import com.gitblit.Constants.AuthorizationControl; import com.gitblit.Constants.FederationStrategy; +import com.gitblit.Constants.RegistrantType; +import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.RepositoryModel; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.StringUtils; @@ -93,18 +105,34 @@ private JTextField mailingListsField; private JComboBox accessRestriction; + + private JRadioButton allowAuthenticated; + + private JRadioButton allowNamed; + + private JCheckBox allowForks; + + private JCheckBox verifyCommitter; private JComboBox federationStrategy; - private JComboBox ownerField; + private JPalette<String> ownersPalette; - private JComboBox defaultHeadField; - - private JPalette<String> usersPalette; + private JComboBox headRefField; + + private JComboBox gcPeriod; + + private JTextField gcThreshold; + + private JComboBox maxActivityCommits; + + private RegistrantPermissionsPanel usersPalette; private JPalette<String> setsPalette; - private JPalette<String> teamsPalette; + private RegistrantPermissionsPanel teamsPalette; + + private JPalette<String> indexedBranchesPalette; private JPalette<String> preReceivePalette; @@ -115,6 +143,10 @@ private JLabel postReceiveInherited; private Set<String> repositoryNames; + + private JPanel customFieldsPanel; + + private List<JTextField> customTextfields; public EditRepositoryDialog(int protocolVersion) { this(protocolVersion, new RepositoryModel()); @@ -158,16 +190,23 @@ anRepository.origin == null ? "" : anRepository.origin, 40); originField.setEditable(false); - if (ArrayUtils.isEmpty(anRepository.availableHeads)) { - defaultHeadField = new JComboBox(); - defaultHeadField.setEnabled(false); + if (ArrayUtils.isEmpty(anRepository.availableRefs)) { + headRefField = new JComboBox(); + headRefField.setEnabled(false); } else { - defaultHeadField = new JComboBox( - anRepository.availableHeads.toArray()); - defaultHeadField.setSelectedItem(anRepository.defaultHead); + headRefField = new JComboBox( + anRepository.availableRefs.toArray()); + headRefField.setSelectedItem(anRepository.HEAD); } + + Integer [] gcPeriods = { 1, 2, 3, 4, 5, 7, 10, 14 }; + gcPeriod = new JComboBox(gcPeriods); + gcPeriod.setSelectedItem(anRepository.gcPeriod); + + gcThreshold = new JTextField(8); + gcThreshold.setText(anRepository.gcThreshold); - ownerField = new JComboBox(); + ownersPalette = new JPalette<String>(true); useTickets = new JCheckBox(Translation.get("gb.useTicketsDescription"), anRepository.useTickets); @@ -187,6 +226,9 @@ isFrozen = new JCheckBox(Translation.get("gb.isFrozenDescription"), anRepository.isFrozen); + maxActivityCommits = new JComboBox(new Integer [] { -1, 0, 25, 50, 75, 100, 150, 250, 500 }); + maxActivityCommits.setSelectedItem(anRepository.maxActivityCommits); + mailingListsField = new JTextField( ArrayUtils.isEmpty(anRepository.mailingLists) ? "" : StringUtils.flattenStrings(anRepository.mailingLists, @@ -195,6 +237,52 @@ accessRestriction = new JComboBox(AccessRestrictionType.values()); accessRestriction.setRenderer(new AccessRestrictionRenderer()); accessRestriction.setSelectedItem(anRepository.accessRestriction); + accessRestriction.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + AccessRestrictionType art = (AccessRestrictionType) accessRestriction.getSelectedItem(); + EditRepositoryDialog.this.setupAccessPermissions(art); + } + } + }); + + boolean authenticated = anRepository.authorizationControl != null + && AuthorizationControl.AUTHENTICATED.equals(anRepository.authorizationControl); + allowAuthenticated = new JRadioButton(Translation.get("gb.allowAuthenticatedDescription")); + allowAuthenticated.setSelected(authenticated); + allowAuthenticated.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + usersPalette.setEnabled(false); + teamsPalette.setEnabled(false); + } + } + }); + + allowNamed = new JRadioButton(Translation.get("gb.allowNamedDescription")); + allowNamed.setSelected(!authenticated); + allowNamed.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + usersPalette.setEnabled(true); + teamsPalette.setEnabled(true); + } + } + }); + + ButtonGroup group = new ButtonGroup(); + group.add(allowAuthenticated); + group.add(allowNamed); + + JPanel authorizationPanel = new JPanel(new GridLayout(0, 1)); + authorizationPanel.add(allowAuthenticated); + authorizationPanel.add(allowNamed); + + allowForks = new JCheckBox(Translation.get("gb.allowForksDescription"), anRepository.allowForks); + verifyCommitter = new JCheckBox(Translation.get("gb.verifyCommitterDescription"), anRepository.verifyCommitter); // federation strategies - remove ORIGIN choice if this repository has // no origin. @@ -213,9 +301,9 @@ descriptionField)); fieldsPanel .add(newFieldPanel(Translation.get("gb.origin"), originField)); - fieldsPanel.add(newFieldPanel(Translation.get("gb.defaultHead"), - defaultHeadField)); - fieldsPanel.add(newFieldPanel(Translation.get("gb.owner"), ownerField)); + fieldsPanel.add(newFieldPanel(Translation.get("gb.headRef"), headRefField)); + fieldsPanel.add(newFieldPanel(Translation.get("gb.gcPeriod"), gcPeriod)); + fieldsPanel.add(newFieldPanel(Translation.get("gb.gcThreshold"), gcThreshold)); fieldsPanel.add(newFieldPanel(Translation.get("gb.enableTickets"), useTickets)); @@ -230,24 +318,41 @@ skipSizeCalculation)); fieldsPanel.add(newFieldPanel(Translation.get("gb.skipSummaryMetrics"), skipSummaryMetrics)); - fieldsPanel - .add(newFieldPanel(Translation.get("gb.isFrozen"), isFrozen)); + fieldsPanel.add(newFieldPanel(Translation.get("gb.maxActivityCommits"), + maxActivityCommits)); fieldsPanel.add(newFieldPanel(Translation.get("gb.mailingLists"), mailingListsField)); - usersPalette = new JPalette<String>(); + JPanel clonePushPanel = new JPanel(new GridLayout(0, 1)); + clonePushPanel + .add(newFieldPanel(Translation.get("gb.isFrozen"), isFrozen)); + clonePushPanel + .add(newFieldPanel(Translation.get("gb.allowForks"), allowForks)); + clonePushPanel + .add(newFieldPanel(Translation.get("gb.verifyCommitter"), verifyCommitter)); + + usersPalette = new RegistrantPermissionsPanel(RegistrantType.USER); + + JPanel northFieldsPanel = new JPanel(new BorderLayout(0, 5)); + northFieldsPanel.add(newFieldPanel(Translation.get("gb.owners"), ownersPalette), BorderLayout.NORTH); + northFieldsPanel.add(newFieldPanel(Translation.get("gb.accessRestriction"), + accessRestriction), BorderLayout.CENTER); + + JPanel northAccessPanel = new JPanel(new BorderLayout(5, 5)); + northAccessPanel.add(northFieldsPanel, BorderLayout.NORTH); + northAccessPanel.add(newFieldPanel(Translation.get("gb.authorizationControl"), + authorizationPanel), BorderLayout.CENTER); + northAccessPanel.add(clonePushPanel, BorderLayout.SOUTH); + JPanel accessPanel = new JPanel(new BorderLayout(5, 5)); - accessPanel.add( - newFieldPanel(Translation.get("gb.accessRestriction"), - accessRestriction), BorderLayout.NORTH); - accessPanel.add( - newFieldPanel(Translation.get("gb.permittedUsers"), + accessPanel.add(northAccessPanel, BorderLayout.NORTH); + accessPanel.add(newFieldPanel(Translation.get("gb.userPermissions"), usersPalette), BorderLayout.CENTER); - teamsPalette = new JPalette<String>(); + teamsPalette = new RegistrantPermissionsPanel(RegistrantType.TEAM); JPanel teamsPanel = new JPanel(new BorderLayout(5, 5)); teamsPanel.add( - newFieldPanel(Translation.get("gb.permittedTeams"), + newFieldPanel(Translation.get("gb.teamPermissions"), teamsPalette), BorderLayout.CENTER); setsPalette = new JPalette<String>(); @@ -258,6 +363,12 @@ federationPanel .add(newFieldPanel(Translation.get("gb.federationSets"), setsPalette), BorderLayout.CENTER); + + indexedBranchesPalette = new JPalette<String>(); + JPanel indexedBranchesPanel = new JPanel(new BorderLayout(5, 5)); + indexedBranchesPanel + .add(newFieldPanel(Translation.get("gb.indexedBranches"), + indexedBranchesPalette), BorderLayout.CENTER); preReceivePalette = new JPalette<String>(true); preReceiveInherited = new JLabel(); @@ -270,6 +381,12 @@ JPanel postReceivePanel = new JPanel(new BorderLayout(5, 5)); postReceivePanel.add(postReceivePalette, BorderLayout.CENTER); postReceivePanel.add(postReceiveInherited, BorderLayout.WEST); + + customFieldsPanel = new JPanel(); + customFieldsPanel.setLayout(new BoxLayout(customFieldsPanel, BoxLayout.Y_AXIS)); + JScrollPane customFieldsScrollPane = new JScrollPane(customFieldsPanel); + customFieldsScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + customFieldsScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); JTabbedPane panel = new JTabbedPane(JTabbedPane.TOP); panel.addTab(Translation.get("gb.general"), fieldsPanel); @@ -278,8 +395,16 @@ panel.addTab(Translation.get("gb.teams"), teamsPanel); } panel.addTab(Translation.get("gb.federation"), federationPanel); + if (protocolVersion >= 3) { + panel.addTab(Translation.get("gb.indexedBranches"), indexedBranchesPanel); + } panel.addTab(Translation.get("gb.preReceiveScripts"), preReceivePanel); panel.addTab(Translation.get("gb.postReceiveScripts"), postReceivePanel); + + panel.addTab(Translation.get("gb.customFields"), customFieldsScrollPane); + + + setupAccessPermissions(anRepository.accessRestriction); JButton createButton = new JButton(Translation.get("gb.save")); createButton.addActionListener(new ActionListener() { @@ -321,15 +446,40 @@ pack(); nameField.requestFocus(); } - + private JPanel newFieldPanel(String label, JComponent comp) { + return newFieldPanel(label, 150, comp); + } + + private JPanel newFieldPanel(String label, int labelSize, JComponent comp) { JLabel fieldLabel = new JLabel(label); fieldLabel.setFont(fieldLabel.getFont().deriveFont(Font.BOLD)); - fieldLabel.setPreferredSize(new Dimension(150, 20)); + fieldLabel.setPreferredSize(new Dimension(labelSize, 20)); JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0)); panel.add(fieldLabel); panel.add(comp); return panel; + } + + private void setupAccessPermissions(AccessRestrictionType art) { + if (AccessRestrictionType.NONE.equals(art)) { + usersPalette.setEnabled(false); + teamsPalette.setEnabled(false); + + allowAuthenticated.setEnabled(false); + allowNamed.setEnabled(false); + verifyCommitter.setEnabled(false); + } else { + allowAuthenticated.setEnabled(true); + allowNamed.setEnabled(true); + verifyCommitter.setEnabled(true); + + if (allowNamed.isSelected()) { + usersPalette.setEnabled(true); + teamsPalette.setEnabled(true); + } + } + } private boolean validateFields() { @@ -356,6 +506,9 @@ if (rname.contains("/../")) { error("Relative folder references (../) are prohibited."); return false; + } + if (rname.endsWith("/")) { + rname = rname.substring(0, rname.length() - 1); } // confirm valid characters in repository name @@ -402,17 +555,23 @@ repository.name = rname; repository.description = descriptionField.getText(); - repository.owner = ownerField.getSelectedItem() == null ? null - : ownerField.getSelectedItem().toString(); - repository.defaultHead = defaultHeadField.getSelectedItem() == null ? null - : defaultHeadField.getSelectedItem().toString(); + repository.owners.clear(); + repository.owners.addAll(ownersPalette.getSelections()); + repository.HEAD = headRefField.getSelectedItem() == null ? null + : headRefField.getSelectedItem().toString(); + repository.gcPeriod = (Integer) gcPeriod.getSelectedItem(); + repository.gcThreshold = gcThreshold.getText(); repository.useTickets = useTickets.isSelected(); repository.useDocs = useDocs.isSelected(); repository.showRemoteBranches = showRemoteBranches.isSelected(); repository.showReadme = showReadme.isSelected(); repository.skipSizeCalculation = skipSizeCalculation.isSelected(); repository.skipSummaryMetrics = skipSummaryMetrics.isSelected(); + repository.maxActivityCommits = (Integer) maxActivityCommits.getSelectedItem(); + repository.isFrozen = isFrozen.isSelected(); + repository.allowForks = allowForks.isSelected(); + repository.verifyCommitter = verifyCommitter.isSelected(); String ml = mailingListsField.getText(); if (!StringUtils.isEmpty(ml)) { @@ -428,15 +587,28 @@ repository.accessRestriction = (AccessRestrictionType) accessRestriction .getSelectedItem(); + repository.authorizationControl = allowAuthenticated.isSelected() ? + AuthorizationControl.AUTHENTICATED : AuthorizationControl.NAMED; repository.federationStrategy = (FederationStrategy) federationStrategy .getSelectedItem(); if (repository.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) { repository.federationSets = setsPalette.getSelections(); } - + + repository.indexedBranches = indexedBranchesPalette.getSelections(); repository.preReceiveScripts = preReceivePalette.getSelections(); repository.postReceiveScripts = postReceivePalette.getSelections(); + + // Custom Fields + repository.customFields = new LinkedHashMap<String, String>(); + if (customTextfields != null) { + for (JTextField field : customTextfields) { + String key = field.getName(); + String value = field.getText(); + repository.customFields.put(key, value); + } + } return true; } @@ -444,17 +616,25 @@ JOptionPane.showMessageDialog(EditRepositoryDialog.this, message, Translation.get("gb.error"), JOptionPane.ERROR_MESSAGE); } - - public void setUsers(String owner, List<String> all, List<String> selected) { - ownerField.setModel(new DefaultComboBoxModel(all.toArray())); - if (!StringUtils.isEmpty(owner)) { - ownerField.setSelectedItem(owner); - } - usersPalette.setObjects(all, selected); + + public void setAccessRestriction(AccessRestrictionType restriction) { + this.accessRestriction.setSelectedItem(restriction); + setupAccessPermissions(restriction); } - public void setTeams(List<String> all, List<String> selected) { - teamsPalette.setObjects(all, selected); + public void setAuthorizationControl(AuthorizationControl authorization) { + boolean authenticated = authorization != null && AuthorizationControl.AUTHENTICATED.equals(authorization); + this.allowAuthenticated.setSelected(authenticated); + this.allowNamed.setSelected(!authenticated); + } + + public void setUsers(List<String> owners, List<String> all, List<RegistrantAccessPermission> permissions) { + ownersPalette.setObjects(all, owners); + usersPalette.setObjects(all, permissions); + } + + public void setTeams(List<String> all, List<RegistrantAccessPermission> permissions) { + teamsPalette.setObjects(all, permissions); } public void setRepositories(List<RepositoryModel> repositories) { @@ -470,6 +650,10 @@ public void setFederationSets(List<String> all, List<String> selected) { setsPalette.setObjects(all, selected); + } + + public void setIndexedBranches(List<String> all, List<String> selected) { + indexedBranchesPalette.setObjects(all, selected); } public void setPreReceiveScripts(List<String> all, List<String> inherited, @@ -503,12 +687,50 @@ return repository; } - public List<String> getPermittedUsers() { - return usersPalette.getSelections(); + public List<RegistrantAccessPermission> getUserAccessPermissions() { + return usersPalette.getPermissions(); } - public List<String> getPermittedTeams() { - return teamsPalette.getSelections(); + public List<RegistrantAccessPermission> getTeamAccessPermissions() { + return teamsPalette.getPermissions(); + } + + public void setCustomFields(RepositoryModel repository, Map<String, String> customFields) { + customFieldsPanel.removeAll(); + customTextfields = new ArrayList<JTextField>(); + + final Insets insets = new Insets(5, 5, 5, 5); + JPanel fields = new JPanel(new GridLayout(0, 1, 0, 5)) { + + private static final long serialVersionUID = 1L; + + @Override + public Insets getInsets() { + return insets; + } + }; + + for (Map.Entry<String, String> entry : customFields.entrySet()) { + String field = entry.getKey(); + String value = ""; + if (repository.customFields != null && repository.customFields.containsKey(field)) { + value = repository.customFields.get(field); + } + JTextField textField = new JTextField(value); + textField.setName(field); + + textField.setPreferredSize(new Dimension(450, 26)); + + fields.add(newFieldPanel(entry.getValue(), 250, textField)); + + customTextfields.add(textField); + } + JScrollPane jsp = new JScrollPane(fields); + jsp.getVerticalScrollBar().setBlockIncrement(100); + jsp.getVerticalScrollBar().setUnitIncrement(100); + jsp.setViewportBorder(null); + customFieldsPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + customFieldsPanel.add(jsp); } /** @@ -516,14 +738,15 @@ * restriction. * */ - private class AccessRestrictionRenderer extends JLabel implements - ListCellRenderer { + private class AccessRestrictionRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof AccessRestrictionType) { AccessRestrictionType restriction = (AccessRestrictionType) value; switch (restriction) { -- Gitblit v1.9.1