From 41b47b13dcfbcbabf2afe5319bdcff4e7ec4836d Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Tue, 9 Oct 2018 08:55:57 +0200 Subject: [PATCH] use javax validation --- .../java/sonia/scm/repository/Repository.java | 2 +- .../java/sonia/scm/xml/AbstractXmlDAO.java | 3 +- .../AutoCompleteBadParamException.java | 11 ------ .../AutoCompleteBadParamExceptionMapper.java | 16 --------- .../v2/resources/AutoCompleteResource.java | 35 +++++++------------ .../scm/api/v2/resources/DispatcherMock.java | 1 - 6 files changed, 16 insertions(+), 52 deletions(-) delete mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamException.java delete mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamExceptionMapper.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Repository.java b/scm-core/src/main/java/sonia/scm/repository/Repository.java index 7f2aab6865..97915eeaa5 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -186,7 +186,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per @Override public String getDisplayName() { - return getNamespaceAndName().toString(); + return getNamespace() + "/" + getName(); } @Override diff --git a/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java b/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java index f0907538cf..ee1affe252 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java @@ -35,6 +35,7 @@ package sonia.scm.xml; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.ImmutableList; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -241,7 +242,7 @@ public abstract class AbstractXmlDAO item.getId().contains(searched) || (item.getDisplayName() != null && item.getDisplayName().contains(searched))) + .filter(item -> StringUtils.containsIgnoreCase(item.getId(), searched) || (item.getDisplayName() != null && StringUtils.containsIgnoreCase(item.getDisplayName() , searched))) .limit(limit <= 0 ? size : limit) .collect(Collectors.toList())); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamException.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamException.java deleted file mode 100644 index 1f3f7177bd..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamException.java +++ /dev/null @@ -1,11 +0,0 @@ -package sonia.scm.api.v2.resources; - -public class AutoCompleteBadParamException extends Exception { - - public static final String PARAMETER_IS_REQUIRED = "The parameter is required."; - public static final String INVALID_PARAMETER_LENGTH = "Invalid parameter length."; - - public AutoCompleteBadParamException(String message) { - super(message); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamExceptionMapper.java deleted file mode 100644 index d2b2eeaed3..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteBadParamExceptionMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package sonia.scm.api.v2.resources; - -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -@Provider -public class AutoCompleteBadParamExceptionMapper implements ExceptionMapper { - - @Override - public Response toResponse(AutoCompleteBadParamException exception) { - return Response.status(Response.Status.BAD_REQUEST) - .entity(exception.getMessage()) - .build(); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java index 5dfa78a762..eebec9baa4 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java @@ -2,14 +2,14 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; -import org.apache.commons.lang.StringUtils; +import org.hibernate.validator.constraints.NotEmpty; import sonia.scm.group.GroupManager; import sonia.scm.repository.RepositoryManager; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.validation.Valid; +import javax.validation.constraints.Size; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -18,14 +18,16 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import java.util.stream.Collectors; -import static sonia.scm.api.v2.resources.AutoCompleteBadParamException.INVALID_PARAMETER_LENGTH; -import static sonia.scm.api.v2.resources.AutoCompleteBadParamException.PARAMETER_IS_REQUIRED; @Path(AutoCompleteResource.PATH) public class AutoCompleteResource { public static final String PATH = "v2/autocomplete/"; public static final String DEFAULT_LIMIT = "5"; - public static final int MIN_SEARCHED_CHARS = 1; + public static final int MIN_SEARCHED_CHARS = 2; + + public static final String PARAMETER_IS_REQUIRED = "The parameter is required."; + public static final String INVALID_PARAMETER_LENGTH = "Invalid parameter length."; + private ReducedObjectModelToDtoMapper mapper; @@ -51,9 +53,8 @@ public class AutoCompleteResource { @ResponseCode(code = 403, condition = "not authorized, the current user does not have the \"user:autocomplete\" privilege"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response searchUser(@QueryParam("filter") String filter, - @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) throws AutoCompleteBadParamException { - validateParams(filter); + public Response searchUser(@NotEmpty(message = PARAMETER_IS_REQUIRED) @Size(min = MIN_SEARCHED_CHARS, message = INVALID_PARAMETER_LENGTH) @QueryParam("filter") String filter, + @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) { return Response.ok(userManager.getFiltered(filter, limit) .stream() .map(mapper::map) @@ -71,9 +72,8 @@ public class AutoCompleteResource { @ResponseCode(code = 403, condition = "not authorized, the current user does not have the \"group:autocomplete\" privilege"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response searchGroup(@Valid @QueryParam("filter") String filter, - @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) throws AutoCompleteBadParamException { - validateParams(filter); + public Response searchGroup(@NotEmpty(message = PARAMETER_IS_REQUIRED) @Size(min = MIN_SEARCHED_CHARS, message = INVALID_PARAMETER_LENGTH) @QueryParam("filter") String filter, + @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) { return Response.ok(groupManager.getFiltered(filter, limit) .stream() .map(mapper::map) @@ -91,9 +91,8 @@ public class AutoCompleteResource { @ResponseCode(code = 403, condition = "not authorized, the current user does not have the \"repository:autocomplete\" privilege"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response searchRepo(@Valid @QueryParam("filter") String filter, - @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) throws AutoCompleteBadParamException { - validateParams(filter); + public Response searchRepo(@NotEmpty(message = PARAMETER_IS_REQUIRED) @Size(min = MIN_SEARCHED_CHARS, message = INVALID_PARAMETER_LENGTH) @QueryParam("filter") String filter, + @DefaultValue(DEFAULT_LIMIT) @QueryParam("limit") Integer limit) { return Response.ok(repositoryManager.getFiltered(filter, limit) .stream() .map(mapper::map) @@ -101,13 +100,5 @@ public class AutoCompleteResource { .build(); } - void validateParams(String filter) throws AutoCompleteBadParamException { - if (StringUtils.isBlank(filter)) { - throw new AutoCompleteBadParamException(PARAMETER_IS_REQUIRED); - } - if (filter.length() <= MIN_SEARCHED_CHARS) { - throw new AutoCompleteBadParamException(INVALID_PARAMETER_LENGTH); - } - } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java index d28e96d8a4..a1abdb6ff4 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java @@ -17,7 +17,6 @@ public class DispatcherMock { dispatcher.getProviderFactory().registerProvider(InternalRepositoryExceptionMapper.class); dispatcher.getProviderFactory().registerProvider(ChangePasswordNotAllowedExceptionMapper.class); dispatcher.getProviderFactory().registerProvider(InvalidPasswordExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(AutoCompleteBadParamExceptionMapper.class); return dispatcher; } }