From a3456e22504a0a054312989fd52a21e4d193baf7 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 03 Jun 2014 10:34:51 -0400 Subject: [PATCH] Extract repository name panel for re-use --- src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html | 17 --- src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.html | 27 +++++ src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java | 139 +++++++++++++++++++++++++++ src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java | 79 +-------------- src/main/java/com/gitblit/wicket/panels/RepositoryPermissionPanel.java | 2 src/main/java/com/gitblit/wicket/GitBlitWebApp.properties | 1 6 files changed, 179 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties index 3fd5a3a..d90158d 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties @@ -685,6 +685,7 @@ gb.administration = administration gb.plugins = plugins gb.extensions = extensions +gb.pleaseSelectProject = Please select the project! gb.anonymousPush = Anonymous Pushes gb.anonymousPushDescription = Anyone can see, clone, and push to this repository. gb.pushRestrictedAuthenticated = Restrict Pushes (Authenticated) diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html index c59f29c..05f5601 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html +++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html @@ -10,20 +10,7 @@ <div class="row"> <div class="span12"> - <table class="plain"> - <tbody class="settings"> - <tr> - <th><wicket:message key="gb.project"></wicket:message></th> - <td></td> - <th><wicket:message key="gb.name"></wicket:message></th> - </tr> - <tr> - <td><select class="span2" wicket:id="projectPath" /></td> - <td style="font-size:24px;color:#ccc;">/</td> - <td class="edit"><input class="span3" type="text" wicket:id="name" id="name" /> <span class="help-inline"><wicket:message key="gb.nameDescription"></wicket:message></span></td> - </tr> - </tbody> - </table> + <div wicket:id="namePanel"></div> <div> <b><wicket:message key="gb.description"></wicket:message></b><br/> @@ -32,7 +19,7 @@ <hr/> - <span wicket:id="permissionPanel"></span> + <div wicket:id="permissionPanel"></div> <hr/> diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java index cd0cef6..e2e5d4b 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -61,6 +60,7 @@ import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.panels.RepositoryNamePanel; import com.gitblit.wicket.panels.RepositoryPermissionPanel; public class NewRepositoryPage extends RootSubPage { @@ -71,6 +71,7 @@ private IModel<Boolean> addGitflowModel; private IModel<Boolean> addGitignoreModel; private RepositoryPermissionPanel permissionPanel; + private RepositoryNamePanel namePanel; public NewRepositoryPage() { // create constructor @@ -104,46 +105,11 @@ @Override protected void onSubmit() { - - // confirm a repository name was entered - if (StringUtils.isEmpty(repositoryModel.name)) { - error(getString("gb.pleaseSetRepositoryName")); - return; - } - - String project = repositoryModel.projectPath; - String fullName = (project + "/" + repositoryModel.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); - } - try { - if (fullName.contains("../")) { - error(getString("gb.illegalRelativeSlash")); + if (!namePanel.updateModel(repositoryModel)) { return; } - if (fullName.contains("/../")) { - error(getString("gb.illegalRelativeSlash")); - return; - } - - // confirm valid characters in repository name - Character c = StringUtils.findInvalidCharacter(fullName); - if (c != null) { - error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), - c)); - return; - } - - repositoryModel.name = fullName; - repositoryModel.projectPath = null; - - permissionPanel.setPermission(repositoryModel); + permissionPanel.updateModel(repositoryModel); repositoryModel.owners = new ArrayList<String>(); repositoryModel.owners.add(GitBlitWebSession.get().getUsername()); @@ -179,47 +145,20 @@ } catch (GitBlitException e) { error(e.getMessage()); - - // restore project and name fields on error condition - repositoryModel.projectPath = StringUtils.getFirstPathElement(fullName); - if (!StringUtils.isEmpty(repositoryModel.projectPath)) { - repositoryModel.name = fullName.substring(repositoryModel.projectPath.length() + 1); - } + namePanel.resetModel(repositoryModel); return; } setRedirect(true); - setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(fullName)); + setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name)); } }; - - GitBlitWebSession session = GitBlitWebSession.get(); - UserModel user = session.getUser(); - - // build project list for repository destination - String defaultProject = null; - List<String> projects = new ArrayList<String>(); - - if (user.canAdmin()) { - String main = app().settings().getString(Keys.web.repositoryRootGroupName, "main"); - projects.add(main); - defaultProject = main; - } - - if (user.canCreate()) { - projects.add(user.getPersonalPath()); - if (defaultProject == null) { - // only prefer personal namespace if default is not already set - defaultProject = user.getPersonalPath(); - } - } - - repositoryModel.projectPath = defaultProject; // do not let the browser pre-populate these fields form.add(new SimpleAttributeModifier("autocomplete", "off")); - form.add(new DropDownChoice<String>("projectPath", projects)); - form.add(new TextField<String>("name")); + namePanel = new RepositoryNamePanel("namePanel", repositoryModel); + form.add(namePanel); + form.add(new TextField<String>("description")); // prepare the default access controls diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.html b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.html new file mode 100644 index 0000000..f3a0738 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.html @@ -0,0 +1,27 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" + xml:lang="en" + lang="en"> + +<body> +<wicket:panel> + + <table class="plain"> + <tbody class="settings"> + <tr> + <th><wicket:message key="gb.project"></wicket:message></th> + <td></td> + <th><wicket:message key="gb.name"></wicket:message></th> + </tr> + <tr> + <td><select class="span2" wicket:id="projectPath" /></td> + <td style="font-size:24px;color:#ccc;">/</td> + <td class="edit"><input class="span3" type="text" wicket:id="name" id="name" /> <span class="help-inline"><wicket:message key="gb.nameDescription"></wicket:message></span></td> + </tr> + </tbody> + </table> + +</wicket:panel> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java new file mode 100644 index 0000000..7b20ade --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java @@ -0,0 +1,139 @@ +/* + * 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.List; + +import org.apache.wicket.markup.html.form.DropDownChoice; +import org.apache.wicket.markup.html.form.TextField; + +import com.gitblit.models.RepositoryModel; +import com.gitblit.models.UserModel; +import com.gitblit.utils.StringUtils; +import com.gitblit.wicket.GitBlitWebSession; + +/** + * A radio group panel of the 5 available authorization/access restriction combinations. + * + * @author James Moger + * + */ +public class RepositoryNamePanel extends BasePanel { + + private static final long serialVersionUID = 1L; + + private final RepositoryModel repository; + + private String fullName; + + public RepositoryNamePanel(String wicketId, RepositoryModel repository) { + super(wicketId); + this.repository = repository; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + + GitBlitWebSession session = GitBlitWebSession.get(); + UserModel user = session.getUser(); + + // build project list for repository destination + String defaultProject = null; + List<String> projects = new ArrayList<String>(); + + if (user.canAdmin()) { + projects.add("/"); + defaultProject = "/"; + } + + if (user.canCreate()) { + String p = user.getPersonalPath() + "/"; + projects.add(p); + if (defaultProject == null) { + // only prefer personal namespace if default is not already set + defaultProject = p; + } + } + + repository.projectPath = defaultProject; + + add(new DropDownChoice<String>("projectPath", projects)); + add(new TextField<String>("name")); + } + + public boolean updateModel(RepositoryModel repositoryModel) { + // confirm a project was selected + if (StringUtils.isEmpty(repositoryModel.projectPath)) { + error(getString("gb.pleaseSelectProject")); + return false; + } + + // confirm a repository name was entered + if (StringUtils.isEmpty(repositoryModel.name)) { + error(getString("gb.pleaseSetRepositoryName")); + return false; + } + + String project = repositoryModel.projectPath; + + fullName = (project + repositoryModel.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; + repositoryModel.projectPath = null; + + return true; + } + + public void resetModel(RepositoryModel repositoryModel) { + // restore project and name fields on error condition + repositoryModel.projectPath = StringUtils.getFirstPathElement(fullName) + "/"; + if (repositoryModel.projectPath.length() > 1) { + repositoryModel.name = fullName.substring(repositoryModel.projectPath.length()); + } + } + + @Override + protected boolean getStatelessHint() { + return false; + } +} diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryPermissionPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryPermissionPanel.java index 7c416b1..ed3f1fe 100644 --- a/src/main/java/com/gitblit/wicket/panels/RepositoryPermissionPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RepositoryPermissionPanel.java @@ -134,7 +134,7 @@ add(permissionGroup); } - public void setPermission(RepositoryModel repository) { + public void updateModel(RepositoryModel repository) { Permission permission = permissionGroup.getModelObject(); repository.authorizationControl = permission.control; repository.accessRestriction = permission.type; -- Gitblit v1.9.1