/* | |
* Copyright 2011 gitblit.com. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.gitblit.client; | |
import java.awt.BorderLayout; | |
import java.awt.Component; | |
import java.awt.Dimension; | |
import java.awt.FlowLayout; | |
import java.awt.Font; | |
import java.awt.GridLayout; | |
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.BoxLayout; | |
import javax.swing.ButtonGroup; | |
import javax.swing.DefaultListCellRenderer; | |
import javax.swing.ImageIcon; | |
import javax.swing.JButton; | |
import javax.swing.JCheckBox; | |
import javax.swing.JComboBox; | |
import javax.swing.JComponent; | |
import javax.swing.JDialog; | |
import javax.swing.JLabel; | |
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 org.eclipse.jgit.lib.Repository; | |
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; | |
/** | |
* Dialog to create/edit a repository. | |
* | |
* @author James Moger | |
*/ | |
public class EditRepositoryDialog extends JDialog { | |
private static final long serialVersionUID = 1L; | |
private final String repositoryName; | |
private final RepositoryModel repository; | |
private boolean isCreate; | |
private boolean canceled = true; | |
private JTextField nameField; | |
private JTextField descriptionField; | |
private JCheckBox acceptNewPatchsets; | |
private JCheckBox acceptNewTickets; | |
private JCheckBox requireApproval; | |
private JComboBox mergeToField; | |
private JCheckBox useIncrementalPushTags; | |
private JCheckBox showRemoteBranches; | |
private JCheckBox skipSizeCalculation; | |
private JCheckBox skipSummaryMetrics; | |
private JCheckBox isFrozen; | |
private JTextField mailingListsField; | |
private JComboBox accessRestriction; | |
private JRadioButton allowAuthenticated; | |
private JRadioButton allowNamed; | |
private JCheckBox allowForks; | |
private JCheckBox verifyCommitter; | |
private JComboBox federationStrategy; | |
private JPalette<String> ownersPalette; | |
private JComboBox headRefField; | |
private JComboBox gcPeriod; | |
private JTextField gcThreshold; | |
private JComboBox maxActivityCommits; | |
private RegistrantPermissionsPanel usersPalette; | |
private JPalette<String> setsPalette; | |
private RegistrantPermissionsPanel teamsPalette; | |
private JPalette<String> indexedBranchesPalette; | |
private JPalette<String> preReceivePalette; | |
private JLabel preReceiveInherited; | |
private JPalette<String> postReceivePalette; | |
private JLabel postReceiveInherited; | |
private Set<String> repositoryNames; | |
private JPanel customFieldsPanel; | |
private List<JTextField> customTextfields; | |
public EditRepositoryDialog(int protocolVersion) { | |
this(protocolVersion, new RepositoryModel()); | |
this.isCreate = true; | |
setTitle(Translation.get("gb.newRepository")); | |
} | |
public EditRepositoryDialog(int protocolVersion, RepositoryModel aRepository) { | |
super(); | |
this.repositoryName = aRepository.name; | |
this.repository = new RepositoryModel(); | |
this.repositoryNames = new HashSet<String>(); | |
this.isCreate = false; | |
initialize(protocolVersion, aRepository); | |
setModal(true); | |
setResizable(false); | |
setTitle(Translation.get("gb.edit") + ": " + aRepository.name); | |
setIconImage(new ImageIcon(getClass() | |
.getResource("/gitblt-favicon.png")).getImage()); | |
} | |
@Override | |
protected JRootPane createRootPane() { | |
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); | |
JRootPane rootPane = new JRootPane(); | |
rootPane.registerKeyboardAction(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent actionEvent) { | |
setVisible(false); | |
} | |
}, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); | |
return rootPane; | |
} | |
private void initialize(int protocolVersion, RepositoryModel anRepository) { | |
nameField = new JTextField(anRepository.name == null ? "" | |
: anRepository.name, 35); | |
descriptionField = new JTextField(anRepository.description == null ? "" | |
: anRepository.description, 35); | |
JTextField originField = new JTextField( | |
anRepository.origin == null ? "" : anRepository.origin, 40); | |
originField.setEditable(false); | |
if (ArrayUtils.isEmpty(anRepository.availableRefs)) { | |
headRefField = new JComboBox(); | |
headRefField.setEnabled(false); | |
} else { | |
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); | |
ownersPalette = new JPalette<String>(true); | |
acceptNewTickets = new JCheckBox(Translation.get("gb.acceptsNewTicketsDescription"), | |
anRepository.acceptNewTickets); | |
acceptNewPatchsets = new JCheckBox(Translation.get("gb.acceptsNewPatchsetsDescription"), | |
anRepository.acceptNewPatchsets); | |
requireApproval = new JCheckBox(Translation.get("gb.requireApprovalDescription"), | |
anRepository.requireApproval); | |
if (ArrayUtils.isEmpty(anRepository.availableRefs)) { | |
mergeToField = new JComboBox(); | |
mergeToField.setEnabled(false); | |
} else { | |
mergeToField = new JComboBox( | |
anRepository.availableRefs.toArray()); | |
mergeToField.setSelectedItem(anRepository.mergeTo); | |
} | |
useIncrementalPushTags = new JCheckBox(Translation.get("gb.useIncrementalPushTagsDescription"), | |
anRepository.useIncrementalPushTags); | |
showRemoteBranches = new JCheckBox( | |
Translation.get("gb.showRemoteBranchesDescription"), | |
anRepository.showRemoteBranches); | |
skipSizeCalculation = new JCheckBox( | |
Translation.get("gb.skipSizeCalculationDescription"), | |
anRepository.skipSizeCalculation); | |
skipSummaryMetrics = new JCheckBox( | |
Translation.get("gb.skipSummaryMetricsDescription"), | |
anRepository.skipSummaryMetrics); | |
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, | |
" "), 50); | |
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. | |
List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>( | |
Arrays.asList(FederationStrategy.values())); | |
if (StringUtils.isEmpty(anRepository.origin)) { | |
federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN); | |
} | |
federationStrategy = new JComboBox(federationStrategies.toArray()); | |
federationStrategy.setRenderer(new FederationStrategyRenderer()); | |
federationStrategy.setSelectedItem(anRepository.federationStrategy); | |
JPanel fieldsPanel = new JPanel(new GridLayout(0, 1)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.name"), nameField)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.description"), | |
descriptionField)); | |
fieldsPanel | |
.add(newFieldPanel(Translation.get("gb.origin"), originField)); | |
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.acceptsNewTickets"), | |
acceptNewTickets)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.acceptsNewPatchsets"), | |
acceptNewPatchsets)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.requireApproval"), | |
requireApproval)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.mergeTo"), mergeToField)); | |
fieldsPanel | |
.add(newFieldPanel(Translation.get("gb.enableIncrementalPushTags"), useIncrementalPushTags)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.showRemoteBranches"), | |
showRemoteBranches)); | |
fieldsPanel | |
.add(newFieldPanel(Translation.get("gb.skipSizeCalculation"), | |
skipSizeCalculation)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.skipSummaryMetrics"), | |
skipSummaryMetrics)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.maxActivityCommits"), | |
maxActivityCommits)); | |
fieldsPanel.add(newFieldPanel(Translation.get("gb.mailingLists"), | |
mailingListsField)); | |
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(northAccessPanel, BorderLayout.NORTH); | |
accessPanel.add(newFieldPanel(Translation.get("gb.userPermissions"), | |
usersPalette), BorderLayout.CENTER); | |
teamsPalette = new RegistrantPermissionsPanel(RegistrantType.TEAM); | |
JPanel teamsPanel = new JPanel(new BorderLayout(5, 5)); | |
teamsPanel.add( | |
newFieldPanel(Translation.get("gb.teamPermissions"), | |
teamsPalette), BorderLayout.CENTER); | |
setsPalette = new JPalette<String>(); | |
JPanel federationPanel = new JPanel(new BorderLayout(5, 5)); | |
federationPanel.add( | |
newFieldPanel(Translation.get("gb.federationStrategy"), | |
federationStrategy), BorderLayout.NORTH); | |
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(); | |
JPanel preReceivePanel = new JPanel(new BorderLayout(5, 5)); | |
preReceivePanel.add(preReceivePalette, BorderLayout.CENTER); | |
preReceivePanel.add(preReceiveInherited, BorderLayout.WEST); | |
postReceivePalette = new JPalette<String>(true); | |
postReceiveInherited = new JLabel(); | |
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); | |
panel.addTab(Translation.get("gb.accessRestriction"), accessPanel); | |
if (protocolVersion >= 2) { | |
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() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
if (validateFields()) { | |
canceled = false; | |
setVisible(false); | |
} | |
} | |
}); | |
JButton cancelButton = new JButton(Translation.get("gb.cancel")); | |
cancelButton.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
canceled = true; | |
setVisible(false); | |
} | |
}); | |
JPanel controls = new JPanel(); | |
controls.add(cancelButton); | |
controls.add(createButton); | |
final Insets _insets = new Insets(5, 5, 5, 5); | |
JPanel centerPanel = new JPanel(new BorderLayout(5, 5)) { | |
private static final long serialVersionUID = 1L; | |
@Override | |
public Insets getInsets() { | |
return _insets; | |
} | |
}; | |
centerPanel.add(panel, BorderLayout.CENTER); | |
centerPanel.add(controls, BorderLayout.SOUTH); | |
getContentPane().setLayout(new BorderLayout(5, 5)); | |
getContentPane().add(centerPanel, BorderLayout.CENTER); | |
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(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() { | |
String rname = nameField.getText(); | |
if (StringUtils.isEmpty(rname)) { | |
error("Please enter a repository name!"); | |
return false; | |
} | |
// automatically convert backslashes to forward slashes | |
rname = rname.replace('\\', '/'); | |
// Automatically replace // with / | |
rname = rname.replace("//", "/"); | |
// prohibit folder paths | |
if (rname.startsWith("/")) { | |
error("Leading root folder references (/) are prohibited."); | |
return false; | |
} | |
if (rname.startsWith("../")) { | |
error("Relative folder references (../) are prohibited."); | |
return false; | |
} | |
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 | |
Character c = StringUtils.findInvalidCharacter(rname); | |
if (c != null) { | |
error(MessageFormat.format( | |
"Illegal character ''{0}'' in repository name!", c)); | |
return false; | |
} | |
// verify repository name uniqueness on create | |
if (isCreate) { | |
// force repo names to lowercase | |
// this means that repository name checking for rpc creation | |
// is case-insensitive, regardless of the Gitblit server's | |
// filesystem | |
if (repositoryNames.contains(rname.toLowerCase())) { | |
error(MessageFormat | |
.format("Can not create repository ''{0}'' because it already exists.", | |
rname)); | |
return false; | |
} | |
} else { | |
// check rename collision | |
if (!repositoryName.equalsIgnoreCase(rname)) { | |
if (repositoryNames.contains(rname.toLowerCase())) { | |
error(MessageFormat | |
.format("Failed to rename ''{0}'' because ''{1}'' already exists.", | |
repositoryName, rname)); | |
return false; | |
} | |
} | |
} | |
if (accessRestriction.getSelectedItem() == null) { | |
error("Please select access restriction!"); | |
return false; | |
} | |
if (federationStrategy.getSelectedItem() == null) { | |
error("Please select federation strategy!"); | |
return false; | |
} | |
repository.name = rname; | |
repository.description = descriptionField.getText(); | |
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.acceptNewPatchsets = acceptNewPatchsets.isSelected(); | |
repository.acceptNewTickets = acceptNewTickets.isSelected(); | |
repository.requireApproval = requireApproval.isSelected(); | |
repository.mergeTo = mergeToField.getSelectedItem() == null ? null | |
: Repository.shortenRefName(mergeToField.getSelectedItem().toString()); | |
repository.useIncrementalPushTags = useIncrementalPushTags.isSelected(); | |
repository.showRemoteBranches = showRemoteBranches.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)) { | |
Set<String> list = new HashSet<String>(); | |
for (String address : ml.split("(,|\\s)")) { | |
if (StringUtils.isEmpty(address)) { | |
continue; | |
} | |
list.add(address.toLowerCase()); | |
} | |
repository.mailingLists = new ArrayList<String>(list); | |
} | |
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; | |
} | |
private void error(String message) { | |
JOptionPane.showMessageDialog(EditRepositoryDialog.this, message, | |
Translation.get("gb.error"), JOptionPane.ERROR_MESSAGE); | |
} | |
public void setAccessRestriction(AccessRestrictionType restriction) { | |
this.accessRestriction.setSelectedItem(restriction); | |
setupAccessPermissions(restriction); | |
} | |
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) { | |
repositoryNames.clear(); | |
for (RepositoryModel repository : repositories) { | |
// force repo names to lowercase | |
// this means that repository name checking for rpc creation | |
// is case-insensitive, regardless of the Gitblit server's | |
// filesystem | |
repositoryNames.add(repository.name.toLowerCase()); | |
} | |
} | |
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, | |
List<String> selected) { | |
preReceivePalette.setObjects(all, selected); | |
showInherited(inherited, preReceiveInherited); | |
} | |
public void setPostReceiveScripts(List<String> all, List<String> inherited, | |
List<String> selected) { | |
postReceivePalette.setObjects(all, selected); | |
showInherited(inherited, postReceiveInherited); | |
} | |
private void showInherited(List<String> list, JLabel label) { | |
StringBuilder sb = new StringBuilder(); | |
if (list != null && list.size() > 0) { | |
sb.append("<html><body><b>INHERITED</b><ul style=\"margin-left:5px;list-style-type: none;\">"); | |
for (String script : list) { | |
sb.append("<li>").append(script).append("</li>"); | |
} | |
sb.append("</ul></body></html>"); | |
} | |
label.setText(sb.toString()); | |
} | |
public RepositoryModel getRepository() { | |
if (canceled) { | |
return null; | |
} | |
return repository; | |
} | |
public List<RegistrantAccessPermission> getUserAccessPermissions() { | |
return usersPalette.getPermissions(); | |
} | |
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); | |
} | |
/** | |
* ListCellRenderer to display descriptive text about the access | |
* restriction. | |
* | |
*/ | |
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) { | |
case NONE: | |
setText(Translation.get("gb.notRestricted")); | |
break; | |
case PUSH: | |
setText(Translation.get("gb.pushRestricted")); | |
break; | |
case CLONE: | |
setText(Translation.get("gb.cloneRestricted")); | |
break; | |
case VIEW: | |
setText(Translation.get("gb.viewRestricted")); | |
break; | |
} | |
} else { | |
setText(value.toString()); | |
} | |
return this; | |
} | |
} | |
/** | |
* ListCellRenderer to display descriptive text about the federation | |
* strategy. | |
*/ | |
private class FederationStrategyRenderer extends JLabel implements | |
ListCellRenderer { | |
private static final long serialVersionUID = 1L; | |
@Override | |
public Component getListCellRendererComponent(JList list, Object value, | |
int index, boolean isSelected, boolean cellHasFocus) { | |
if (value instanceof FederationStrategy) { | |
FederationStrategy strategy = (FederationStrategy) value; | |
switch (strategy) { | |
case EXCLUDE: | |
setText(Translation.get("gb.excludeFromFederation")); | |
break; | |
case FEDERATE_THIS: | |
setText(Translation.get("gb.federateThis")); | |
break; | |
case FEDERATE_ORIGIN: | |
setText(Translation.get("gb.federateOrigin")); | |
break; | |
} | |
} else { | |
setText(value.toString()); | |
} | |
return this; | |
} | |
} | |
} |