| /* | |
| * Copyright 2014 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.wicket.panels; | |
| import java.text.MessageFormat; | |
| import java.util.ArrayList; | |
| import java.util.Set; | |
| import java.util.TreeSet; | |
| import org.apache.wicket.markup.html.form.DropDownChoice; | |
| import org.apache.wicket.markup.html.form.TextField; | |
| import org.apache.wicket.model.IModel; | |
| import org.apache.wicket.model.Model; | |
| import com.gitblit.models.ProjectModel; | |
| import com.gitblit.models.RepositoryModel; | |
| import com.gitblit.models.UserModel; | |
| import com.gitblit.utils.StringUtils; | |
| import com.gitblit.wicket.GitBlitWebSession; | |
| /** | |
| * A panel for naming a repository, specifying it's project, and entering a description. | |
| * | |
| * @author James Moger | |
| * | |
| */ | |
| public class RepositoryNamePanel extends BasePanel { | |
| private static final long serialVersionUID = 1L; | |
| private String fullName; | |
| private final IModel<String> projectPath; | |
| private DropDownChoice<String> pathChoice; | |
| private final IModel<String> repoName; | |
| private TextField<String> nameField; | |
| public RepositoryNamePanel(String wicketId, RepositoryModel repository) { | |
| super(wicketId); | |
| GitBlitWebSession session = GitBlitWebSession.get(); | |
| UserModel user = session.getUser(); | |
| // build project set for repository destination | |
| String defaultPath = null; | |
| String defaultName = null; | |
| Set<String> pathNames = new TreeSet<String>(); | |
| // add the registered/known projects | |
| for (ProjectModel project : app().projects().getProjectModels(user, false)) { | |
| // TODO issue-351: user.canAdmin(project) | |
| if (user.canAdmin()) { | |
| if (project.isRoot) { | |
| pathNames.add("/"); | |
| } else { | |
| pathNames.add(project.name + "/"); | |
| } | |
| } | |
| } | |
| // add the user's personal project namespace | |
| if (user.canAdmin() || user.canCreate()) { | |
| pathNames.add(user.getPersonalPath() + "/"); | |
| } | |
| if (!StringUtils.isEmpty(repository.name)) { | |
| // editing a repository name | |
| // set the defaultProject to the current repository project | |
| if (StringUtils.isEmpty(repository.projectPath)) { | |
| defaultPath = "/"; | |
| defaultName = repository.name; | |
| } else { | |
| defaultPath = repository.projectPath + "/"; | |
| defaultName = repository.name.substring(defaultPath.length()); | |
| } | |
| pathNames.add(defaultPath); | |
| } | |
| // if default project is not already set, set preference based on the user permissions | |
| if (defaultPath == null) { | |
| if (user.canAdmin()) { | |
| defaultPath = "/"; | |
| } else if (user.canCreate()) { | |
| defaultPath = user.getPersonalPath() + "/"; | |
| } | |
| } | |
| projectPath = Model.of(defaultPath); | |
| pathChoice = new DropDownChoice<String>("projectPath", projectPath, new ArrayList<String>(pathNames)); | |
| repoName = Model.of(defaultName); | |
| nameField = new TextField<String>("name", repoName); | |
| // only enable project selection if we actually have multiple choices | |
| add(pathChoice.setEnabled(pathNames.size() > 1)); | |
| add(nameField); | |
| add(new TextField<String>("description")); | |
| } | |
| public void setEditable(boolean editable) { | |
| // only enable project selection if we actually have multiple choices | |
| pathChoice.setEnabled(pathChoice.getChoices().size() > 1 && editable); | |
| nameField.setEnabled(editable); | |
| } | |
| public boolean updateModel(RepositoryModel repositoryModel) { | |
| // confirm a project path was selected | |
| if (StringUtils.isEmpty(projectPath.getObject())) { | |
| error(getString("gb.pleaseSelectProject")); | |
| return false; | |
| } | |
| // confirm a repository name was entered | |
| if (StringUtils.isEmpty(repoName.getObject())) { | |
| error(getString("gb.pleaseSetRepositoryName")); | |
| return false; | |
| } | |
| String project = projectPath.getObject(); | |
| String name = repoName.getObject(); | |
| fullName = (project + name).trim(); | |
| fullName = fullName.replace('\\', '/'); | |
| fullName = fullName.replace("//", "/"); | |
| if (fullName.charAt(0) == '/') { | |
| fullName = fullName.substring(1); | |
| } | |
| if (fullName.endsWith("/")) { | |
| fullName = fullName.substring(0, fullName.length() - 1); | |
| } | |
| if (fullName.contains("../")) { | |
| error(getString("gb.illegalRelativeSlash")); | |
| return false; | |
| } | |
| if (fullName.contains("/../")) { | |
| error(getString("gb.illegalRelativeSlash")); | |
| return false; | |
| } | |
| // confirm valid characters in repository name | |
| Character c = StringUtils.findInvalidCharacter(fullName); | |
| if (c != null) { | |
| error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), c)); | |
| return false; | |
| } | |
| repositoryModel.name = fullName; | |
| return true; | |
| } | |
| @Override | |
| protected boolean getStatelessHint() { | |
| return false; | |
| } | |
| } |