From 70033d1e03f6374804a239ee1bf9dd799a441bc9 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 28 May 2012 16:47:17 +0200 Subject: [PATCH 01/12] added help resource for repository root urls --- .../resources/RepositoryRootResource.java | 315 ++++++++++++++++++ .../resources/templates/repository-root.html | 100 ++++++ 2 files changed, 415 insertions(+) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java create mode 100644 scm-webapp/src/main/resources/templates/repository-root.html diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java new file mode 100644 index 0000000000..32cc8efd3b --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -0,0 +1,315 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.api.rest.resources; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.google.common.collect.Maps; +import com.google.inject.Inject; + +import sonia.scm.config.ScmConfiguration; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryManager; +import sonia.scm.template.TemplateHandler; +import sonia.scm.url.UrlProvider; +import sonia.scm.url.UrlProviderFactory; +import sonia.scm.util.HttpUtil; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.StringWriter; + +import java.util.Collection; +import java.util.Map; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Sebastian Sdorra + */ +@Path("help/repository-root/{type}.html") +public class RepositoryRootResource +{ + + /** Field description */ + public static final String TEMPLATE = "/repository-root"; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * + * @param configuration + * @param templateHandler + * @param repositoryManager + */ + @Inject + public RepositoryRootResource(ScmConfiguration configuration, + TemplateHandler templateHandler, + RepositoryManager repositoryManager) + { + this.configuration = configuration; + this.templateHandler = templateHandler; + this.repositoryManager = repositoryManager; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param type + * + * @return + * + * @throws IOException + */ + @GET + @Produces(MediaType.TEXT_HTML) + public String renderRepositoriesRoot(@PathParam("type") final String type) + throws IOException + { + UrlProvider uiUrlProvider = + UrlProviderFactory.createUrlProvider(configuration.getBaseUrl(), + UrlProviderFactory.TYPE_WUI); + Collection repositories = + Collections2.transform( + Collections2.filter( + repositoryManager.getAll(), + new TypePredicate(type)), new RepositoryTransformFunction( + uiUrlProvider)); + Map environment = Maps.newHashMap(); + + environment.put("repositories", repositories); + + StringWriter writer = new StringWriter(); + + templateHandler.render(TEMPLATE, writer, environment); + + return writer.toString(); + } + + //~--- inner classes -------------------------------------------------------- + + /** + * Class description + * + * + * @version Enter version here..., 12/05/28 + * @author Enter your name here... + */ + private static class RepositoryTemplateElement + { + + /** + * Constructs ... + * + * + * @param repository + * @param urlProvider + */ + public RepositoryTemplateElement(Repository repository, + UrlProvider urlProvider) + { + this.repository = repository; + this.urlProvider = urlProvider; + } + + //~--- get methods -------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public String getName() + { + return repository.getName(); + } + + /** + * Method description + * + * + * @return + */ + public Repository getRepository() + { + return repository; + } + + /** + * Method description + * + * + * @return + */ + public String getUIUrl() + { + return urlProvider.getRepositoryUrlProvider().getDetailUrl( + repository.getId()); + } + + /** + * Method description + * + * + * @return + */ + public String getUrl() + { + return repository.getUrl(); + } + + //~--- fields ------------------------------------------------------------- + + /** Field description */ + private Repository repository; + + /** Field description */ + private UrlProvider urlProvider; + } + + + /** + * Class description + * + * + * @version Enter version here..., 12/05/28 + * @author Enter your name here... + */ + private static class RepositoryTransformFunction + implements Function + { + + /** + * Constructs ... + * + * + * @param urlProvider + */ + public RepositoryTransformFunction(UrlProvider urlProvider) + { + this.urlProvider = urlProvider; + } + + //~--- methods ------------------------------------------------------------ + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + public RepositoryTemplateElement apply(Repository repository) + { + return new RepositoryTemplateElement(repository, urlProvider); + } + + //~--- fields ------------------------------------------------------------- + + /** Field description */ + private UrlProvider urlProvider; + } + + + /** + * Class description + * + * + * @version Enter version here..., 12/05/28 + * @author Enter your name here... + */ + private static class TypePredicate implements Predicate + { + + /** + * Constructs ... + * + * + * @param type + */ + public TypePredicate(String type) + { + this.type = type; + } + + //~--- methods ------------------------------------------------------------ + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + public boolean apply(Repository repository) + { + return type.equalsIgnoreCase(repository.getType()); + } + + //~--- fields ------------------------------------------------------------- + + /** Field description */ + private String type; + } + + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private ScmConfiguration configuration; + + /** Field description */ + private RepositoryManager repositoryManager; + + /** Field description */ + private TemplateHandler templateHandler; +} diff --git a/scm-webapp/src/main/resources/templates/repository-root.html b/scm-webapp/src/main/resources/templates/repository-root.html new file mode 100644 index 0000000000..a77762d266 --- /dev/null +++ b/scm-webapp/src/main/resources/templates/repository-root.html @@ -0,0 +1,100 @@ + + + + + SCM-Manager support information + + + + +

SCM-Manager Repositories

+ + + + + From 37b1cd6b8865ad713b21e28c83aabc2cd012b457 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 08:20:25 +0200 Subject: [PATCH 02/12] added commit and source url to repository root help page --- .../resources/RepositoryRootResource.java | 25 ++++++++++++++++++- .../resources/templates/repository-root.html | 4 ++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 32cc8efd3b..47061d8fbb 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -45,7 +45,6 @@ import sonia.scm.repository.RepositoryManager; import sonia.scm.template.TemplateHandler; import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; -import sonia.scm.util.HttpUtil; //~--- JDK imports ------------------------------------------------------------ @@ -158,6 +157,18 @@ public class RepositoryRootResource //~--- get methods -------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + public String getCommitUrl() + { + return urlProvider.getRepositoryUrlProvider().getChangesetUrl( + repository.getId(), null); + } + /** * Method description * @@ -180,6 +191,18 @@ public class RepositoryRootResource return repository; } + /** + * Method description + * + * + * @return + */ + public String getSourceUrl() + { + return urlProvider.getRepositoryUrlProvider().getBrowseUrl( + repository.getId(), null, null); + } + /** * Method description * diff --git a/scm-webapp/src/main/resources/templates/repository-root.html b/scm-webapp/src/main/resources/templates/repository-root.html index a77762d266..3ee14ece35 100644 --- a/scm-webapp/src/main/resources/templates/repository-root.html +++ b/scm-webapp/src/main/resources/templates/repository-root.html @@ -92,7 +92,9 @@ From 5b6eae8da49103a51f461930ef34ea0f35f2a0fc Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 09:20:27 +0200 Subject: [PATCH 03/12] sort repositories --- .../resources/RepositoryRootResource.java | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 47061d8fbb..09fd3981d9 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -37,6 +37,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Maps; +import com.google.common.collect.Ordering; import com.google.inject.Inject; import sonia.scm.config.ScmConfiguration; @@ -52,6 +53,8 @@ import java.io.IOException; import java.io.StringWriter; import java.util.Collection; +import java.util.Comparator; +import java.util.List; import java.util.Map; import javax.ws.rs.GET; @@ -112,12 +115,18 @@ public class RepositoryRootResource UrlProvider uiUrlProvider = UrlProviderFactory.createUrlProvider(configuration.getBaseUrl(), UrlProviderFactory.TYPE_WUI); - Collection repositories = - Collections2.transform( - Collections2.filter( - repositoryManager.getAll(), - new TypePredicate(type)), new RepositoryTransformFunction( - uiUrlProvider)); + //J- + Collection unsortedRepositories = + Collections2.transform( + Collections2.filter( + repositoryManager.getAll(), new TypePredicate(type)) + , new RepositoryTransformFunction(uiUrlProvider) + ); + + List repositories = Ordering.from( + new RepositoryTemplateElementComparator() + ).sortedCopy(unsortedRepositories); + //J+ Map environment = Maps.newHashMap(); environment.put("repositories", repositories); @@ -236,6 +245,35 @@ public class RepositoryRootResource } + /** + * Class description + * + * + * @version Enter version here..., 12/05/29 + * @author Enter your name here... + */ + private static class RepositoryTemplateElementComparator + implements Comparator + { + + /** + * Method description + * + * + * @param left + * @param right + * + * @return + */ + @Override + public int compare(RepositoryTemplateElement left, + RepositoryTemplateElement right) + { + return left.getName().compareTo(right.getName()); + } + } + + /** * Class description * From 5d09e5844abb076fc20482d639d3f105ba35127b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 09:47:12 +0200 Subject: [PATCH 04/12] fix freemarker expression error --- .../sonia/scm/api/rest/resources/RepositoryRootResource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 09fd3981d9..7e0e098b6a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -147,7 +147,7 @@ public class RepositoryRootResource * @version Enter version here..., 12/05/28 * @author Enter your name here... */ - private static class RepositoryTemplateElement + public static class RepositoryTemplateElement { /** @@ -250,7 +250,7 @@ public class RepositoryRootResource * * * @version Enter version here..., 12/05/29 - * @author Enter your name here... + * @author Enter your name here... */ private static class RepositoryTemplateElementComparator implements Comparator From 05c78c984b50f81c7ea2ce68d66d9b5365b01b8f Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 09:48:19 +0200 Subject: [PATCH 05/12] create outer class for repository type predicator --- .../repository/RepositoryTypePredicate.java | 77 +++++++++++++++++++ .../resources/RepositoryRootResource.java | 48 +----------- 2 files changed, 79 insertions(+), 46 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/RepositoryTypePredicate.java diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryTypePredicate.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryTypePredicate.java new file mode 100644 index 0000000000..7b6eb0b302 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryTypePredicate.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.base.Predicate; + +/** + * + * @author Sebastian Sdorra + * @since 1.16 + */ +public class RepositoryTypePredicate implements Predicate +{ + + /** + * Constructs ... + * + * + * @param type + */ + public RepositoryTypePredicate(String type) + { + this.type = type; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + public boolean apply(Repository repository) + { + return type.equalsIgnoreCase(repository.getType()); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private String type; +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 7e0e098b6a..3379c668fc 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -34,7 +34,6 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; @@ -43,6 +42,7 @@ import com.google.inject.Inject; import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryManager; +import sonia.scm.repository.RepositoryTypePredicate; import sonia.scm.template.TemplateHandler; import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; @@ -119,7 +119,7 @@ public class RepositoryRootResource Collection unsortedRepositories = Collections2.transform( Collections2.filter( - repositoryManager.getAll(), new TypePredicate(type)) + repositoryManager.getAll(), new RepositoryTypePredicate(type)) , new RepositoryTransformFunction(uiUrlProvider) ); @@ -319,50 +319,6 @@ public class RepositoryRootResource } - /** - * Class description - * - * - * @version Enter version here..., 12/05/28 - * @author Enter your name here... - */ - private static class TypePredicate implements Predicate - { - - /** - * Constructs ... - * - * - * @param type - */ - public TypePredicate(String type) - { - this.type = type; - } - - //~--- methods ------------------------------------------------------------ - - /** - * Method description - * - * - * @param repository - * - * @return - */ - @Override - public boolean apply(Repository repository) - { - return type.equalsIgnoreCase(repository.getType()); - } - - //~--- fields ------------------------------------------------------------- - - /** Field description */ - private String type; - } - - //~--- fields --------------------------------------------------------------- /** Field description */ From e27285dd51dda45963a0c487ba13bb5dbfaadab2 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 10:07:19 +0200 Subject: [PATCH 06/12] added util method for appendUrl --- .../sonia/scm/repository/RepositoryUtil.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java index 639fc55e25..c4aca962c7 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java @@ -38,7 +38,9 @@ package sonia.scm.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.config.ScmConfiguration; import sonia.scm.io.DirectoryFileFilter; +import sonia.scm.util.HttpUtil; import sonia.scm.util.IOUtil; //~--- JDK imports ------------------------------------------------------------ @@ -64,6 +66,32 @@ public class RepositoryUtil //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @param configuration + * @param repositoryManager + * @param repository + * + * @since 1.16 + */ + public static void appendUrl(ScmConfiguration configuration, + RepositoryManager repositoryManager, + Repository repository) + { + RepositoryHandler handler = + repositoryManager.getHandler(repository.getType()); + + if (handler != null) + { + String url = handler.createResourcePath(repository); + + url = HttpUtil.getCompleteUrl(configuration, url); + repository.setUrl(url); + } + } + /** * Method description * From 28e8e2d582d09518eef0e5ed3938eb3c73e80058 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 10:11:04 +0200 Subject: [PATCH 07/12] use repository util to append url --- .../rest/resources/RepositoryResource.java | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java index d3491532cc..8880bc6a70 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java @@ -65,6 +65,7 @@ import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.repository.RepositoryUtil; import sonia.scm.security.ScmSecurityException; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -779,7 +780,7 @@ public class RepositoryResource { for (Repository repository : repositories) { - appendUrl(repository); + RepositoryUtil.appendUrl(configuration, repositoryManager, repository); prepareRepository(repository); } @@ -797,7 +798,7 @@ public class RepositoryResource @Override protected Repository prepareForReturn(Repository repository) { - appendUrl(repository); + RepositoryUtil.appendUrl(configuration, repositoryManager, repository); prepareRepository(repository); return repository; @@ -833,26 +834,6 @@ public class RepositoryResource //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param repository - */ - private void appendUrl(Repository repository) - { - RepositoryHandler handler = - repositoryManager.getHandler(repository.getType()); - - if (handler != null) - { - String url = handler.createResourcePath(repository); - - url = HttpUtil.getCompleteUrl(configuration, url); - repository.setUrl(url); - } - } - /** * Method description * From b2dc85636c41053194ca9ce85c3fc8a7f94ab45a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 10:19:07 +0200 Subject: [PATCH 08/12] fix some other freemarker expression errors --- .../resources/RepositoryRootResource.java | 30 ++++++++++++++----- .../resources/templates/repository-root.html | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 3379c668fc..14bcf0e7a0 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -43,6 +43,7 @@ import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryTypePredicate; +import sonia.scm.repository.RepositoryUtil; import sonia.scm.template.TemplateHandler; import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; @@ -120,7 +121,7 @@ public class RepositoryRootResource Collections2.transform( Collections2.filter( repositoryManager.getAll(), new RepositoryTypePredicate(type)) - , new RepositoryTransformFunction(uiUrlProvider) + , new RepositoryTransformFunction(configuration, repositoryManager, uiUrlProvider) ); List repositories = Ordering.from( @@ -155,13 +156,13 @@ public class RepositoryRootResource * * * @param repository - * @param urlProvider + * @param uiUrlProvider */ public RepositoryTemplateElement(Repository repository, - UrlProvider urlProvider) + UrlProvider uiUrlProvider) { this.repository = repository; - this.urlProvider = urlProvider; + this.urlProvider = uiUrlProvider; } //~--- get methods -------------------------------------------------------- @@ -175,7 +176,7 @@ public class RepositoryRootResource public String getCommitUrl() { return urlProvider.getRepositoryUrlProvider().getChangesetUrl( - repository.getId(), null); + repository.getId(), 0, 20); } /** @@ -218,7 +219,7 @@ public class RepositoryRootResource * * @return */ - public String getUIUrl() + public String getDetailUrl() { return urlProvider.getRepositoryUrlProvider().getDetailUrl( repository.getId()); @@ -289,10 +290,17 @@ public class RepositoryRootResource * Constructs ... * * + * + * @param configuration + * @param repositoryManager * @param urlProvider */ - public RepositoryTransformFunction(UrlProvider urlProvider) + public RepositoryTransformFunction(ScmConfiguration configuration, + RepositoryManager repositoryManager, + UrlProvider urlProvider) { + this.configuration = configuration; + this.repositoryManager = repositoryManager; this.urlProvider = urlProvider; } @@ -309,11 +317,19 @@ public class RepositoryRootResource @Override public RepositoryTemplateElement apply(Repository repository) { + RepositoryUtil.appendUrl(configuration, repositoryManager, repository); + return new RepositoryTemplateElement(repository, urlProvider); } //~--- fields ------------------------------------------------------------- + /** Field description */ + private ScmConfiguration configuration; + + /** Field description */ + private RepositoryManager repositoryManager; + /** Field description */ private UrlProvider urlProvider; } diff --git a/scm-webapp/src/main/resources/templates/repository-root.html b/scm-webapp/src/main/resources/templates/repository-root.html index 3ee14ece35..b8ee88f7f9 100644 --- a/scm-webapp/src/main/resources/templates/repository-root.html +++ b/scm-webapp/src/main/resources/templates/repository-root.html @@ -93,7 +93,7 @@ From a087a45fb4d6ee0ef8e6b6030e7a1e12e6afd2b3 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 10:36:20 +0200 Subject: [PATCH 09/12] create url from current request --- .../sonia/scm/repository/RepositoryUtil.java | 31 +++++++++- .../main/java/sonia/scm/util/HttpUtil.java | 28 +++++++++ .../resources/RepositoryRootResource.java | 58 ++++++++++--------- 3 files changed, 88 insertions(+), 29 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java index c4aca962c7..d44e7e50b1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java @@ -52,6 +52,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import javax.servlet.http.HttpServletRequest; + /** * * @author Sebastian Sdorra @@ -73,7 +75,7 @@ public class RepositoryUtil * @param configuration * @param repositoryManager * @param repository - * + * * @since 1.16 */ public static void appendUrl(ScmConfiguration configuration, @@ -92,6 +94,33 @@ public class RepositoryUtil } } + /** + * Method description + * + * + * + * @param request + * @param repositoryManager + * @param repository + * + * @since 1.16 + */ + public static void appendUrl(HttpServletRequest request, + RepositoryManager repositoryManager, + Repository repository) + { + RepositoryHandler handler = + repositoryManager.getHandler(repository.getType()); + + if (handler != null) + { + String url = handler.createResourcePath(repository); + + url = HttpUtil.getCompleteUrl(request, url); + repository.setUrl(url); + } + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java index 8ed7af3967..10634a2ede 100644 --- a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java @@ -293,6 +293,34 @@ public class HttpUtil //~--- get methods ---------------------------------------------------------- + /** + * Returns an absolute url with context path. + * + * + * @param request http client request + * @param pathSegments + * + * @return absolute url with context path + * @since 1.16 + */ + public static String getCompleteUrl(HttpServletRequest request, + String... pathSegments) + { + String baseUrl = + request.getRequestURL().toString().replace(request.getRequestURI(), + Util.EMPTY_STRING).concat(request.getContextPath()); + + if (Util.isNotEmpty(pathSegments)) + { + for (String ps : pathSegments) + { + baseUrl = append(baseUrl, ps); + } + } + + return baseUrl; + } + /** * Return the complete url of the given path. * diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 14bcf0e7a0..285f1c7755 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -47,6 +47,7 @@ import sonia.scm.repository.RepositoryUtil; import sonia.scm.template.TemplateHandler; import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; +import sonia.scm.util.HttpUtil; //~--- JDK imports ------------------------------------------------------------ @@ -58,10 +59,13 @@ import java.util.Comparator; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletRequest; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; /** @@ -82,16 +86,13 @@ public class RepositoryRootResource * * * - * @param configuration * @param templateHandler * @param repositoryManager */ @Inject - public RepositoryRootResource(ScmConfiguration configuration, - TemplateHandler templateHandler, + public RepositoryRootResource(TemplateHandler templateHandler, RepositoryManager repositoryManager) { - this.configuration = configuration; this.templateHandler = templateHandler; this.repositoryManager = repositoryManager; } @@ -102,6 +103,8 @@ public class RepositoryRootResource * Method description * * + * + * @param request * @param type * * @return @@ -110,18 +113,19 @@ public class RepositoryRootResource */ @GET @Produces(MediaType.TEXT_HTML) - public String renderRepositoriesRoot(@PathParam("type") final String type) + public String renderRepositoriesRoot(@Context HttpServletRequest request, + @PathParam("type") final String type) throws IOException { UrlProvider uiUrlProvider = - UrlProviderFactory.createUrlProvider(configuration.getBaseUrl(), + UrlProviderFactory.createUrlProvider(HttpUtil.getCompleteUrl(request), UrlProviderFactory.TYPE_WUI); //J- Collection unsortedRepositories = Collections2.transform( Collections2.filter( repositoryManager.getAll(), new RepositoryTypePredicate(type)) - , new RepositoryTransformFunction(configuration, repositoryManager, uiUrlProvider) + , new RepositoryTransformFunction(request, repositoryManager, uiUrlProvider) ); List repositories = Ordering.from( @@ -179,6 +183,18 @@ public class RepositoryRootResource repository.getId(), 0, 20); } + /** + * Method description + * + * + * @return + */ + public String getDetailUrl() + { + return urlProvider.getRepositoryUrlProvider().getDetailUrl( + repository.getId()); + } + /** * Method description * @@ -213,18 +229,6 @@ public class RepositoryRootResource repository.getId(), null, null); } - /** - * Method description - * - * - * @return - */ - public String getDetailUrl() - { - return urlProvider.getRepositoryUrlProvider().getDetailUrl( - repository.getId()); - } - /** * Method description * @@ -291,15 +295,16 @@ public class RepositoryRootResource * * * - * @param configuration + * + * @param request * @param repositoryManager * @param urlProvider */ - public RepositoryTransformFunction(ScmConfiguration configuration, + public RepositoryTransformFunction(HttpServletRequest request, RepositoryManager repositoryManager, UrlProvider urlProvider) { - this.configuration = configuration; + this.request = request; this.repositoryManager = repositoryManager; this.urlProvider = urlProvider; } @@ -317,7 +322,7 @@ public class RepositoryRootResource @Override public RepositoryTemplateElement apply(Repository repository) { - RepositoryUtil.appendUrl(configuration, repositoryManager, repository); + RepositoryUtil.appendUrl(request, repositoryManager, repository); return new RepositoryTemplateElement(repository, urlProvider); } @@ -325,10 +330,10 @@ public class RepositoryRootResource //~--- fields ------------------------------------------------------------- /** Field description */ - private ScmConfiguration configuration; + private RepositoryManager repositoryManager; /** Field description */ - private RepositoryManager repositoryManager; + private HttpServletRequest request; /** Field description */ private UrlProvider urlProvider; @@ -337,9 +342,6 @@ public class RepositoryRootResource //~--- fields --------------------------------------------------------------- - /** Field description */ - private ScmConfiguration configuration; - /** Field description */ private RepositoryManager repositoryManager; From 99458474f6895756eea6683fde93ea94d89a9e2b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 10:37:55 +0200 Subject: [PATCH 10/12] fix duplicated path separator --- scm-core/src/main/java/sonia/scm/util/HttpUtil.java | 2 +- .../sonia/scm/api/rest/resources/RepositoryRootResource.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java index 10634a2ede..f598bcc9a9 100644 --- a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java @@ -155,7 +155,7 @@ public class HttpUtil */ public static String append(String uri, String suffix) { - if (!uri.endsWith(SEPARATOR_PATH)) + if (!uri.endsWith(SEPARATOR_PATH) && !suffix.startsWith(SEPARATOR_PATH)) { uri = uri.concat(SEPARATOR_PATH); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index 285f1c7755..9a11e74a6f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -39,7 +39,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Ordering; import com.google.inject.Inject; -import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryTypePredicate; From 6a51484b6007d4f83ea9d63fcffbf9f640133495 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 11:04:41 +0200 Subject: [PATCH 11/12] redirect to repository root help url on IllegalStateException --- .../scm/web/filter/PermissionFilter.java | 57 +++++++++++++++++++ .../web/filter/ProviderPermissionFilter.java | 36 +++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java b/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java index 181c743232..a584c821e5 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java @@ -35,6 +35,7 @@ package sonia.scm.web.filter; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Splitter; import com.google.inject.Provider; import org.slf4j.Logger; @@ -49,12 +50,15 @@ import sonia.scm.security.ScmSecurityException; import sonia.scm.user.User; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; +import sonia.scm.util.Util; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +import java.util.Iterator; + import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -172,6 +176,17 @@ public abstract class PermissionFilter extends HttpFilter response.sendError(HttpServletResponse.SC_NOT_FOUND); } } + catch (IllegalStateException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn( + "wrong request at ".concat(request.getRequestURI()).concat( + " send redirect"), ex); + } + + response.sendRedirect(getRepositoryRootHelpUrl(request)); + } catch (ScmSecurityException ex) { if (logger.isWarnEnabled()) @@ -193,6 +208,29 @@ public abstract class PermissionFilter extends HttpFilter } } + /** + * Method description + * + * + * @param request + * + * @return + */ + private String extractType(HttpServletRequest request) + { + Iterator it = Splitter.on( + HttpUtil.SEPARATOR_PATH).omitEmptyStrings().split( + request.getRequestURI()).iterator(); + String type = it.next(); + + if (Util.isNotEmpty(request.getContextPath())) + { + type = it.next(); + } + + return type; + } + /** * Method description * @@ -217,6 +255,25 @@ public abstract class PermissionFilter extends HttpFilter //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param request + * + * @return + */ + private String getRepositoryRootHelpUrl(HttpServletRequest request) + { + String type = extractType(request); + String helpUrl = HttpUtil.getCompleteUrl(request, + "/api/rest/help/repository-root/"); + + helpUrl = helpUrl.concat(type).concat(".html"); + + return helpUrl; + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java index e1b233f5ab..6d9abe73b1 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java @@ -35,8 +35,14 @@ package sonia.scm.web.filter; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Throwables; import com.google.inject.Provider; +import com.google.inject.ProvisionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.web.security.WebSecurityContext; @@ -44,7 +50,6 @@ import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import javax.servlet.http.HttpServletRequest; -import sonia.scm.config.ScmConfiguration; /** * @@ -54,10 +59,20 @@ import sonia.scm.config.ScmConfiguration; public abstract class ProviderPermissionFilter extends PermissionFilter { + /** + * the logger for ProviderPermissionFilter + */ + private static final Logger logger = + LoggerFactory.getLogger(ProviderPermissionFilter.class); + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * * + * + * @param configuration * @param securityContextProvider * @param repositoryProvider */ @@ -83,7 +98,24 @@ public abstract class ProviderPermissionFilter extends PermissionFilter @Override protected Repository getRepository(HttpServletRequest request) { - return repositoryProvider.get(); + Repository repository = null; + + try + { + repository = repositoryProvider.get(); + } + catch (ProvisionException ex) + { + Throwables.propagateIfInstanceOf(ex.getCause(), + IllegalStateException.class); + + if (logger.isErrorEnabled()) + { + logger.error("could not get repository from request", ex); + } + } + + return repository; } //~--- fields --------------------------------------------------------------- From b11e4d2dee3341541b87b74cf39ff602e2db476f Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 29 May 2012 15:29:54 +0200 Subject: [PATCH 12/12] close branch issue-161