From f70745d65a57a0f32c4cbbb683e61870d2cff7e3 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:45:21 +0200 Subject: [PATCH 001/144] style: remove unused imports --- .../scm/cli/cmd/ImportUrlSubCommand.java | 6 +---- .../scm/cli/cmd/SubCommandOptionHandler.java | 3 --- .../sonia/scm/net/ahc/BaseHttpRequest.java | 1 - .../java/sonia/scm/plugin/PluginLoader.java | 4 --- .../ahc/AdvancedHttpRequestWithBodyTest.java | 19 ++++++------- .../repository/spi/AbstractGitCommand.java | 11 ++++---- .../scm/repository/spi/GitBrowseCommand.java | 1 - .../scm/repository/spi/GitCatCommand.java | 1 - .../sonia/scm/web/GitPermissionFilter.java | 16 +++++------ .../scm/web/GitPermissionFilterTest.java | 22 +++++++-------- .../java/sonia/scm/web/SvnServletModule.java | 1 - .../spi/SvnRepositoryClientProvider.java | 6 ++--- .../resources/BrowserStreamingOutput.java | 2 -- .../rest/resources/DiffStreamingOutput.java | 14 ++++------ .../scm/boot/BootstrapContextFilter.java | 1 - .../scm/boot/BootstrapContextListener.java | 1 - .../main/java/sonia/scm/filter/MDCFilter.java | 9 ++----- .../resources/AbstractResourceServlet.java | 11 +++----- .../scm/security/AccessTokenCookieIssuer.java | 17 +++++------- .../java/sonia/scm/security/BearerRealm.java | 19 +++++-------- .../scm/security/JwtAccessTokenBuilder.java | 10 +++---- .../cache/CacheConfigurationTestLoader.java | 15 ++++------- .../sonia/scm/filter/SecurityFilterTest.java | 21 ++++++++------- .../scm/it/AuthorizationScopeITCase.java | 12 +++++---- .../sonia/scm/it/IntegrationTestUtil.java | 27 +++++++------------ .../ahc/DefaultAdvancedHttpResponseTest.java | 21 +++++---------- .../plugin/MultiParentClassLoaderTest.java | 23 ++++++++-------- .../DefaultRepositoryManagerPerfTest.java | 20 +++++--------- .../sonia/scm/schedule/QuartzTaskTest.java | 11 ++++---- .../scm/user/DefaultUserManagerTest.java | 13 +++------ 30 files changed, 132 insertions(+), 206 deletions(-) diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ImportUrlSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ImportUrlSubCommand.java index 912a9a5fbc..7b1ac86237 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ImportUrlSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ImportUrlSubCommand.java @@ -33,19 +33,15 @@ package sonia.scm.cli.cmd; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.collect.Maps; import org.kohsuke.args4j.Option; - import sonia.scm.client.ImportUrlRequest; import sonia.scm.client.ScmClientSession; import sonia.scm.repository.Repository; -//~--- JDK imports ------------------------------------------------------------ - import java.net.URL; -import java.util.Map; +//~--- JDK imports ------------------------------------------------------------ /** * diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java index dd219e557c..39957c2158 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java @@ -37,13 +37,10 @@ package sonia.scm.cli.cmd; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; -import org.kohsuke.args4j.Localizable; import org.kohsuke.args4j.OptionDef; -import org.kohsuke.args4j.spi.Messages; import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; - import sonia.scm.cli.SimpleLocalizable; /** diff --git a/scm-core/src/main/java/sonia/scm/net/ahc/BaseHttpRequest.java b/scm-core/src/main/java/sonia/scm/net/ahc/BaseHttpRequest.java index c80ae9b1c4..0723f44b6c 100644 --- a/scm-core/src/main/java/sonia/scm/net/ahc/BaseHttpRequest.java +++ b/scm-core/src/main/java/sonia/scm/net/ahc/BaseHttpRequest.java @@ -35,7 +35,6 @@ package sonia.scm.net.ahc; import com.google.common.base.Charsets; import com.google.common.base.Strings; -import com.google.common.collect.HashMultimap; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java b/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java index 0bf37054a8..a843bea773 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java @@ -33,10 +33,6 @@ package sonia.scm.plugin; -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.inject.Module; - //~--- JDK imports ------------------------------------------------------------ import java.util.Collection; diff --git a/scm-core/src/test/java/sonia/scm/net/ahc/AdvancedHttpRequestWithBodyTest.java b/scm-core/src/test/java/sonia/scm/net/ahc/AdvancedHttpRequestWithBodyTest.java index 5a7c55a46d..b1e069fcad 100644 --- a/scm-core/src/test/java/sonia/scm/net/ahc/AdvancedHttpRequestWithBodyTest.java +++ b/scm-core/src/test/java/sonia/scm/net/ahc/AdvancedHttpRequestWithBodyTest.java @@ -33,21 +33,22 @@ package sonia.scm.net.ahc; import com.google.common.base.Charsets; import com.google.common.io.ByteSource; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import org.junit.Test; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; -import static org.mockito.Mockito.*; import org.junit.Before; import org.junit.Rule; +import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; + +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + /** * * @author Sebastian Sdorra @@ -166,4 +167,4 @@ public class AdvancedHttpRequestWithBodyTest { assertEquals(AdvancedHttpRequestWithBody.class, request.self().getClass()); } -} \ No newline at end of file +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java index d098c30b4e..7591d5c7a7 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java @@ -34,19 +34,18 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; -import org.eclipse.jgit.lib.Repository; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitConstants; import sonia.scm.repository.GitUtil; +import java.io.IOException; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 72ec3f73e7..feb773af21 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -71,7 +71,6 @@ import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Map; -import sonia.scm.util.IOUtil; /** * diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java index 4420b9a22a..fac6b7b57b 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java @@ -34,7 +34,6 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Strings; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectLoader; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java index 1f07753f1e..25d79422c4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java @@ -37,25 +37,21 @@ package sonia.scm.web; import com.google.common.annotations.VisibleForTesting; import com.google.inject.Inject; -import com.google.inject.Singleton; - import org.eclipse.jgit.http.server.GitSmartHttpTools; - import sonia.scm.ClientMessages; +import sonia.scm.Priority; import sonia.scm.config.ScmConfiguration; +import sonia.scm.filter.Filters; +import sonia.scm.filter.WebElement; import sonia.scm.repository.GitUtil; import sonia.scm.repository.RepositoryProvider; import sonia.scm.web.filter.ProviderPermissionFilter; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import sonia.scm.Priority; -import sonia.scm.filter.Filters; -import sonia.scm.filter.WebElement; +import java.io.IOException; + +//~--- JDK imports ------------------------------------------------------------ /** * GitPermissionFilter decides if a git request requires write or read privileges. diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java index df4827a9fc..d667290197 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java @@ -1,24 +1,24 @@ package sonia.scm.web; -import com.google.common.base.Charsets; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import javax.servlet.ServletOutputStream; import org.junit.Test; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import org.junit.runner.RunWith; import org.mockito.Mock; -import static org.mockito.Mockito.*; import org.mockito.runners.MockitoJUnitRunner; import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.RepositoryProvider; import sonia.scm.util.HttpUtil; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.*; + /** * Unit tests for {@link GitPermissionFilter}. * diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnServletModule.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnServletModule.java index 813f7fb0e6..b55588969f 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnServletModule.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnServletModule.java @@ -38,7 +38,6 @@ package sonia.scm.web; import com.google.inject.servlet.ServletModule; import sonia.scm.plugin.Extension; -import sonia.scm.web.filter.AuthenticationFilter; //~--- JDK imports ------------------------------------------------------------ diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java index 609ae1441b..9c5424d660 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java @@ -31,13 +31,13 @@ package sonia.scm.repository.client.spi; import com.google.common.collect.ImmutableSet; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import sonia.scm.repository.client.api.ClientCommand; + import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; -import org.tmatesoft.svn.core.SVNURL; -import org.tmatesoft.svn.core.wc.SVNClientManager; -import sonia.scm.repository.client.api.ClientCommand; /** * Subversion repository client provider. diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java index 234aae4015..7c2e6bbe98 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java @@ -35,8 +35,6 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.io.Closeables; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java index fc0f3751e5..3f50d447e5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java @@ -35,26 +35,22 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.io.Closeables; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.DiffCommandBuilder; import sonia.scm.repository.api.RepositoryService; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.OutputStream; +import sonia.scm.util.IOUtil; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; -import sonia.scm.util.IOUtil; +import java.io.IOException; +import java.io.OutputStream; + +//~--- JDK imports ------------------------------------------------------------ /** * diff --git a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java index bfa2218e76..7d1d3d3ee1 100644 --- a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java @@ -47,7 +47,6 @@ import sonia.scm.event.ScmEventBus; //~--- JDK imports ------------------------------------------------------------ import javax.servlet.FilterConfig; -import javax.servlet.ServletContextEvent; import javax.servlet.ServletException; /** diff --git a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java index 4f7a00ce56..e8c91ddd4f 100644 --- a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java @@ -38,7 +38,6 @@ import com.github.legman.Subscribe; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; import com.google.common.io.Files; -import com.google.inject.servlet.GuiceFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/filter/MDCFilter.java b/scm-webapp/src/main/java/sonia/scm/filter/MDCFilter.java index 9198c19ef7..3c242f546f 100644 --- a/scm-webapp/src/main/java/sonia/scm/filter/MDCFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/filter/MDCFilter.java @@ -34,25 +34,20 @@ package sonia.scm.filter; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.annotations.VisibleForTesting; -import com.google.inject.Singleton; - import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; - import org.slf4j.MDC; - +import sonia.scm.Priority; import sonia.scm.SCMContext; import sonia.scm.web.filter.HttpFilter; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import sonia.scm.Priority; +import java.io.IOException; /** * diff --git a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceServlet.java b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceServlet.java index 74a6291a98..016ce8f927 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceServlet.java @@ -37,19 +37,16 @@ package sonia.scm.resources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.util.HttpUtil; -import sonia.scm.util.IOUtil; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; + +//~--- JDK imports ------------------------------------------------------------ /** * diff --git a/scm-webapp/src/main/java/sonia/scm/security/AccessTokenCookieIssuer.java b/scm-webapp/src/main/java/sonia/scm/security/AccessTokenCookieIssuer.java index 52760e1c9a..b804600c8a 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/AccessTokenCookieIssuer.java +++ b/scm-webapp/src/main/java/sonia/scm/security/AccessTokenCookieIssuer.java @@ -30,21 +30,18 @@ */ package sonia.scm.security; -import com.google.common.annotations.VisibleForTesting; -import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.config.ScmConfiguration; +import sonia.scm.util.HttpUtil; +import sonia.scm.util.Util; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.config.ScmConfiguration; -import sonia.scm.util.HttpUtil; -import sonia.scm.util.Util; +import java.util.Date; +import java.util.concurrent.TimeUnit; /** * Generates cookies and invalidates access token cookies. diff --git a/scm-webapp/src/main/java/sonia/scm/security/BearerRealm.java b/scm-webapp/src/main/java/sonia/scm/security/BearerRealm.java index 3b19351641..d1a74b2c3d 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/BearerRealm.java +++ b/scm-webapp/src/main/java/sonia/scm/security/BearerRealm.java @@ -34,32 +34,27 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.annotations.VisibleForTesting; - import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; - import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher; import org.apache.shiro.realm.AuthenticatingRealm; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import sonia.scm.group.GroupDAO; import sonia.scm.plugin.Extension; import sonia.scm.user.UserDAO; -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.List; -import java.util.Set; - -//~--- JDK imports ------------------------------------------------------------ - import javax.inject.Inject; import javax.inject.Singleton; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; + +//~--- JDK imports ------------------------------------------------------------ /** * Realm for authentication with {@link BearerToken}. diff --git a/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilder.java b/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilder.java index 1b387730bf..9a58dab1d9 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilder.java +++ b/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilder.java @@ -36,16 +36,16 @@ import com.google.common.collect.Maps; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + /** * Jwt implementation of {@link AccessTokenBuilder}. * diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java index 8efd40465e..14c2355a85 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java @@ -34,28 +34,23 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.collect.Iterators; import com.google.common.io.ByteSource; -import com.google.common.io.CharSource; import com.google.common.io.Files; import com.google.common.io.Resources; - import org.junit.rules.TemporaryFolder; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Iterator; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; //~--- JDK imports ------------------------------------------------------------ -import java.io.File; -import java.io.IOException; - -import java.net.URL; - -import java.util.Iterator; - /** * * @author Sebastian Sdorra diff --git a/scm-webapp/src/test/java/sonia/scm/filter/SecurityFilterTest.java b/scm-webapp/src/test/java/sonia/scm/filter/SecurityFilterTest.java index 13333cc223..624bab8719 100644 --- a/scm-webapp/src/test/java/sonia/scm/filter/SecurityFilterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/filter/SecurityFilterTest.java @@ -33,30 +33,31 @@ package sonia.scm.filter; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; -import org.junit.Test; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; import org.junit.Before; import org.junit.Rule; +import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; -import static org.mockito.Mockito.*; import org.mockito.runners.MockitoJUnitRunner; import sonia.scm.SCMContext; import sonia.scm.config.ScmConfiguration; import sonia.scm.user.User; import sonia.scm.user.UserTestData; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + /** * Unit tests for {@link SecurityFilter}. * @@ -235,4 +236,4 @@ public class SecurityFilterTest { } -} \ No newline at end of file +} diff --git a/scm-webapp/src/test/java/sonia/scm/it/AuthorizationScopeITCase.java b/scm-webapp/src/test/java/sonia/scm/it/AuthorizationScopeITCase.java index d7b06d93b3..6ee544f66f 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/AuthorizationScopeITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/AuthorizationScopeITCase.java @@ -36,19 +36,21 @@ import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.core.util.MultivaluedMapImpl; -import java.util.List; -import javax.ws.rs.core.MultivaluedMap; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import sonia.scm.ScmState; -import static sonia.scm.it.IntegrationTestUtil.*; -import static sonia.scm.it.RepositoryITUtil.*; -import static sonia.scm.it.RepositoryITUtil.createRepository; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryTestData; +import javax.ws.rs.core.MultivaluedMap; +import java.util.List; + +import static sonia.scm.it.IntegrationTestUtil.*; +import static sonia.scm.it.RepositoryITUtil.createRepository; +import static sonia.scm.it.RepositoryITUtil.deleteRepository; + /** * Integration test for authorization with scope. * diff --git a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java index 4e274267e8..2be86ebc0f 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java @@ -33,38 +33,31 @@ package sonia.scm.it; -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.ScmState; -import sonia.scm.Type; -import sonia.scm.user.User; -import sonia.scm.util.IOUtil; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.client.apache.ApacheHttpClient; import com.sun.jersey.client.apache.config.ApacheHttpClientConfig; import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig; import com.sun.jersey.core.util.MultivaluedMapImpl; +import sonia.scm.ScmState; +import sonia.scm.Type; +import sonia.scm.repository.Person; +import sonia.scm.repository.client.api.ClientCommand; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.user.User; +import sonia.scm.util.IOUtil; +import javax.ws.rs.core.MultivaluedMap; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; - import java.util.ArrayList; import java.util.Collection; import java.util.UUID; -import javax.ws.rs.core.MultivaluedMap; -import sonia.scm.repository.Person; -import sonia.scm.repository.client.api.ClientCommand; -import sonia.scm.repository.client.api.RepositoryClient; +import static org.junit.Assert.*; + /** * diff --git a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java index 8f5a7c23b7..c68edad03c 100644 --- a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java +++ b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java @@ -40,32 +40,25 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.io.ByteSource; - import org.junit.Test; import org.junit.runner.RunWith; - import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; - import sonia.scm.config.ScmConfiguration; - -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -import static org.mockito.Mockito.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.net.SSLContextProvider; import java.io.ByteArrayInputStream; import java.io.IOException; - import java.net.HttpURLConnection; - import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; -import sonia.scm.net.SSLContextProvider; + +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + +//~--- JDK imports ------------------------------------------------------------ /** * diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/MultiParentClassLoaderTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/MultiParentClassLoaderTest.java index 89e5e8a2c8..2b14f401f4 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/MultiParentClassLoaderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/MultiParentClassLoaderTest.java @@ -29,28 +29,27 @@ package sonia.scm.plugin; -import com.google.common.base.Enums; -import com.google.common.collect.Iterables; -import com.google.common.collect.Iterators; -import java.io.IOException; -import java.net.URL; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; -import static org.junit.Assert.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; -import static org.mockito.Mockito.*; -import static org.hamcrest.Matchers.*; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + /** * * @author Sebastian Sdorra diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java index 90a78e63c6..b47739bfe2 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java @@ -33,19 +33,8 @@ package sonia.scm.repository; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableSet; import com.google.inject.Provider; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.AuthenticationInfo; -import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.authc.SimpleAuthenticationInfo; -import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authc.*; import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.mgt.DefaultSecurityManager; @@ -58,7 +47,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import static org.mockito.Mockito.*; import org.mockito.runners.MockitoJUnitRunner; import sonia.scm.SCMContextProvider; import sonia.scm.Type; @@ -67,9 +55,13 @@ import sonia.scm.config.ScmConfiguration; import sonia.scm.security.AuthorizationCollector; import sonia.scm.security.DefaultKeyGenerator; import sonia.scm.security.KeyGenerator; -import sonia.scm.security.SecuritySystem; import sonia.scm.user.UserTestData; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static org.mockito.Mockito.when; + /** * Performance test for {@link RepositoryManager#getAll()}. * diff --git a/scm-webapp/src/test/java/sonia/scm/schedule/QuartzTaskTest.java b/scm-webapp/src/test/java/sonia/scm/schedule/QuartzTaskTest.java index 3318a41d18..ef1fc02464 100644 --- a/scm-webapp/src/test/java/sonia/scm/schedule/QuartzTaskTest.java +++ b/scm-webapp/src/test/java/sonia/scm/schedule/QuartzTaskTest.java @@ -31,18 +31,17 @@ package sonia.scm.schedule; -import org.junit.Test; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import static org.hamcrest.Matchers.*; import org.junit.Before; +import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.quartz.JobKey; import org.quartz.SchedulerException; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + /** * Unit tests for {@link QuartzTask}. * @@ -87,4 +86,4 @@ public class QuartzTaskTest { task.cancel(); } -} \ No newline at end of file +} diff --git a/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java b/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java index eb892c7e89..539b2da31d 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java @@ -38,23 +38,18 @@ package sonia.scm.user; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.collect.Lists; - -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; - import sonia.scm.store.JAXBConfigurationStoreFactory; import sonia.scm.user.xml.XmlUserDAO; -import sonia.scm.util.MockUtil; + +import java.util.Collections; +import java.util.List; import static org.mockito.Mockito.*; //~--- JDK imports ------------------------------------------------------------ -import java.util.Collections; -import java.util.List; -import org.junit.Rule; -import sonia.scm.store.ConfigurationStoreFactory; - /** * * @author Sebastian Sdorra From 4bd093f472ab9551698f9936889d4d5a597c754c Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:46:54 +0200 Subject: [PATCH 002/144] refactor: replace for loop with foreach --- scm-core/src/main/java/sonia/scm/util/Util.java | 8 +++----- .../sonia/scm/web/SvnCollectionRenderer.java | 17 +++++------------ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/util/Util.java b/scm-core/src/main/java/sonia/scm/util/Util.java index 5439cc77ec..e57d48f314 100644 --- a/scm-core/src/main/java/sonia/scm/util/Util.java +++ b/scm-core/src/main/java/sonia/scm/util/Util.java @@ -506,12 +506,10 @@ public final class Util { StringBuilder buffer = new StringBuilder(); - for (int i = 0; i < byteValue.length; i++) - { - int x = byteValue[i] & 0xff; + for (final byte aByteValue : byteValue) { + int x = aByteValue & 0xff; - if (x < 16) - { + if (x < 16) { buffer.append('0'); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnCollectionRenderer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnCollectionRenderer.java index 0bfb6b4575..2087ed8e10 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnCollectionRenderer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnCollectionRenderer.java @@ -38,10 +38,8 @@ import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Ordering; import com.google.inject.Inject; import com.google.inject.Provider; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.tmatesoft.svn.core.SVNDirEntry; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; @@ -50,7 +48,6 @@ import org.tmatesoft.svn.core.internal.server.dav.CollectionRenderer; import org.tmatesoft.svn.core.internal.server.dav.DAVPathUtil; import org.tmatesoft.svn.core.internal.server.dav.DAVResource; import org.tmatesoft.svn.core.internal.server.dav.DAVResourceURI; - import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; @@ -62,14 +59,12 @@ import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; import sonia.scm.util.HttpUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.StringWriter; - -import java.util.Iterator; import java.util.List; -import javax.servlet.http.HttpServletRequest; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -174,10 +169,8 @@ public class SvnCollectionRenderer implements CollectionRenderer entries.add(new DirectoryEntry("..", parent, true)); } - for (Iterator iterator = resource.getEntries().iterator(); - iterator.hasNext(); ) - { - SVNDirEntry entry = (SVNDirEntry) iterator.next(); + for (final Object o : resource.getEntries()) { + SVNDirEntry entry = (SVNDirEntry) o; entries.add(new DirectoryEntry(resource, entry)); } From 13b29ea9f224ff3b43cf49fea6e75a5323111749 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:54:39 +0200 Subject: [PATCH 003/144] refactor: replace String.indexOf() >= 0 with String.contains() --- .../sonia/scm/plugin/PluginCondition.java | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java index ad6ba84875..8f9ce89185 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java @@ -36,26 +36,19 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import sonia.scm.PlatformType; import sonia.scm.SCMContext; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; import sonia.scm.version.Version; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.io.Serializable; - import java.util.ArrayList; import java.util.List; import java.util.Locale; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -315,14 +308,14 @@ public class PluginCondition implements Cloneable, Serializable osType = osType.toLowerCase(Locale.ENGLISH); //J- - return ((osType.indexOf("win") >= 0) && (PlatformType.WINDOWS == type)) - || ((osType.indexOf("unix") >= 0) && type.isUnix()) - || ((osType.indexOf("posix") >= 0) && type.isPosix()) - || ((osType.indexOf("mac") >= 0) && (PlatformType.MAC == type)) - || ((osType.indexOf("linux") >= 0) && (PlatformType.LINUX == type)) - || ((osType.indexOf("solaris") >= 0) && (PlatformType.SOLARIS == type)) - || ((osType.indexOf("openbsd") >= 0) && (PlatformType.OPENBSD == type)) - || ((osType.indexOf("freebsd") >= 0) && (PlatformType.FREEBSD == type)); + return ((osType.contains("win")) && (PlatformType.WINDOWS == type)) + || ((osType.contains("unix")) && type.isUnix()) + || ((osType.contains("posix")) && type.isPosix()) + || ((osType.contains("mac")) && (PlatformType.MAC == type)) + || ((osType.contains("linux")) && (PlatformType.LINUX == type)) + || ((osType.contains("solaris")) && (PlatformType.SOLARIS == type)) + || ((osType.contains("openbsd")) && (PlatformType.OPENBSD == type)) + || ((osType.contains("freebsd")) && (PlatformType.FREEBSD == type)); //J+ } From ad719d37abcc134ddd7ddbe163b9d8b24393a66c Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:55:43 +0200 Subject: [PATCH 004/144] refactor: use Stream API instead of for-if --- .../java/sonia/scm/util/ValidationUtil.java | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java index 09032e93e5..621b704664 100644 --- a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java @@ -33,14 +33,10 @@ package sonia.scm.util; -//~--- non-JDK imports -------------------------------------------------------- - import com.google.common.base.Splitter; - import sonia.scm.Validateable; -//~--- JDK imports ------------------------------------------------------------ - +import java.util.Arrays; import java.util.regex.Pattern; /** @@ -120,25 +116,9 @@ public final class ValidationUtil * * @return */ - public static boolean isNotContaining(String value, - String... notAllowedStrings) - { - boolean result = Util.isNotEmpty(value); - - if (result && (notAllowedStrings != null)) - { - for (String nas : notAllowedStrings) - { - if (value.indexOf(nas) >= 0) - { - result = false; - - break; - } - } - } - - return result; + public static boolean isNotContaining(String value, String... notAllowedStrings) { + return !Util.isNotEmpty(value) || (notAllowedStrings != null) && Arrays.stream(notAllowedStrings) + .noneMatch(value::contains); } /** From 9f98b0e890b77d60867efc21df2c39c5c6366335 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:56:25 +0200 Subject: [PATCH 005/144] refactor: replace while with iterator with foreach loop --- .../java/sonia/scm/search/SearchUtil.java | 21 +++++++------------ .../scm/repository/spi/GitLogCommand.java | 13 +++--------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java index 90c65e3456..dc18e6bd27 100644 --- a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java +++ b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java @@ -37,18 +37,16 @@ package sonia.scm.search; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.TransformFilter; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Locale; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -165,23 +163,18 @@ public final class SearchUtil List items = new ArrayList(); int index = 0; int counter = 0; - Iterator it = collection.iterator(); - while (it.hasNext()) - { - T item = filter.accept(it.next()); + for (final T aCollection : collection) { + T item = filter.accept(aCollection); - if (item != null) - { + if (item != null) { index++; - if (searchRequest.getStartWith() <= index) - { + if (searchRequest.getStartWith() <= index) { items.add(item); counter++; - if (searchRequest.getMaxResults() <= counter) - { + if (searchRequest.getMaxResults() <= counter) { break; } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index 0643035e7a..2c6fac254b 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -235,22 +235,15 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand revWalk.markStart(revWalk.lookupCommit(head)); } - Iterator iterator = revWalk.iterator(); - - while (iterator.hasNext()) - { - RevCommit commit = iterator.next(); - + for (final RevCommit commit : revWalk) { if ((counter >= start) - && ((limit < 0) || (counter < start + limit))) - { + && ((limit < 0) || (counter < start + limit))) { changesetList.add(converter.createChangeset(commit)); } counter++; - if ((endId != null) && commit.getId().equals(endId)) - { + if ((endId != null) && commit.getId().equals(endId)) { break; } } From e9d5b3a3635e737b7da0ae845c750f090db1f9e0 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:59:19 +0200 Subject: [PATCH 006/144] refactor: collapse identical catch blocks --- .../scm/repository/AbstactImportHandler.java | 8 +--- .../sonia/scm/repository/HgHookManager.java | 26 +++-------- .../main/java/sonia/scm/web/HgCGIServlet.java | 32 ++++---------- .../resources/RepositoryImportResource.java | 43 ++++--------------- .../net/ahc/DefaultAdvancedHttpClient.java | 34 ++++----------- .../scm/net/ahc/XmlContentTransformer.java | 20 +++------ 6 files changed, 38 insertions(+), 125 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java index 2da506674d..958280a39b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java @@ -105,13 +105,7 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler { return doRepositoryImport(manager, false); } - catch (IOException ex) - { - - // should never happen - throw Throwables.propagate(ex); - } - catch (RepositoryException ex) + catch (IOException | RepositoryException ex) { // should never happen diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java index aa0e4156ae..2814cedb32 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java @@ -36,31 +36,21 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.github.legman.Subscribe; - import com.google.common.base.Objects; -import com.google.inject.Inject; -import com.google.inject.OutOfScopeException; -import com.google.inject.Provider; -import com.google.inject.ProvisionException; -import com.google.inject.Singleton; - +import com.google.inject.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.config.ScmConfiguration; - +import sonia.scm.config.ScmConfigurationChangedEvent; +import sonia.scm.net.ahc.AdvancedHttpClient; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.io.IOException; - import java.util.UUID; -import javax.servlet.http.HttpServletRequest; -import sonia.scm.config.ScmConfigurationChangedEvent; -import sonia.scm.net.ahc.AdvancedHttpClient; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -331,11 +321,7 @@ public class HgHookManager { request = httpServletRequestProvider.get(); } - catch (ProvisionException ex) - { - logger.debug("http servlet request is not available"); - } - catch (OutOfScopeException ex) + catch (ProvisionException | OutOfScopeException ex) { logger.debug("http servlet request is not available"); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java index be7118323c..32478f6203 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java @@ -39,20 +39,12 @@ import com.google.common.base.Stopwatch; import com.google.common.base.Strings; import com.google.inject.Inject; import com.google.inject.Singleton; - +import com.sun.jersey.core.util.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.SCMContext; import sonia.scm.config.ScmConfiguration; -import sonia.scm.repository.HgConfig; -import sonia.scm.repository.HgEnvironment; -import sonia.scm.repository.HgHookManager; -import sonia.scm.repository.HgPythonScript; -import sonia.scm.repository.HgRepositoryHandler; -import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryProvider; -import sonia.scm.repository.RepositoryRequestListenerUtil; +import sonia.scm.repository.*; import sonia.scm.security.CipherUtil; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -60,20 +52,16 @@ import sonia.scm.web.cgi.CGIExecutor; import sonia.scm.web.cgi.CGIExecutorFactory; import sonia.scm.web.cgi.EnvList; -//~--- JDK imports ------------------------------------------------------------ - -import com.sun.jersey.core.util.Base64; - -import java.io.File; -import java.io.IOException; - -import java.util.Enumeration; - import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import java.io.File; +import java.io.IOException; +import java.util.Enumeration; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -186,11 +174,7 @@ public class HgCGIServlet extends HttpServlet { handleRequest(request, response, repository); } - catch (ServletException ex) - { - exceptionHandler.handleException(request, response, ex); - } - catch (IOException ex) + catch (ServletException | IOException ex) { exceptionHandler.handleException(request, response, ex); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java index 728c935fc1..d6bb92d233 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java @@ -285,15 +285,10 @@ public class RepositoryImportResource service = serviceFactory.create(repository); service.getPullCommand().pull(request.getUrl()); } - catch (RepositoryException ex) + catch (RepositoryException | IOException ex) { handleImportFailure(ex, repository); - } - catch (IOException ex) - { - handleImportFailure(ex, repository); - } - finally + } finally { IOUtil.close(service); } @@ -437,12 +432,7 @@ public class RepositoryImportResource .concat(type), ex); response = Response.status(Status.BAD_REQUEST).build(); } - catch (IOException ex) - { - logger.warn("exception occured durring directory import", ex); - response = Response.serverError().build(); - } - catch (RepositoryException ex) + catch (IOException | RepositoryException ex) { logger.warn("exception occured durring directory import", ex); response = Response.serverError().build(); @@ -561,11 +551,7 @@ public class RepositoryImportResource throw new WebApplicationException(Response.Status.CONFLICT); } - catch (RepositoryException ex) - { - handleGenericCreationFailure(ex, type, name); - } - catch (IOException ex) + catch (RepositoryException | IOException ex) { handleGenericCreationFailure(ex, type, name); } @@ -615,15 +601,10 @@ public class RepositoryImportResource service = serviceFactory.create(repository); service.getUnbundleCommand().setCompressed(compressed).unbundle(file); } - catch (RepositoryException ex) + catch (RepositoryException | IOException ex) { handleImportFailure(ex, repository); - } - catch (IOException ex) - { - handleImportFailure(ex, repository); - } - finally + } finally { IOUtil.close(service); IOUtil.delete(file); @@ -717,11 +698,7 @@ public class RepositoryImportResource { manager.delete(repository); } - catch (IOException e) - { - logger.error("can not delete repository", e); - } - catch (RepositoryException e) + catch (IOException | RepositoryException e) { logger.error("can not delete repository", e); } @@ -772,11 +749,7 @@ public class RepositoryImportResource { throw new WebApplicationException(ex, Response.Status.BAD_REQUEST); } - catch (IOException ex) - { - throw new WebApplicationException(ex); - } - catch (RepositoryException ex) + catch (IOException | RepositoryException ex) { throw new WebApplicationException(ex); } diff --git a/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpClient.java b/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpClient.java index df6c93515b..161abf54c6 100644 --- a/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpClient.java +++ b/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpClient.java @@ -38,39 +38,27 @@ import com.google.common.base.Strings; import com.google.common.collect.Multimap; import com.google.common.io.Closeables; import com.google.inject.Inject; - import org.apache.shiro.codec.Base64; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.config.ScmConfiguration; import sonia.scm.net.Proxies; import sonia.scm.net.TrustAllHostnameVerifier; import sonia.scm.net.TrustAllTrustManager; import sonia.scm.util.HttpUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.OutputStream; - -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.ProtocolException; -import java.net.Proxy; -import java.net.SocketAddress; -import java.net.URL; - -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; - -import java.util.Set; import javax.inject.Provider; - import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; +import java.io.IOException; +import java.io.OutputStream; +import java.net.*; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * Default implementation of the {@link AdvancedHttpClient}. The default @@ -324,11 +312,7 @@ public class DefaultAdvancedHttpClient extends AdvancedHttpClient sc.init(null, trustAllCerts, new java.security.SecureRandom()); connection.setSSLSocketFactory(sc.getSocketFactory()); } - catch (KeyManagementException ex) - { - logger.error("could not disable certificate validation", ex); - } - catch (NoSuchAlgorithmException ex) + catch (KeyManagementException | NoSuchAlgorithmException ex) { logger.error("could not disable certificate validation", ex); } diff --git a/scm-webapp/src/main/java/sonia/scm/net/ahc/XmlContentTransformer.java b/scm-webapp/src/main/java/sonia/scm/net/ahc/XmlContentTransformer.java index 84dcda3593..71fbb489b1 100644 --- a/scm-webapp/src/main/java/sonia/scm/net/ahc/XmlContentTransformer.java +++ b/scm-webapp/src/main/java/sonia/scm/net/ahc/XmlContentTransformer.java @@ -34,20 +34,17 @@ package sonia.scm.net.ahc; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.io.ByteSource; - import sonia.scm.plugin.Extension; import sonia.scm.util.IOUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.ws.rs.core.MediaType; +import javax.xml.bind.DataBindingException; +import javax.xml.bind.JAXB; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import javax.ws.rs.core.MediaType; - -import javax.xml.bind.DataBindingException; -import javax.xml.bind.JAXB; +//~--- JDK imports ------------------------------------------------------------ /** * {@link ContentTransformer} for xml. The {@link XmlContentTransformer} uses @@ -96,15 +93,10 @@ public class XmlContentTransformer implements ContentTransformer stream = content.openBufferedStream(); object = JAXB.unmarshal(stream, type); } - catch (IOException ex) + catch (IOException | DataBindingException ex) { throw new ContentTransformerException("could not unmarshall content", ex); - } - catch (DataBindingException ex) - { - throw new ContentTransformerException("could not unmarshall content", ex); - } - finally + } finally { IOUtil.close(stream); } From db2d82b9ec20047661592f2bf6924e9321da7423 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 16:59:46 +0200 Subject: [PATCH 007/144] refactor: use try-with-resources --- .../sonia/scm/web/proxy/ProxyServlet.java | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyServlet.java b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyServlet.java index 1d865dc4bc..06059c2926 100644 --- a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyServlet.java +++ b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyServlet.java @@ -40,28 +40,20 @@ import com.google.common.io.ByteStreams; import com.google.common.io.Closer; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.net.HttpURLConnection; - import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -175,10 +167,8 @@ public class ProxyServlet extends HttpServlet private void copyContent(HttpURLConnection con, HttpServletResponse response) throws IOException { - Closer closer = Closer.create(); - try - { + try (Closer closer = Closer.create()) { InputStream webToProxyBuf = closer.register(new BufferedInputStream(con.getInputStream())); OutputStream proxyToClientBuf = @@ -188,10 +178,6 @@ public class ProxyServlet extends HttpServlet logger.trace("copied {} bytes for proxy", bytes); } - finally - { - closer.close(); - } } /** From 397904addeccec6d2be5ae45783a76a7de4f254e Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:07:07 +0200 Subject: [PATCH 008/144] refactor: replace anonymous types with lambdas --- .../repository/api/HookChangesetBuilder.java | 53 ++++------ .../repository/spi/GitBranchesCommand.java | 28 ++---- .../sonia/scm/web/GitRepositoryViewer.java | 40 +++----- .../spi/AbstractRemoteCommandTestBase.java | 34 ++----- .../scm/installer/WindowsHgInstaller.java | 16 +-- .../scm/repository/AbstractHgHandler.java | 37 +++---- .../scm/repository/spi/HgBranchesCommand.java | 35 +++---- .../main/java/sonia/scm/util/MockUtil.java | 30 ++---- .../main/java/sonia/scm/ClassOverrides.java | 98 ++++++++----------- .../java/sonia/scm/ScmEventBusModule.java | 9 +- .../java/sonia/scm/ScmInitializerModule.java | 19 ++-- .../resources/AbstractPermissionResource.java | 32 ++---- .../api/rest/resources/SearchResource.java | 45 ++++----- .../main/java/sonia/scm/debug/DebugHook.java | 5 +- .../sonia/scm/group/DefaultGroupManager.java | 51 ++++------ .../java/sonia/scm/plugin/PluginNode.java | 15 +-- .../repository/DefaultRepositoryManager.java | 47 +++------ .../HealthCheckContextListener.java | 10 +- .../sonia/scm/schedule/QuartzScheduler.java | 21 +--- .../scm/security/DefaultSecuritySystem.java | 47 +++------ .../sonia/scm/user/DefaultUserManager.java | 49 +++------- .../sonia/scm/web/cgi/DefaultCGIExecutor.java | 53 ++++------ .../cache/CacheConfigurationTestLoader.java | 11 +-- .../java/sonia/scm/cache/CacheTestBase.java | 17 +--- .../sonia/scm/plugin/PluginProcessorTest.java | 31 +++--- .../java/sonia/scm/plugin/PluginTreeTest.java | 24 ++--- .../scm/security/DefaultKeyGeneratorTest.java | 37 +++---- .../security/DefaultSecuritySystemTest.java | 20 +--- .../scm/template/MustacheTemplateTest.java | 11 +-- 29 files changed, 285 insertions(+), 640 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java index c06e227d5f..bdf5e13d60 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java @@ -35,11 +35,8 @@ package sonia.scm.repository.api; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.io.DeepCopy; import sonia.scm.repository.Changeset; import sonia.scm.repository.PreProcessorUtil; @@ -47,11 +44,12 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.spi.HookChangesetProvider; import sonia.scm.repository.spi.HookChangesetRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +//~--- JDK imports ------------------------------------------------------------ /** * The {@link HookChangesetBuilder} is able to return all {@link Changeset}s @@ -120,35 +118,26 @@ public final class HookChangesetBuilder if (!disablePreProcessors) { - changesets = Iterables.transform(changesets, - new Function() - { + final Function changesetFunction = c -> { + Changeset copy = null; - @Override - public Changeset apply(Changeset c) - { - Changeset copy = null; - - try - { - copy = DeepCopy.copy(c); - preProcessorUtil.prepareForReturn(repository, copy, - !disableEscaping); - } - catch (IOException ex) - { - logger.error("could not create a copy of changeset", ex); - } - - if (copy == null) - { - copy = c; - } - - return copy; + try { + copy = DeepCopy.copy(c); + preProcessorUtil.prepareForReturn(repository, copy, + !disableEscaping); + } catch (IOException ex) { + logger.error("could not create a copy of changeset", ex); } - }); + if (copy == null) { + copy = c; + } + + return copy; + }; + changesets = StreamSupport.stream(changesets.spliterator(), false) + .map(changesetFunction::apply) + .collect(Collectors.toList()); } return changesets; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java index df32c2b5eb..984f3e37cf 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java @@ -34,24 +34,20 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Function; import com.google.common.collect.Lists; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Ref; - import sonia.scm.repository.Branch; import sonia.scm.repository.GitUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -94,22 +90,16 @@ public class GitBranchesCommand extends AbstractGitCommand { List refs = git.branchList().call(); - branches = Lists.transform(refs, new Function() - { + branches = Lists.transform(refs, ref -> { + Branch branch = null; + String branchName = GitUtil.getBranch(ref); - @Override - public Branch apply(Ref ref) + if (branchName != null) { - Branch branch = null; - String branchName = GitUtil.getBranch(ref); - - if (branchName != null) - { - branch = new Branch(branchName, GitUtil.getId(ref.getObjectId())); - } - - return branch; + branch = new Branch(branchName, GitUtil.getId(ref.getObjectId())); } + + return branch; }); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java index b1915dc7ad..18f4d5baaa 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java @@ -40,17 +40,9 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.io.Closeables; import com.google.inject.Inject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import sonia.scm.repository.Branch; -import sonia.scm.repository.Branches; -import sonia.scm.repository.Changeset; -import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.Person; -import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.*; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.template.Template; @@ -63,16 +55,16 @@ import sonia.scm.util.HttpUtil; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.Writer; - -import java.util.Date; -import java.util.Iterator; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Writer; +import java.util.Date; +import java.util.Iterator; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -310,16 +302,10 @@ public class GitRepositoryViewer .setPagingLimit(CHANGESET_PER_BRANCH) .getChangesets(); - Iterable changesets = - Iterables.transform(cpr, new Function() - { - - @Override - public ChangesetModel apply(Changeset changeset) - { - return new ChangesetModel(changeset); - } - }); + Iterable changesets = + StreamSupport.stream(cpr.spliterator(), false) + .map(ChangesetModel::new) + .collect(Collectors.toList()); //J+ model = new BranchModel(name, changesets); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java index a76d110561..3b6c6797bb 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java @@ -37,35 +37,31 @@ package sonia.scm.repository.spi; import com.google.common.base.Charsets; import com.google.common.io.Files; -import com.google.inject.Provider; - import org.eclipse.jgit.api.CommitCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.ScmTransportProtocol; import org.eclipse.jgit.transport.Transport; - import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.rules.TemporaryFolder; - import sonia.scm.repository.Changeset; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.user.User; import sonia.scm.user.UserTestData; -import static org.junit.Assert.*; - -import static org.mockito.Mockito.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -122,23 +118,7 @@ public class AbstractRemoteCommandTestBase { // store reference to handle weak references - proto = new ScmTransportProtocol(new Provider() - { - - @Override - public HookEventFacade get() - { - return null; - } - }, new Provider() - { - - @Override - public GitRepositoryHandler get() - { - return null; - } - }); + proto = new ScmTransportProtocol(() -> null, () -> null); Transport.register(proto); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java index a764997c73..19df6f43d6 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java @@ -37,21 +37,18 @@ package sonia.scm.installer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.HgConfig; import sonia.scm.util.IOUtil; import sonia.scm.util.RegistryUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; -import java.io.FilenameFilter; import java.io.IOException; - import java.util.ArrayList; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -222,14 +219,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller private boolean checkForOptimizedByteCode(String part) { File libDir = new File(part); - String[] pyoFiles = libDir.list(new FilenameFilter() - { - @Override - public boolean accept(File file, String name) - { - return name.toLowerCase().endsWith(".pyo"); - } - }); + String[] pyoFiles = libDir.list((file, name) -> name.toLowerCase().endsWith(".pyo")); return Util.isNotEmpty(pyoFiles); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java index 22a64fe5b2..5f0e721594 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java @@ -37,26 +37,18 @@ package sonia.scm.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.SCMContext; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; import sonia.scm.web.HgUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.JAXBException; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.xml.bind.JAXBException; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -232,25 +224,20 @@ public class AbstractHgHandler { if (errorStream != null) { - new Thread(new Runnable() - { - @Override - public void run() + new Thread(() -> { + try { - try - { - String content = IOUtil.getContent(errorStream); + String content = IOUtil.getContent(errorStream); - if (Util.isNotEmpty(content)) - { - logger.error(content.trim()); - } - } - catch (IOException ex) + if (Util.isNotEmpty(content)) { - logger.error("error during logging", ex); + logger.error(content.trim()); } } + catch (IOException ex) + { + logger.error("error during logging", ex); + } }).start(); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java index 64d544c5ed..a2630d3730 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java @@ -36,20 +36,17 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.Changeset; - import com.google.common.base.Function; import com.google.common.collect.Lists; - import sonia.scm.repository.Branch; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -87,26 +84,18 @@ public class HgBranchesCommand extends AbstractCommand List hgBranches = com.aragost.javahg.commands.BranchesCommand.on(open()).execute(); - List branches = Lists.transform(hgBranches, - new Function() - { + final Function branchFunction = hgBranch -> { + String node = null; + Changeset changeset = hgBranch.getBranchTip(); - @Override - public Branch apply(com.aragost.javahg.commands.Branch hgBranch) - { - String node = null; - Changeset changeset = hgBranch.getBranchTip(); - - if (changeset != null) - { - node = changeset.getNode(); - } - - return new Branch(hgBranch.getName(), node); + if (changeset != null) { + node = changeset.getNode(); } - }); - return branches; + return new Branch(hgBranch.getName(), node); + }; + + return Lists.transform(hgBranches, + branchFunction); } } diff --git a/scm-test/src/main/java/sonia/scm/util/MockUtil.java b/scm-test/src/main/java/sonia/scm/util/MockUtil.java index 756b2632be..1d15477472 100644 --- a/scm-test/src/main/java/sonia/scm/util/MockUtil.java +++ b/scm-test/src/main/java/sonia/scm/util/MockUtil.java @@ -41,27 +41,21 @@ import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject.Builder; - -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - import sonia.scm.SCMContextProvider; +import sonia.scm.security.Role; import sonia.scm.user.User; import sonia.scm.user.UserTestData; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.Arrays; +import java.util.List; + import static org.mockito.Mockito.*; //~--- JDK imports ------------------------------------------------------------ -import java.io.File; - -import java.util.Arrays; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import sonia.scm.security.Role; - /** * * @author Sebastian Sdorra @@ -96,12 +90,7 @@ public final class MockUtil when(subject.isAuthenticated()).thenReturn(Boolean.TRUE); when(subject.isPermitted(anyListOf(Permission.class))).then( - new Answer() - { - - @Override - public Boolean[] answer(InvocationOnMock invocation) throws Throwable - { + invocation -> { List permissions = (List) invocation.getArguments()[0]; Boolean[] returnArray = new Boolean[permissions.size()]; @@ -109,8 +98,7 @@ public final class MockUtil Arrays.fill(returnArray, Boolean.TRUE); return returnArray; - } - }); + }); when(subject.isPermitted(any(Permission.class))).thenReturn(Boolean.TRUE); when(subject.isPermitted(any(String.class))).thenReturn(Boolean.TRUE); when(subject.isPermittedAll(anyCollectionOf(Permission.class))).thenReturn( diff --git a/scm-webapp/src/main/java/sonia/scm/ClassOverrides.java b/scm-webapp/src/main/java/sonia/scm/ClassOverrides.java index b727a75fc0..44e3e108a3 100644 --- a/scm-webapp/src/main/java/sonia/scm/ClassOverrides.java +++ b/scm-webapp/src/main/java/sonia/scm/ClassOverrides.java @@ -38,31 +38,26 @@ package sonia.scm; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.inject.Module; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.util.AssertUtil; import sonia.scm.util.ClassLoaders; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - -import java.net.URL; - -import java.util.Collections; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; - import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -103,35 +98,29 @@ public class ClassOverrides implements Iterable classLoader.getResources(OVERRIDE_PATH); final JAXBContext context = JAXBContext.newInstance(ClassOverrides.class); - ClassLoaders.executeInContext(classLoader, new Runnable() - { - - @Override - public void run() + ClassLoaders.executeInContext(classLoader, () -> { + while (overridesEnm.hasMoreElements()) { - while (overridesEnm.hasMoreElements()) + URL overrideUrl = overridesEnm.nextElement(); + + if (logger.isInfoEnabled()) { - URL overrideUrl = overridesEnm.nextElement(); + logger.info("load override from {}", + overrideUrl.toExternalForm()); + } - if (logger.isInfoEnabled()) - { - logger.info("load override from {}", - overrideUrl.toExternalForm()); - } + try + { + ClassOverrides co = + (ClassOverrides) context.createUnmarshaller().unmarshal( + overrideUrl); - try - { - ClassOverrides co = - (ClassOverrides) context.createUnmarshaller().unmarshal( - overrideUrl); - - overrides.append(co); - } - catch (JAXBException ex) - { - logger.error( - "could not load ".concat(overrideUrl.toExternalForm()), ex); - } + overrides.append(co); + } + catch (JAXBException ex) + { + logger.error( + "could not load ".concat(overrideUrl.toExternalForm()), ex); } } }); @@ -217,28 +206,21 @@ public class ClassOverrides implements Iterable if (Util.isNotEmpty(moduleClasses)) { - modules = Lists.transform(moduleClasses, - new Function, Module>() - { - @Override - public Module apply(Class moduleClass) - { - Module module = null; + final Function, Module> classModuleFunction = moduleClass -> { + Module module = null; - try - { - module = moduleClass.newInstance(); - } - catch (IllegalAccessException | InstantiationException ex) - { - logger.error( - "could not create module instance of ".concat( - moduleClass.getName()), ex); - } - - return module; + try { + module = moduleClass.newInstance(); + } catch (IllegalAccessException | InstantiationException ex) { + logger.error( + "could not create module instance of ".concat( + moduleClass.getName()), ex); } - }); + + return module; + }; + modules = Lists.transform(moduleClasses, + classModuleFunction); } else { diff --git a/scm-webapp/src/main/java/sonia/scm/ScmEventBusModule.java b/scm-webapp/src/main/java/sonia/scm/ScmEventBusModule.java index 4f1d4ca8ab..637bf80d37 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmEventBusModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmEventBusModule.java @@ -64,14 +64,7 @@ public class ScmEventBusModule extends AbstractModule @Override public void hear(TypeLiteral type, TypeEncounter encounter) { - encounter.register(new InjectionListener() - { - @Override - public void afterInjection(Object object) - { - ScmEventBus.getInstance().register(object); - } - }); + encounter.register((InjectionListener) object -> ScmEventBus.getInstance().register(object)); } }); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java b/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java index 16675749ac..32bd14fd12 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java @@ -73,20 +73,15 @@ public class ScmInitializerModule extends AbstractModule @Override public void hear(TypeLiteral type, TypeEncounter encounter) { - encounter.register(new InjectionListener() - { - @Override - public void afterInjection(Object i) + encounter.register((InjectionListener) i -> { + if (logger.isTraceEnabled()) { - if (logger.isTraceEnabled()) - { - logger.trace("initialize initable {}", i.getClass()); - } - - Initable initable = (Initable) i; - - initable.init(SCMContext.getContext()); + logger.trace("initialize initable {}", i.getClass()); } + + Initable initable = (Initable) i; + + initable.init(SCMContext.getContext()); }); } }); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractPermissionResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractPermissionResource.java index e9e63d16d8..39915b5d9b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractPermissionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractPermissionResource.java @@ -35,39 +35,27 @@ 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.Lists; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; - import sonia.scm.api.rest.Permission; import sonia.scm.security.AssignedPermission; import sonia.scm.security.SecuritySystem; import sonia.scm.security.StoredAssignedPermission; -//~--- JDK imports ------------------------------------------------------------ - -import java.net.URI; - -import java.util.List; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; +import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; +import java.net.URI; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Abstract base class for global permission resources. @@ -277,15 +265,7 @@ public abstract class AbstractPermissionResource securitySystem.getPermissions(predicate); return Lists.transform(permissions, - new Function() - { - - @Override - public Permission apply(StoredAssignedPermission mgp) - { - return new Permission(mgp.getId(), mgp.getPermission()); - } - }); + mgp -> new Permission(mgp.getId(), mgp.getPermission())); } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java index d951fcc2ca..b08a2aaace 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java @@ -156,23 +156,18 @@ public class SearchResource @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public SearchResults searchGroups(@QueryParam("query") String queryString) { - return groupSearchHandler.search(queryString, - new Function() - { - @Override - public SearchResult apply(Group group) - { - String label = group.getName(); - String description = group.getDescription(); + final Function groupSearchResultFunction = group -> { + String label = group.getName(); + String description = group.getDescription(); - if (description != null) - { - label = label.concat(" (").concat(description).concat(")"); - } - - return new SearchResult(group.getName(), label); + if (description != null) { + label = label.concat(" (").concat(description).concat(")"); } - }); + + return new SearchResult(group.getName(), label); + }; + return groupSearchHandler.search(queryString, + groupSearchResultFunction); } /** @@ -191,19 +186,15 @@ public class SearchResource @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public SearchResults searchUsers(@QueryParam("query") String queryString) { + final Function userSearchResultFunction = user -> { + StringBuilder label = new StringBuilder(user.getName()); + + label.append(" (").append(user.getDisplayName()).append(")"); + + return new SearchResult(user.getName(), label.toString()); + }; return userSearchHandler.search(queryString, - new Function() - { - @Override - public SearchResult apply(User user) - { - StringBuilder label = new StringBuilder(user.getName()); - - label.append(" (").append(user.getDisplayName()).append(")"); - - return new SearchResult(user.getName(), label.toString()); - } - }); + userSearchResultFunction); } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java index d75b455a95..5b49cb989a 100644 --- a/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java @@ -34,13 +34,14 @@ import com.github.legman.ReferenceType; import com.github.legman.Subscribe; import com.google.common.base.Function; import com.google.common.collect.Collections2; -import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.EagerSingleton; import sonia.scm.repository.Changeset; import sonia.scm.repository.PostReceiveRepositoryHookEvent; +import javax.inject.Inject; + /** * {@link PostReceiveRepositoryHookEvent} which stores receives data and passes it to the {@link DebugService}. * @@ -84,5 +85,5 @@ public final class DebugHook )); } - private static final Function IDEXTRACTOR = (Changeset changeset) -> changeset.getId(); + private static final Function IDEXTRACTOR = Changeset::getId; } diff --git a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java index ef69e5c07d..67b2709f53 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java @@ -40,10 +40,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.HandlerEventType; import sonia.scm.SCMContextProvider; import sonia.scm.TransformFilter; @@ -52,16 +50,10 @@ import sonia.scm.search.SearchUtil; import sonia.scm.util.CollectionAppender; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +import java.util.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -269,22 +261,17 @@ public class DefaultGroupManager extends AbstractGroupManager } final PermissionActionCheck check = GroupPermissions.read(); - return SearchUtil.search(searchRequest, groupDAO.getAll(), - new TransformFilter() - { - @Override - public Group accept(Group group) - { - Group result = null; + final TransformFilter groupTransformFilter = group -> { + Group result = null; - if (check.isPermitted(group) && matches(searchRequest, group)) - { - result = group.clone(); - } - - return result; + if (check.isPermitted(group) && matches(searchRequest, group)) { + result = group.clone(); } - }); + + return result; + }; + return SearchUtil.search(searchRequest, groupDAO.getAll(), + groupTransformFilter); } private boolean matches(SearchRequest searchRequest, Group group) { @@ -374,17 +361,13 @@ public class DefaultGroupManager extends AbstractGroupManager { final PermissionActionCheck check = GroupPermissions.read(); - return Util.createSubCollection(groupDAO.getAll(), comparator, - new CollectionAppender() - { - @Override - public void append(Collection collection, Group group) - { - if (check.isPermitted(group)) { - collection.add(group.clone()); - } + final CollectionAppender groupCollectionAppender = (collection, group) -> { + if (check.isPermitted(group)) { + collection.add(group.clone()); } - }, start, limit); + }; + return Util.createSubCollection(groupDAO.getAll(), comparator, + groupCollectionAppender, start, limit); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java index 281fb2eab1..ff479e9894 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java @@ -33,14 +33,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -96,15 +95,7 @@ public final class PluginNode */ public PluginNode getChild(final String id) { - return Iterables.find(children, new Predicate() - { - - @Override - public boolean apply(PluginNode node) - { - return node.getId().equals(id); - } - }); + return Iterables.find(children, node -> node.getId().equals(id)); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 8ddb02d9ca..77cbf0cb2c 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -41,42 +41,22 @@ import com.google.common.collect.Lists; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.apache.shiro.concurrent.SubjectAwareExecutorService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import sonia.scm.ArgumentIsInvalidException; -import sonia.scm.ConfigurationException; -import sonia.scm.HandlerEventType; -import sonia.scm.SCMContextProvider; -import sonia.scm.Type; +import sonia.scm.*; import sonia.scm.config.ScmConfiguration; import sonia.scm.security.KeyGenerator; -import sonia.scm.util.AssertUtil; -import sonia.scm.util.CollectionAppender; -import sonia.scm.util.HttpUtil; -import sonia.scm.util.IOUtil; -import sonia.scm.util.Util; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.util.*; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; - -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import javax.servlet.http.HttpServletRequest; +//~--- JDK imports ------------------------------------------------------------ /** * Default implementation of {@link RepositoryManager}. @@ -459,18 +439,13 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager final PermissionActionCheck check = RepositoryPermissions.read(); - return Util.createSubCollection(repositoryDAO.getAll(), comparator, - new CollectionAppender() - { - @Override - public void append(Collection collection, Repository item) - { - if (check.isPermitted(item)) - { - collection.add(item.clone()); - } + final CollectionAppender repositoryCollectionAppender = (collection, item) -> { + if (check.isPermitted(item)) { + collection.add(item.clone()); } - }, start, limit); + }; + return Util.createSubCollection(repositoryDAO.getAll(), comparator, + repositoryCollectionAppender, start, limit); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/repository/HealthCheckContextListener.java b/scm-webapp/src/main/java/sonia/scm/repository/HealthCheckContextListener.java index a0918c3e64..146382771e 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/HealthCheckContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/HealthCheckContextListener.java @@ -128,15 +128,7 @@ public class HealthCheckContextListener implements ServletContextListener { // excute health checks for all repsitories asynchronous - SecurityUtils.getSubject().execute(new Runnable() - { - - @Override - public void run() - { - healthChecker.checkAll(); - } - }); + SecurityUtils.getSubject().execute(healthChecker::checkAll); } //~--- fields ------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/schedule/QuartzScheduler.java b/scm-webapp/src/main/java/sonia/scm/schedule/QuartzScheduler.java index 5b46d438d8..7aa0494a79 100644 --- a/scm-webapp/src/main/java/sonia/scm/schedule/QuartzScheduler.java +++ b/scm-webapp/src/main/java/sonia/scm/schedule/QuartzScheduler.java @@ -35,21 +35,16 @@ import com.google.common.base.Throwables; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.Singleton; -import java.io.IOException; -import javax.inject.Inject; -import org.quartz.CronScheduleBuilder; -import org.quartz.JobBuilder; -import org.quartz.JobDataMap; -import org.quartz.JobDetail; -import org.quartz.SchedulerException; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; +import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.Initable; import sonia.scm.SCMContextProvider; +import javax.inject.Inject; +import java.io.IOException; + /** * {@link Scheduler} which uses the quartz scheduler. * @@ -130,13 +125,7 @@ public class QuartzScheduler implements Scheduler, Initable { @Override public Task schedule(String expression, final Runnable runnable) { - return schedule(expression, new Provider(){ - @Override - public Runnable get() - { - return runnable; - } - }); + return schedule(expression, () -> runnable); } @Override diff --git a/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java b/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java index d958dcf41f..2a73ca489e 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java +++ b/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java @@ -36,7 +36,6 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- import com.github.legman.Subscribe; - import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Strings; @@ -44,12 +43,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.apache.shiro.SecurityUtils; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.HandlerEventType; import sonia.scm.event.ScmEventBus; import sonia.scm.group.GroupEvent; @@ -58,23 +54,20 @@ import sonia.scm.store.ConfigurationEntryStoreFactory; import sonia.scm.user.UserEvent; import sonia.scm.util.ClassLoaders; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - -import java.net.URL; - -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; -import java.util.Map.Entry; - import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Map.Entry; + +//~--- JDK imports ------------------------------------------------------------ /** * TODO add events @@ -191,16 +184,8 @@ public class DefaultSecuritySystem implements SecuritySystem { if (event.getEventType() == HandlerEventType.DELETE) { - deletePermissions(new Predicate() - { - - @Override - public boolean apply(AssignedPermission p) - { - return !p.isGroupPermission() - && event.getItem().getName().equals(p.getName()); - } - }); + deletePermissions(p -> !(p != null && p.isGroupPermission()) + && event.getItem().getName().equals(p != null ? p.getName() : null)); } } @@ -215,16 +200,8 @@ public class DefaultSecuritySystem implements SecuritySystem { if (event.getEventType() == HandlerEventType.DELETE) { - deletePermissions(new Predicate() - { - - @Override - public boolean apply(AssignedPermission p) - { - return p.isGroupPermission() - && event.getItem().getName().equals(p.getName()); - } - }); + deletePermissions(p -> (p != null && p.isGroupPermission()) + && event.getItem().getName().equals(p.getName())); } } diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index 99e3abbe76..0cdf1fd147 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -38,13 +38,10 @@ package sonia.scm.user; import com.github.sdorra.ssp.PermissionActionCheck; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.HandlerEventType; import sonia.scm.SCMContextProvider; -import sonia.scm.TransformFilter; import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchUtil; import sonia.scm.util.AssertUtil; @@ -52,20 +49,14 @@ import sonia.scm.util.CollectionAppender; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.InputStream; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -297,16 +288,12 @@ public class DefaultUserManager extends AbstractUserManager } final PermissionActionCheck check = UserPermissions.read(); - return SearchUtil.search(searchRequest, userDAO.getAll(), new TransformFilter() { - @Override - public User accept(User user) - { - User result = null; - if (check.isPermitted(user) && matches(searchRequest, user)) { - result = user.clone(); - } - return result; + return SearchUtil.search(searchRequest, userDAO.getAll(), user -> { + User result = null; + if (check.isPermitted(user) && matches(searchRequest, user)) { + result = user.clone(); } + return result; }); } @@ -392,17 +379,13 @@ public class DefaultUserManager extends AbstractUserManager @Override public Collection getAll(Comparator comaparator, int start, int limit) { final PermissionActionCheck check = UserPermissions.read(); - return Util.createSubCollection(userDAO.getAll(), comaparator, - new CollectionAppender() - { - @Override - public void append(Collection collection, User item) - { - if (check.isPermitted(item)) { - collection.add(item.clone()); - } + final CollectionAppender userCollectionAppender = (collection, item) -> { + if (check.isPermitted(item)) { + collection.add(item.clone()); } - }, start, limit); + }; + return Util.createSubCollection(userDAO.getAll(), comaparator, + userCollectionAppender, start, limit); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java index 3eaa684080..c0096efd59 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java @@ -37,10 +37,8 @@ package sonia.scm.web.cgi; import com.google.common.base.Strings; import com.google.common.io.ByteStreams; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.SCMContext; import sonia.scm.config.ScmConfiguration; import sonia.scm.util.HttpUtil; @@ -48,23 +46,17 @@ import sonia.scm.util.IOUtil; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import java.util.Enumeration; -import java.util.Map; -import java.util.concurrent.ExecutorService; - import javax.servlet.ServletContext; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.Enumeration; +import java.util.Map; +import java.util.concurrent.ExecutorService; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -510,26 +502,21 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor */ private void processErrorStreamAsync(final Process process) { - executor.execute(new Runnable() - { - @Override - public void run() - { - InputStream errorStream = null; + executor.execute(() -> { + InputStream errorStream = null; - try - { - errorStream = process.getErrorStream(); - processErrorStream(errorStream); - } - catch (IOException ex) - { - logger.error("could not read errorstream", ex); - } - finally - { - IOUtil.close(errorStream); - } + try + { + errorStream = process.getErrorStream(); + processErrorStream(errorStream); + } + catch (IOException ex) + { + logger.error("could not read errorstream", ex); + } + finally + { + IOUtil.close(errorStream); } }); } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java index 14c2355a85..0b111e4ef1 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java @@ -34,7 +34,6 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Function; import com.google.common.collect.Iterators; import com.google.common.io.ByteSource; import com.google.common.io.Files; @@ -196,15 +195,7 @@ public class CacheConfigurationTestLoader implements CacheConfigurationLoader else { urlIterator = Iterators.transform(moduleConfigurations, - new Function() - { - - @Override - public URL apply(String resource) - { - return getResource(resource); - } - }); + this::getResource); } return urlIterator; diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java index 54cf7991c5..8a8a016146 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java @@ -35,18 +35,14 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Predicate; - import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; - import sonia.scm.util.IOUtil; -import static org.hamcrest.Matchers.*; - +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.*; -import org.junit.Assume; /** * @@ -166,14 +162,7 @@ public abstract class CacheTestBase cache.put("a-1", "test123"); cache.put("a-2", "test123"); - Iterable previous = cache.removeAll(new Predicate() - { - @Override - public boolean apply(String item) - { - return item.startsWith("test"); - } - }); + Iterable previous = cache.removeAll(item -> item != null && item.startsWith("test")); assertThat(previous, containsInAnyOrder("test123", "test456")); assertNull(cache.get("test-1")); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java index 694b07e54f..a78a8acba9 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java @@ -34,31 +34,27 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Charsets; -import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.io.Resources; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; - import java.lang.reflect.InvocationTargetException; - import java.net.URL; - import java.util.Set; +import java.util.stream.StreamSupport; + +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.*; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -370,15 +366,10 @@ public class PluginProcessorTest private PluginWrapper findPlugin(Iterable plugin, final String id) { - return Iterables.find(plugin, new Predicate() - { - - @Override - public boolean apply(PluginWrapper input) - { - return id.equals(input.getId()); - } - }); + return StreamSupport.stream(plugin.spliterator(), false) + .filter(input -> id.equals(input.getId())) + .findFirst() + .orElse(null); } //~--- inner classes -------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java index 06d6c1732c..31e008b42d 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java @@ -33,26 +33,22 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Function; import com.google.common.collect.Lists; - import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.assertThat; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -265,15 +261,7 @@ public class PluginTreeTest */ private List unwrapIds(List nodes) { - return Lists.transform(nodes, new Function() - { - - @Override - public String apply(PluginNode input) - { - return input.getId(); - } - }); + return Lists.transform(nodes, PluginNode::getId); } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/security/DefaultKeyGeneratorTest.java b/scm-webapp/src/test/java/sonia/scm/security/DefaultKeyGeneratorTest.java index edec43098c..57b038d5f1 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/DefaultKeyGeneratorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/DefaultKeyGeneratorTest.java @@ -35,22 +35,15 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.Sets; - import org.junit.Test; +import java.util.Set; +import java.util.concurrent.*; + import static org.junit.Assert.*; //~--- JDK imports ------------------------------------------------------------ -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - /** * * @author Sebastian Sdorra @@ -96,28 +89,22 @@ public class DefaultKeyGeneratorTest for (int i = 0; i < 10; i++) { - Future> future = executor.submit(new Callable>() - { + Future> future = executor.submit(() -> { + Set keys = Sets.newHashSet(); - @Override - public Set call() + for (int i1 = 0; i1 < 1000; i1++) { - Set keys = Sets.newHashSet(); + String key = generator.createKey(); - for (int i = 0; i < 1000; i++) + if (keys.contains(key)) { - String key = generator.createKey(); - - if (keys.contains(key)) - { - fail("dublicate key"); - } - - keys.add(key); + fail("dublicate key"); } - return keys; + keys.add(key); } + + return keys; }); futureSet.add(future); diff --git a/scm-webapp/src/test/java/sonia/scm/security/DefaultSecuritySystemTest.java b/scm-webapp/src/test/java/sonia/scm/security/DefaultSecuritySystemTest.java index 95ad64b349..f8fd62375e 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/DefaultSecuritySystemTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/DefaultSecuritySystemTest.java @@ -34,27 +34,23 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Predicate; - import org.apache.shiro.authz.UnauthorizedException; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.SimpleAccountRealm; - import org.junit.Before; import org.junit.Test; - import sonia.scm.AbstractTestBase; import sonia.scm.store.JAXBConfigurationEntryStoreFactory; import sonia.scm.util.MockUtil; -import static org.hamcrest.Matchers.*; +import java.util.List; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.*; //~--- JDK imports ------------------------------------------------------------ -import java.util.List; - /** * * @author Sebastian Sdorra @@ -184,15 +180,7 @@ public class DefaultSecuritySystemTest extends AbstractTestBase createPermission("hitchhiker", true, "repository:*:READ"); List filtered = - securitySystem.getPermissions(new Predicate() - { - - @Override - public boolean apply(AssignedPermission input) - { - return !input.isGroupPermission(); - } - }); + securitySystem.getPermissions(input -> !(input != null && input.isGroupPermission())); assertEquals(2, filtered.size()); assertThat(filtered, containsInAnyOrder(trillian, dent)); diff --git a/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateTest.java b/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateTest.java index 186b809367..bfac40b4df 100644 --- a/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateTest.java +++ b/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateTest.java @@ -89,15 +89,8 @@ public class MustacheTemplateTest extends TemplateTestBase @Override protected void prepareEnv(Map env) { - env.put("test", new Function() - { - - @Override - public String apply(String input) - { - throw new UnsupportedOperationException("Not supported yet."); - } - + env.put("test", (Function) input -> { + throw new UnsupportedOperationException("Not supported yet."); }); } From 64b8fc8af6e39d1c3af58f4a227876e4949bad33 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:08:04 +0200 Subject: [PATCH 009/144] refactor: replace Collections.sort with List.sort --- .../repository/api/BrowseCommandBuilder.java | 2 +- .../src/main/java/sonia/scm/util/Util.java | 17 ++------ .../api/rest/resources/PluginResource.java | 43 ++++++------------- .../sonia/scm/group/DefaultGroupManager.java | 2 +- .../repository/DefaultRepositoryManager.java | 2 +- .../sonia/scm/resources/AbstractResource.java | 11 ++--- .../resources/AbstractResourceManager.java | 19 +++----- .../sonia/scm/user/DefaultUserManager.java | 2 +- 8 files changed, 30 insertions(+), 68 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java index 655b7d4816..f37677f37b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java @@ -191,7 +191,7 @@ public final class BrowseCommandBuilder if (fileObjects != null) { - Collections.sort(fileObjects, FileObjectNameComparator.instance); + fileObjects.sort(FileObjectNameComparator.instance); result.setFiles(fileObjects); } } diff --git a/scm-core/src/main/java/sonia/scm/util/Util.java b/scm-core/src/main/java/sonia/scm/util/Util.java index e57d48f314..d17219bfa2 100644 --- a/scm-core/src/main/java/sonia/scm/util/Util.java +++ b/scm-core/src/main/java/sonia/scm/util/Util.java @@ -38,23 +38,12 @@ package sonia.scm.util; import com.google.common.base.Strings; import com.google.common.collect.Multimap; -//~--- JDK imports ------------------------------------------------------------ - import java.math.BigInteger; - import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -278,7 +267,7 @@ public final class Util if (comparator != null) { - Collections.sort(valueList, comparator); + valueList.sort(comparator); } int length = valueList.size(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java index c605c7c29a..72577b0cc3 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java @@ -38,42 +38,27 @@ package sonia.scm.api.rest.resources; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.api.rest.RestActionResult; -import sonia.scm.api.rest.RestActionUploadResult; -import sonia.scm.plugin.OverviewPluginPredicate; -import sonia.scm.plugin.PluginConditionFailedException; -import sonia.scm.plugin.PluginInformation; -import sonia.scm.plugin.PluginInformationComparator; -import sonia.scm.plugin.PluginManager; - -//~--- JDK imports ------------------------------------------------------------ - import com.sun.jersey.multipart.FormDataParam; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.api.rest.RestActionResult; +import sonia.scm.api.rest.RestActionUploadResult; +import sonia.scm.plugin.*; -import java.io.IOException; -import java.io.InputStream; - -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * RESTful Web Service Endpoint to manage plugins. @@ -334,7 +319,7 @@ public class PluginResource ); //J+ - Collections.sort(plugins, PluginInformationComparator.INSTANCE); + plugins.sort(PluginInformationComparator.INSTANCE); Iterator it = plugins.iterator(); String last = null; diff --git a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java index 67b2709f53..cd2f1525c3 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java @@ -338,7 +338,7 @@ public class DefaultGroupManager extends AbstractGroupManager if (comparator != null) { - Collections.sort(groups, comparator); + groups.sort(comparator); } return groups; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 77cbf0cb2c..948ca15932 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -403,7 +403,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager if (comparator != null) { - Collections.sort(repositories, comparator); + repositories.sort(comparator); } return repositories; diff --git a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResource.java b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResource.java index d5b21befe6..5ea598d587 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResource.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResource.java @@ -36,23 +36,18 @@ package sonia.scm.resources; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.io.Resources; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.plugin.PluginLoader; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.OutputStream; - import java.net.URL; - -import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -105,7 +100,7 @@ public abstract class AbstractResource implements Resource if (Util.isNotEmpty(resourceHandlers)) { - Collections.sort(resourceHandlers, new ResourceHandlerComparator()); + resourceHandlers.sort(new ResourceHandlerComparator()); for (ResourceHandler resourceHandler : resourceHandlers) { diff --git a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java index 95d7b39b69..d9738fcc3a 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java @@ -38,20 +38,13 @@ package sonia.scm.resources; import sonia.scm.plugin.Plugin; import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginResources; - -//~--- JDK imports ------------------------------------------------------------ - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +import sonia.scm.plugin.PluginWrapper; import javax.servlet.ServletContext; -import sonia.scm.plugin.PluginWrapper; +import java.util.*; +import java.util.Map.Entry; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -123,7 +116,7 @@ public abstract class AbstractResourceManager implements ResourceManager } } - Collections.sort(resources, ResourceNameComparator.INSTANCE); + resources.sort(ResourceNameComparator.INSTANCE); return resources; } diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index 0cdf1fd147..2dc598cf2c 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -359,7 +359,7 @@ public class DefaultUserManager extends AbstractUserManager } if (comparator != null) { - Collections.sort(users, comparator); + users.sort(comparator); } return users; From 7b03c19de6ce19037906269bccc9aa89bf999ad1 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:08:44 +0200 Subject: [PATCH 010/144] refactor: replace while loop with Map.removeIf --- .../cli/cmd/DeletePermissionSubCommand.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/DeletePermissionSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/DeletePermissionSubCommand.java index fe01b3ff24..2b482c0f4e 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/DeletePermissionSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/DeletePermissionSubCommand.java @@ -36,14 +36,12 @@ package sonia.scm.cli.cmd; //~--- non-JDK imports -------------------------------------------------------- import org.kohsuke.args4j.Option; - import sonia.scm.repository.Permission; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Iterator; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -91,17 +89,7 @@ public class DeletePermissionSubCommand extends PermissionSubCommand @Override protected void modifyPermissions(List permissions) { - Iterator it = permissions.iterator(); - - while (it.hasNext()) - { - Permission p = it.next(); - - if (name.equals(p.getName())) - { - it.remove(); - } - } + permissions.removeIf(p -> name.equals(p.getName())); } //~--- fields --------------------------------------------------------------- From fb2dfce63171f516eb334fe172961b3d1bed86ea Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:09:50 +0200 Subject: [PATCH 011/144] refactor: replace Guava's Iterables.find with Stream API --- scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java index ff479e9894..9a63837bda 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java @@ -33,7 +33,6 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import java.util.List; @@ -95,7 +94,9 @@ public final class PluginNode */ public PluginNode getChild(final String id) { - return Iterables.find(children, node -> node.getId().equals(id)); + return children.stream() + .filter(node -> node.getId().equals(id)).findFirst() + .orElse(null); } /** From 524a5dbb0ab8d310a3175971bdc191e7a2cb60f1 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:10:58 +0200 Subject: [PATCH 012/144] refactor: use Map.computeIfAbsent --- .../sonia/scm/cli/config/ScmClientConfig.java | 19 +++---------------- .../java/sonia/scm/logging/SVNKitLogger.java | 10 +--------- .../java/sonia/scm/cache/MapCacheManager.java | 10 +--------- 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java index 9edb2b382a..281a0f8c3b 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java @@ -35,16 +35,11 @@ package sonia.scm.cli.config; //~--- JDK imports ------------------------------------------------------------ +import javax.xml.bind.annotation.*; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.HashMap; import java.util.Map; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - /** * * @author Sebastian Sdorra @@ -148,15 +143,7 @@ public class ScmClientConfig */ public ServerConfig getConfig(String name) { - ServerConfig config = serverConfigMap.get(name); - - if (config == null) - { - config = new ServerConfig(); - serverConfigMap.put(name, config); - } - - return config; + return serverConfigMap.computeIfAbsent(name, k -> new ServerConfig()); } /** diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/logging/SVNKitLogger.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/logging/SVNKitLogger.java index e156defaf5..177bc05069 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/logging/SVNKitLogger.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/logging/SVNKitLogger.java @@ -211,15 +211,7 @@ public class SVNKitLogger extends SVNDebugLogAdapter */ private Logger getLogger(SVNLogType type) { - Logger logger = loggerMap.get(type); - - if (logger == null) - { - logger = LoggerFactory.getLogger(parseName(type.getName())); - loggerMap.put(type, logger); - } - - return logger; + return loggerMap.computeIfAbsent(type, t -> LoggerFactory.getLogger(parseName(t.getName()))); } //~--- fields --------------------------------------------------------------- diff --git a/scm-test/src/main/java/sonia/scm/cache/MapCacheManager.java b/scm-test/src/main/java/sonia/scm/cache/MapCacheManager.java index 0e4faddb4a..1f606fc908 100644 --- a/scm-test/src/main/java/sonia/scm/cache/MapCacheManager.java +++ b/scm-test/src/main/java/sonia/scm/cache/MapCacheManager.java @@ -81,15 +81,7 @@ public class MapCacheManager @Override public synchronized MapCache getCache(String name) { - MapCache cache = cacheMap.get(name); - - if (cache == null) - { - cache = new MapCache(); - cacheMap.put(name, cache); - } - - return cache; + return (MapCache) cacheMap.computeIfAbsent(name, k -> new MapCache()); } //~--- fields --------------------------------------------------------------- From b73040771af59452c54f544cf93d7184e701ec41 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:11:32 +0200 Subject: [PATCH 013/144] refactor: replace statement lambda with expression lambda --- .../sonia/scm/security/JwtAccessTokenBuilderFactory.java | 9 ++++----- .../scm/repository/DefaultRepositoryManagerTest.java | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilderFactory.java b/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilderFactory.java index 63c4ea981c..5998ff9fc4 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilderFactory.java +++ b/scm-webapp/src/main/java/sonia/scm/security/JwtAccessTokenBuilderFactory.java @@ -30,10 +30,11 @@ */ package sonia.scm.security; -import java.util.Set; -import javax.inject.Inject; import sonia.scm.plugin.Extension; +import javax.inject.Inject; +import java.util.Set; + /** * Jwt implementation of {@link AccessTokenBuilderFactory}. * @@ -61,9 +62,7 @@ public final class JwtAccessTokenBuilderFactory implements AccessTokenBuilderFac JwtAccessTokenBuilder builder = new JwtAccessTokenBuilder(keyGenerator, keyResolver); // enrich access token builder - enrichers.forEach((enricher) -> { - enricher.enrich(builder); - }); + enrichers.forEach((enricher) -> enricher.enrich(builder)); return builder; } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 8c60e45b04..5b7c3f2ae7 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -293,9 +293,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { - return keys.pop(); - }); + when(keyGenerator.createKey()).then((InvocationOnMock invocation) -> keys.pop()); // create repository manager RepositoryManager repositoryManager = createRepositoryManager(false, keyGenerator); From 0cff0e7e7a5af35687ca10312d6f79fa06da4022 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:12:41 +0200 Subject: [PATCH 014/144] refactor: remove explicit type arguments --- .../src/main/java/sonia/scm/cli/App.java | 2 +- .../scm/cli/cmd/CreateGroupSubCommand.java | 2 +- .../cli/cmd/CreateRepositorySubCommand.java | 2 +- .../scm/cli/cmd/CreateUserSubCommand.java | 2 +- .../sonia/scm/cli/cmd/GetGroupSubCommand.java | 2 +- .../scm/cli/cmd/GetRepositorySubCommand.java | 2 +- .../sonia/scm/cli/cmd/GetUserSubCommand.java | 2 +- .../scm/cli/cmd/ListGroupsSubCommand.java | 2 +- .../cli/cmd/ListRepositoriesSubCommand.java | 2 +- .../scm/cli/cmd/ListUsersSubCommand.java | 2 +- .../sonia/scm/cli/cmd/MembersSubCommand.java | 2 +- .../scm/cli/cmd/ModifyGroupSubCommand.java | 2 +- .../cli/cmd/ModifyRepositorySubCommand.java | 2 +- .../scm/cli/cmd/ModifyUserSubCommand.java | 2 +- .../scm/cli/cmd/PermissionSubCommand.java | 4 ++-- .../sonia/scm/cli/cmd/SubCommandHandler.java | 4 ++-- .../sonia/scm/cli/config/ScmClientConfig.java | 2 +- .../scm/cli/config/XmlConfigAdapter.java | 4 ++-- .../sonia/scm/cli/wrapper/WrapperUtil.java | 6 +++--- .../client/JerseyClientRepositoryBrowser.java | 2 +- .../java/sonia/scm/collect/IterableQueue.java | 2 +- .../sonia/scm/collect/LimitedSortedSet.java | 2 +- .../scm/io/AbstractResourceProcessor.java | 2 +- .../java/sonia/scm/io/INIConfiguration.java | 2 +- .../main/java/sonia/scm/io/INISection.java | 2 +- .../java/sonia/scm/plugin/PluginCenter.java | 4 ++-- .../sonia/scm/plugin/PluginCondition.java | 2 +- .../sonia/scm/plugin/PluginInformation.java | 2 +- .../repository/AbstractRepositoryHandler.java | 2 +- .../java/sonia/scm/repository/Changeset.java | 6 +++--- .../scm/repository/PreProcessorUtil.java | 20 +++++++++---------- .../sonia/scm/repository/RepositoryUtil.java | 4 ++-- .../java/sonia/scm/search/SearchUtil.java | 2 +- .../src/main/java/sonia/scm/util/IOUtil.java | 2 +- .../java/sonia/scm/util/LinkTextParser.java | 2 +- .../main/java/sonia/scm/util/ServiceUtil.java | 2 +- .../src/main/java/sonia/scm/util/Util.java | 4 ++-- .../main/java/sonia/scm/web/cgi/EnvList.java | 4 ++-- .../filter/BufferedHttpServletResponse.java | 4 ++-- .../sonia/scm/xml/XmlMapStringAdapter.java | 2 +- .../sonia/scm/xml/XmlSetStringAdapter.java | 2 +- .../sonia/scm/collect/IterableQueueTest.java | 12 +++++------ .../template/TemplateEngineFactoryTest.java | 2 +- .../scm/url/WUIModelUrlProviderTest.java | 2 +- .../sonia/scm/group/xml/XmlGroupDatabase.java | 2 +- .../sonia/scm/group/xml/XmlGroupList.java | 2 +- .../scm/group/xml/XmlGroupMapAdapter.java | 2 +- .../repository/xml/XmlRepositoryDatabase.java | 3 +-- .../scm/repository/xml/XmlRepositoryList.java | 2 +- .../xml/XmlRepositoryMapAdapter.java | 3 +-- .../store/JAXBConfigurationEntryStore.java | 4 ++-- .../JAXBConfigurationEntryStoreFactory.java | 6 +++--- .../sonia/scm/user/xml/XmlUserDatabase.java | 2 +- .../java/sonia/scm/user/xml/XmlUserList.java | 2 +- .../sonia/scm/user/xml/XmlUserMapAdapter.java | 2 +- .../scm/repository/GitChangesetConverter.java | 2 +- .../scm/repository/GitSubModuleParser.java | 3 +-- .../scm/repository/spi/GitBlameCommand.java | 2 +- .../sonia/scm/installer/HgPackageReader.java | 4 ++-- .../scm/installer/WindowsHgInstaller.java | 2 +- .../scm/repository/AbstractHgHandler.java | 6 +++--- .../scm/repository/spi/HgLogCommand.java | 2 +- .../sonia/scm/user/UserManagerTestBase.java | 2 +- .../scm/api/rest/UriExtensionsConfig.java | 2 +- .../resources/RepositoryImportResource.java | 6 +++--- .../rest/resources/RepositoryResource.java | 2 +- .../api/rest/resources/SearchResource.java | 6 +++--- .../sonia/scm/cache/GuavaCacheManager.java | 2 +- .../scm/plugin/MultiParentClassLoader.java | 2 +- .../sonia/scm/plugin/UberClassLoader.java | 2 +- .../java/sonia/scm/template/ErrorServlet.java | 2 +- .../sonia/scm/template/TemplateServlet.java | 2 +- .../sonia/scm/it/GetRepositoriesITCase.java | 2 +- .../test/java/sonia/scm/it/GroupITCase.java | 4 ++-- .../scm/it/RepositoryTypeITCaseBase.java | 2 +- .../ahc/DefaultAdvancedHttpClientTest.java | 2 +- .../DefaultUberWebResourceLoaderTest.java | 4 ++-- .../java/sonia/scm/plugin/PluginTreeTest.java | 2 +- 78 files changed, 116 insertions(+), 119 deletions(-) diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java index ca8737101c..5bf070258e 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java @@ -288,7 +288,7 @@ public class App /** Field description */ @Argument(index = 1, metaVar = "arg") - private List arguments = new ArrayList(); + private List arguments = new ArrayList<>(); /** Field description */ private BufferedReader input; diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateGroupSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateGroupSubCommand.java index a64a273253..5fba296532 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateGroupSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateGroupSubCommand.java @@ -169,7 +169,7 @@ public class CreateGroupSubCommand extends TemplateSubCommand session.getGroupHandler().create(group); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("group", new GroupWrapper(group)); renderTemplate(env, GetGroupSubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateRepositorySubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateRepositorySubCommand.java index 52828eba25..a0d675e2be 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateRepositorySubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateRepositorySubCommand.java @@ -168,7 +168,7 @@ public class CreateRepositorySubCommand extends TemplateSubCommand session.getRepositoryHandler().create(repository); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("repository", new RepositoryWrapper(config, repository)); renderTemplate(env, GetRepositorySubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateUserSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateUserSubCommand.java index c6a72d4ce8..805c05d83b 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateUserSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/CreateUserSubCommand.java @@ -214,7 +214,7 @@ public class CreateUserSubCommand extends TemplateSubCommand session.getUserHandler().create(user); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("user", new UserWrapper(user)); renderTemplate(env, GetUserSubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetGroupSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetGroupSubCommand.java index 5d823217e1..9bb02a4703 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetGroupSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetGroupSubCommand.java @@ -102,7 +102,7 @@ public class GetGroupSubCommand extends TemplateSubCommand if (group != null) { - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("group", new GroupWrapper(group)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetRepositorySubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetRepositorySubCommand.java index 2e8227fa60..5dd27db525 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetRepositorySubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetRepositorySubCommand.java @@ -117,7 +117,7 @@ public class GetRepositorySubCommand extends TemplateSubCommand if (repository != null) { - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("repository", new RepositoryWrapper(config, repository)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetUserSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetUserSubCommand.java index 60d70349cb..2356d6323a 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetUserSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GetUserSubCommand.java @@ -102,7 +102,7 @@ public class GetUserSubCommand extends TemplateSubCommand if (user != null) { - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("user", new UserWrapper(user)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListGroupsSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListGroupsSubCommand.java index 968e574ca6..80b9428f6b 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListGroupsSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListGroupsSubCommand.java @@ -71,7 +71,7 @@ public class ListGroupsSubCommand extends TemplateSubCommand { ScmClientSession session = createSession(); List groups = session.getGroupHandler().getAll(); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("groups", WrapperUtil.wrapGroups(groups)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListRepositoriesSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListRepositoriesSubCommand.java index 2235781791..f876d2a878 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListRepositoriesSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListRepositoriesSubCommand.java @@ -72,7 +72,7 @@ public class ListRepositoriesSubCommand extends TemplateSubCommand { ScmClientSession session = createSession(); List repositories = session.getRepositoryHandler().getAll(); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("repositories", WrapperUtil.wrapRepositories(config, repositories)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListUsersSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListUsersSubCommand.java index 58da1fc2f3..9f17f59160 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListUsersSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ListUsersSubCommand.java @@ -71,7 +71,7 @@ public class ListUsersSubCommand extends TemplateSubCommand { ScmClientSession session = createSession(); List users = session.getUserHandler().getAll(); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("users", WrapperUtil.wrapUsers(users)); renderTemplate(env, TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/MembersSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/MembersSubCommand.java index 279b0602ec..490a239cd3 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/MembersSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/MembersSubCommand.java @@ -132,7 +132,7 @@ public abstract class MembersSubCommand extends TemplateSubCommand modifyMembers(group, members); handler.modify(group); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("group", new GroupWrapper(group)); renderTemplate(env, GetGroupSubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyGroupSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyGroupSubCommand.java index 244f40f114..6cb151e22d 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyGroupSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyGroupSubCommand.java @@ -108,7 +108,7 @@ public class ModifyGroupSubCommand extends TemplateSubCommand handler.modify(group); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("group", new GroupWrapper(group)); renderTemplate(env, GetGroupSubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyRepositorySubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyRepositorySubCommand.java index 5ec4c59519..b0d64242d0 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyRepositorySubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyRepositorySubCommand.java @@ -212,7 +212,7 @@ public class ModifyRepositorySubCommand extends TemplateSubCommand handler.modify(repository); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("repository", new RepositoryWrapper(config, repository)); renderTemplate(env, GetRepositorySubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyUserSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyUserSubCommand.java index 613b07d552..63a25d5d07 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyUserSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/ModifyUserSubCommand.java @@ -184,7 +184,7 @@ public class ModifyUserSubCommand extends TemplateSubCommand handler.modify(user); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("user", new UserWrapper(user)); renderTemplate(env, GetUserSubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/PermissionSubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/PermissionSubCommand.java index a6b5eba2f5..d40c50c38a 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/PermissionSubCommand.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/PermissionSubCommand.java @@ -111,14 +111,14 @@ public abstract class PermissionSubCommand extends TemplateSubCommand if (permissions == null) { - permissions = new ArrayList(); + permissions = new ArrayList<>(); } modifyPermissions(permissions); repository.setPermissions(permissions); handler.modify(repository); - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("repository", new RepositoryWrapper(config, repository)); renderTemplate(env, GetRepositorySubCommand.TEMPLATE); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java index 3f8e1f74fb..36f39d470c 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java @@ -83,7 +83,7 @@ public class SubCommandHandler */ private SubCommandHandler() { - subCommands = new HashMap(); + subCommands = new HashMap<>(); loadSubCommands(); } @@ -133,7 +133,7 @@ public class SubCommandHandler public List getDescriptors() { List descs = - new ArrayList(subCommands.values()); + new ArrayList<>(subCommands.values()); Collections.sort(descs); diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java index 281a0f8c3b..68c50731b7 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/ScmClientConfig.java @@ -63,7 +63,7 @@ public class ScmClientConfig */ private ScmClientConfig() { - this.serverConfigMap = new HashMap(); + this.serverConfigMap = new HashMap<>(); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/XmlConfigAdapter.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/XmlConfigAdapter.java index fcf109d879..c7471cf601 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/XmlConfigAdapter.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/config/XmlConfigAdapter.java @@ -63,7 +63,7 @@ public class XmlConfigAdapter @Override public XmlConfigSet marshal(Map map) throws Exception { - Set set = new HashSet(); + Set set = new HashSet<>(); for (Map.Entry e : map.entrySet()) { @@ -86,7 +86,7 @@ public class XmlConfigAdapter @Override public Map unmarshal(XmlConfigSet set) throws Exception { - Map map = new HashMap(); + Map map = new HashMap<>(); for (XmlConfigElement e : set) { diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/wrapper/WrapperUtil.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/wrapper/WrapperUtil.java index 0c87424fe6..466cf55019 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/wrapper/WrapperUtil.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/wrapper/WrapperUtil.java @@ -71,7 +71,7 @@ public final class WrapperUtil */ public static List wrapGroups(Collection groups) { - List wrappers = new ArrayList(); + List wrappers = new ArrayList<>(); for (Group g : groups) { @@ -95,7 +95,7 @@ public final class WrapperUtil public static List wrapRepositories(ServerConfig config, Collection repositories) { - List wrappers = new ArrayList(); + List wrappers = new ArrayList<>(); for (Repository r : repositories) { @@ -115,7 +115,7 @@ public final class WrapperUtil */ public static List wrapUsers(Collection users) { - List wrappers = new ArrayList(); + List wrappers = new ArrayList<>(); for (User u : users) { diff --git a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java index 571c30f7db..1b68cdc63d 100644 --- a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java +++ b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java @@ -187,7 +187,7 @@ public class JerseyClientRepositoryBrowser implements ClientRepositoryBrowser BrowserResult result = response.getEntity(BrowserResult.class); AssertUtil.assertIsNotNull(result); - files = new ArrayList(); + files = new ArrayList<>(); List foList = result.getFiles(); diff --git a/scm-core/src/main/java/sonia/scm/collect/IterableQueue.java b/scm-core/src/main/java/sonia/scm/collect/IterableQueue.java index 9d3c85bb90..6b6af9fd0f 100644 --- a/scm-core/src/main/java/sonia/scm/collect/IterableQueue.java +++ b/scm-core/src/main/java/sonia/scm/collect/IterableQueue.java @@ -134,7 +134,7 @@ public final class IterableQueue implements Iterable else { logger.trace("create queue iterator"); - iterator = new QueueIterator(this); + iterator = new QueueIterator<>(this); } return iterator; diff --git a/scm-core/src/main/java/sonia/scm/collect/LimitedSortedSet.java b/scm-core/src/main/java/sonia/scm/collect/LimitedSortedSet.java index fe99ee7a1c..681b8ef07c 100644 --- a/scm-core/src/main/java/sonia/scm/collect/LimitedSortedSet.java +++ b/scm-core/src/main/java/sonia/scm/collect/LimitedSortedSet.java @@ -63,7 +63,7 @@ public class LimitedSortedSet extends ForwardingSortedSet */ public LimitedSortedSet(int maxSize) { - this.sortedSet = new TreeSet(); + this.sortedSet = new TreeSet<>(); this.maxSize = maxSize; } diff --git a/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java b/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java index 8b5c1d1dd7..6c00a319c9 100644 --- a/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java +++ b/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java @@ -183,5 +183,5 @@ public abstract class AbstractResourceProcessor implements ResourceProcessor //~--- fields --------------------------------------------------------------- /** Field description */ - private Map variableMap = new HashMap(); + private Map variableMap = new HashMap<>(); } diff --git a/scm-core/src/main/java/sonia/scm/io/INIConfiguration.java b/scm-core/src/main/java/sonia/scm/io/INIConfiguration.java index 9f3cce03f6..c9695b7ca6 100644 --- a/scm-core/src/main/java/sonia/scm/io/INIConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/io/INIConfiguration.java @@ -52,7 +52,7 @@ public class INIConfiguration */ public INIConfiguration() { - this.sectionMap = new LinkedHashMap(); + this.sectionMap = new LinkedHashMap<>(); } //~--- methods -------------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/io/INISection.java b/scm-core/src/main/java/sonia/scm/io/INISection.java index 03768a84ca..0ce6ea6bcf 100644 --- a/scm-core/src/main/java/sonia/scm/io/INISection.java +++ b/scm-core/src/main/java/sonia/scm/io/INISection.java @@ -55,7 +55,7 @@ public class INISection public INISection(String name) { this.name = name; - this.parameters = new LinkedHashMap(); + this.parameters = new LinkedHashMap<>(); } /** diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginCenter.java b/scm-core/src/main/java/sonia/scm/plugin/PluginCenter.java index e1598e0490..e4de29eb26 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginCenter.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginCenter.java @@ -111,10 +111,10 @@ public class PluginCenter implements Serializable /** Field description */ @XmlElement(name = "plugin") @XmlElementWrapper(name = "plugins") - private Set plugins = new HashSet(); + private Set plugins = new HashSet<>(); /** Field description */ @XmlElement(name = "repository") @XmlElementWrapper(name = "repositories") - private Set repositories = new HashSet(); + private Set repositories = new HashSet<>(); } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java index 8f9ce89185..2a5dfcee8c 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java @@ -101,7 +101,7 @@ public class PluginCondition implements Cloneable, Serializable if (Util.isNotEmpty(os)) { - clone.setOs(new ArrayList(os)); + clone.setOs(new ArrayList<>(os)); } return clone; diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java index 1cf23fd3d9..4fffdd8572 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java @@ -106,7 +106,7 @@ public class PluginInformation if (Util.isNotEmpty(screenshots)) { - clone.setScreenshots(new ArrayList(screenshots)); + clone.setScreenshots(new ArrayList<>(screenshots)); } clone.setState(state); diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java index a327b50dae..5ad5d0f9ca 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java @@ -209,7 +209,7 @@ public abstract class AbstractRepositoryHandler(config)); + new RepositoryHandlerConfigChangedEvent<>(config)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/repository/Changeset.java b/scm-core/src/main/java/sonia/scm/repository/Changeset.java index fecfd74cc9..ce3fb5424b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Changeset.java +++ b/scm-core/src/main/java/sonia/scm/repository/Changeset.java @@ -220,7 +220,7 @@ public class Changeset extends BasicPropertiesAware { if (branches == null) { - branches = new ArrayList(); + branches = new ArrayList<>(); } return branches; @@ -286,7 +286,7 @@ public class Changeset extends BasicPropertiesAware { if (parents == null) { - parents = new ArrayList(); + parents = new ArrayList<>(); } return parents; @@ -302,7 +302,7 @@ public class Changeset extends BasicPropertiesAware { if (tags == null) { - tags = new ArrayList(); + tags = new ArrayList<>(); } return tags; diff --git a/scm-core/src/main/java/sonia/scm/repository/PreProcessorUtil.java b/scm-core/src/main/java/sonia/scm/repository/PreProcessorUtil.java index b44da13ad1..72e4ed7d63 100644 --- a/scm-core/src/main/java/sonia/scm/repository/PreProcessorUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/PreProcessorUtil.java @@ -110,8 +110,8 @@ public class PreProcessorUtil EscapeUtil.escape(blameLine); PreProcessorHandler handler = - new PreProcessorHandler(blameLinePreProcessorFactorySet, - blameLinePreProcessorSet, repository); + new PreProcessorHandler<>(blameLinePreProcessorFactorySet, + blameLinePreProcessorSet, repository); handler.callPreProcessors(blameLine); handler.callPreProcessorFactories(blameLine); @@ -154,8 +154,8 @@ public class PreProcessorUtil } PreProcessorHandler handler = - new PreProcessorHandler(blameLinePreProcessorFactorySet, - blameLinePreProcessorSet, repository); + new PreProcessorHandler<>(blameLinePreProcessorFactorySet, + blameLinePreProcessorSet, repository); handler.callPreProcessors(blameResult.getBlameLines()); handler.callPreProcessorFactories(blameResult.getBlameLines()); @@ -198,8 +198,8 @@ public class PreProcessorUtil } PreProcessorHandler handler = - new PreProcessorHandler(changesetPreProcessorFactorySet, - changesetPreProcessorSet, repository); + new PreProcessorHandler<>(changesetPreProcessorFactorySet, + changesetPreProcessorSet, repository); handler.callPreProcessors(changeset); handler.callPreProcessorFactories(changeset); @@ -242,8 +242,8 @@ public class PreProcessorUtil } PreProcessorHandler handler = - new PreProcessorHandler(fileObjectPreProcessorFactorySet, - fileObjectPreProcessorSet, repository); + new PreProcessorHandler<>(fileObjectPreProcessorFactorySet, + fileObjectPreProcessorSet, repository); handler.callPreProcessors(result); handler.callPreProcessorFactories(result); @@ -274,8 +274,8 @@ public class PreProcessorUtil } PreProcessorHandler handler = - new PreProcessorHandler(changesetPreProcessorFactorySet, - changesetPreProcessorSet, repository); + new PreProcessorHandler<>(changesetPreProcessorFactorySet, + changesetPreProcessorSet, repository); handler.callPreProcessors(result); handler.callPreProcessorFactories(result); 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 e271992248..fd955d27b7 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java @@ -85,7 +85,7 @@ public final class RepositoryUtil public static List searchRepositoryDirectories(File directory, String... names) { - List repositories = new ArrayList(); + List repositories = new ArrayList<>(); searchRepositoryDirectories(repositories, directory, Arrays.asList(names)); @@ -253,7 +253,7 @@ public final class RepositoryUtil String... directoryNames) throws IOException { - List repositories = new ArrayList(); + List repositories = new ArrayList<>(); List repositoryFiles = searchRepositoryDirectories(baseDirectory, directoryNames); diff --git a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java index dc18e6bd27..10ce9ed1d1 100644 --- a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java +++ b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java @@ -160,7 +160,7 @@ public final class SearchUtil public static Collection search(SearchRequest searchRequest, Collection collection, TransformFilter filter) { - List items = new ArrayList(); + List items = new ArrayList<>(); int index = 0; int counter = 0; diff --git a/scm-core/src/main/java/sonia/scm/util/IOUtil.java b/scm-core/src/main/java/sonia/scm/util/IOUtil.java index d71f8a36fc..51c67b0b7d 100644 --- a/scm-core/src/main/java/sonia/scm/util/IOUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/IOUtil.java @@ -592,7 +592,7 @@ public final class IOUtil public static List searchAll(String[] path, String cmd, String checkParameter) { - List cmds = new ArrayList(); + List cmds = new ArrayList<>(); if (isCommandAvailable(cmd, checkParameter)) { diff --git a/scm-core/src/main/java/sonia/scm/util/LinkTextParser.java b/scm-core/src/main/java/sonia/scm/util/LinkTextParser.java index 2037beeeff..67ca800bcb 100644 --- a/scm-core/src/main/java/sonia/scm/util/LinkTextParser.java +++ b/scm-core/src/main/java/sonia/scm/util/LinkTextParser.java @@ -79,7 +79,7 @@ public final class LinkTextParser public static String parseText(String content) { Matcher m = REGEX_URL.matcher(content); - List tokens = new ArrayList(); + List tokens = new ArrayList<>(); int position = 0; String tokenContent = null; diff --git a/scm-core/src/main/java/sonia/scm/util/ServiceUtil.java b/scm-core/src/main/java/sonia/scm/util/ServiceUtil.java index 138345bb05..04bdfb6dea 100644 --- a/scm-core/src/main/java/sonia/scm/util/ServiceUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ServiceUtil.java @@ -119,7 +119,7 @@ public final class ServiceUtil */ public static List getServices(Class type) { - List result = new ArrayList(); + List result = new ArrayList<>(); try { diff --git a/scm-core/src/main/java/sonia/scm/util/Util.java b/scm-core/src/main/java/sonia/scm/util/Util.java index d17219bfa2..cb64b75aff 100644 --- a/scm-core/src/main/java/sonia/scm/util/Util.java +++ b/scm-core/src/main/java/sonia/scm/util/Util.java @@ -262,8 +262,8 @@ public final class Util Comparator comparator, CollectionAppender appender, int start, int limit) { - List result = new ArrayList(); - List valueList = new ArrayList(values); + List result = new ArrayList<>(); + List valueList = new ArrayList<>(values); if (comparator != null) { diff --git a/scm-core/src/main/java/sonia/scm/web/cgi/EnvList.java b/scm-core/src/main/java/sonia/scm/web/cgi/EnvList.java index 796d6125d8..541ae9ba23 100644 --- a/scm-core/src/main/java/sonia/scm/web/cgi/EnvList.java +++ b/scm-core/src/main/java/sonia/scm/web/cgi/EnvList.java @@ -66,7 +66,7 @@ public class EnvList */ public EnvList() { - envMap = new HashMap(); + envMap = new HashMap<>(); } /** @@ -77,7 +77,7 @@ public class EnvList */ public EnvList(EnvList l) { - envMap = new HashMap(l.envMap); + envMap = new HashMap<>(l.envMap); } //~--- methods -------------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java index b91f2b62c9..ff174c4fe8 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java @@ -470,13 +470,13 @@ public class BufferedHttpServletResponse extends HttpServletResponseWrapper private ByteArrayPrintWriter pw = null; /** Field description */ - private Set cookies = new HashSet(); + private Set cookies = new HashSet<>(); /** Field description */ private int statusCode = HttpServletResponse.SC_OK; /** Field description */ - private Map headers = new LinkedHashMap(); + private Map headers = new LinkedHashMap<>(); /** Field description */ private String statusMessage; diff --git a/scm-core/src/main/java/sonia/scm/xml/XmlMapStringAdapter.java b/scm-core/src/main/java/sonia/scm/xml/XmlMapStringAdapter.java index ab6cd83ccc..04d04fae60 100644 --- a/scm-core/src/main/java/sonia/scm/xml/XmlMapStringAdapter.java +++ b/scm-core/src/main/java/sonia/scm/xml/XmlMapStringAdapter.java @@ -102,7 +102,7 @@ public class XmlMapStringAdapter public Map unmarshal(XmlMapStringElement[] elements) throws Exception { - Map map = new HashMap(); + Map map = new HashMap<>(); if (elements != null) { diff --git a/scm-core/src/main/java/sonia/scm/xml/XmlSetStringAdapter.java b/scm-core/src/main/java/sonia/scm/xml/XmlSetStringAdapter.java index 708159bfac..8d088aa205 100644 --- a/scm-core/src/main/java/sonia/scm/xml/XmlSetStringAdapter.java +++ b/scm-core/src/main/java/sonia/scm/xml/XmlSetStringAdapter.java @@ -90,7 +90,7 @@ public class XmlSetStringAdapter extends XmlAdapter> @Override public Set unmarshal(String rawString) throws Exception { - Set tokens = new HashSet(); + Set tokens = new HashSet<>(); for (String token : rawString.split(",")) { diff --git a/scm-core/src/test/java/sonia/scm/collect/IterableQueueTest.java b/scm-core/src/test/java/sonia/scm/collect/IterableQueueTest.java index ade4f3247b..130924fcd4 100644 --- a/scm-core/src/test/java/sonia/scm/collect/IterableQueueTest.java +++ b/scm-core/src/test/java/sonia/scm/collect/IterableQueueTest.java @@ -63,7 +63,7 @@ public class IterableQueueTest @Test(expected = IllegalStateException.class) public void testDuplicatedEndReached() { - IterableQueue queue = new IterableQueue(); + IterableQueue queue = new IterableQueue<>(); queue.endReached(); queue.endReached(); @@ -76,7 +76,7 @@ public class IterableQueueTest @Test public void testIterator() { - IterableQueue queue = new IterableQueue(); + IterableQueue queue = new IterableQueue<>(); assertEquals(QueueIterator.class, queue.iterator().getClass()); queue.endReached(); @@ -120,7 +120,7 @@ public class IterableQueueTest @Test(expected = IllegalStateException.class) public void testPushEndReached() { - IterableQueue queue = new IterableQueue(); + IterableQueue queue = new IterableQueue<>(); queue.push("a"); queue.endReached(); @@ -134,7 +134,7 @@ public class IterableQueueTest @Test public void testSingleConsumer() { - final IterableQueue queue = new IterableQueue(); + final IterableQueue queue = new IterableQueue<>(); new Thread(new IntegerProducer(queue, false, 100)).start(); assertResult(Lists.newArrayList(queue), 100); @@ -176,12 +176,12 @@ public class IterableQueueTest ExecutorService executor = Executors.newFixedThreadPool(threads); List>> futures = Lists.newArrayList(); - final IterableQueue queue = new IterableQueue(); + final IterableQueue queue = new IterableQueue<>(); for (int i = 0; i < consumer; i++) { Future> future = - executor.submit(new CallableQueueCollector(queue)); + executor.submit(new CallableQueueCollector<>(queue)); futures.add(future); } diff --git a/scm-core/src/test/java/sonia/scm/template/TemplateEngineFactoryTest.java b/scm-core/src/test/java/sonia/scm/template/TemplateEngineFactoryTest.java index b676b4bbaf..775f9f0814 100644 --- a/scm-core/src/test/java/sonia/scm/template/TemplateEngineFactoryTest.java +++ b/scm-core/src/test/java/sonia/scm/template/TemplateEngineFactoryTest.java @@ -128,7 +128,7 @@ public class TemplateEngineFactoryTest assertTrue(engines.contains(engine1)); assertTrue(engines.contains(engine2)); - Set ce = new HashSet(); + Set ce = new HashSet<>(); ce.add(engine1); factory = new TemplateEngineFactory(ce, engine2); diff --git a/scm-core/src/test/java/sonia/scm/url/WUIModelUrlProviderTest.java b/scm-core/src/test/java/sonia/scm/url/WUIModelUrlProviderTest.java index b6073a841a..24b2d6d11f 100644 --- a/scm-core/src/test/java/sonia/scm/url/WUIModelUrlProviderTest.java +++ b/scm-core/src/test/java/sonia/scm/url/WUIModelUrlProviderTest.java @@ -50,7 +50,7 @@ public class WUIModelUrlProviderTest extends ModelUrlProviderTestBase */ public WUIModelUrlProviderTest() { - modelMap = new HashMap(); + modelMap = new HashMap<>(); modelMap.put(MODEL_REPOSITORY, "repositoryPanel"); modelMap.put(MODEL_USERS, "userPanel"); modelMap.put(MODEL_GROUPS, "groupPanel"); diff --git a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java index 431d53594a..e4d436283c 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java +++ b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java @@ -199,7 +199,7 @@ public class XmlGroupDatabase implements XmlDatabase /** Field description */ @XmlJavaTypeAdapter(XmlGroupMapAdapter.class) @XmlElement(name = "groups") - private Map groupMap = new LinkedHashMap(); + private Map groupMap = new LinkedHashMap<>(); /** Field description */ private Long lastModified; diff --git a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupList.java b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupList.java index da14968d30..c889944fc4 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupList.java +++ b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupList.java @@ -72,7 +72,7 @@ public class XmlGroupList implements Iterable */ public XmlGroupList(Map groupMap) { - this.groups = new LinkedList(groupMap.values()); + this.groups = new LinkedList<>(groupMap.values()); } //~--- methods -------------------------------------------------------------- diff --git a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupMapAdapter.java b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupMapAdapter.java index b79c8836d2..430d0a84a8 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupMapAdapter.java +++ b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupMapAdapter.java @@ -81,7 +81,7 @@ public class XmlGroupMapAdapter @Override public Map unmarshal(XmlGroupList groups) throws Exception { - Map groupMap = new LinkedHashMap(); + Map groupMap = new LinkedHashMap<>(); for (Group group : groups) { diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java index a5c599c291..8f065a5ca2 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java @@ -298,6 +298,5 @@ public class XmlRepositoryDatabase implements XmlDatabase /** Field description */ @XmlJavaTypeAdapter(XmlRepositoryMapAdapter.class) @XmlElement(name = "repositories") - private Map repositoryMap = new LinkedHashMap(); + private Map repositoryMap = new LinkedHashMap<>(); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java index d9807e9188..085d65476a 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java @@ -72,7 +72,7 @@ public class XmlRepositoryList implements Iterable */ public XmlRepositoryList(Map repositoryMap) { - this.repositories = new LinkedList(repositoryMap.values()); + this.repositories = new LinkedList<>(repositoryMap.values()); } //~--- methods -------------------------------------------------------------- diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java index a90a2d4fa9..c31a0cd26d 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java @@ -83,8 +83,7 @@ public class XmlRepositoryMapAdapter public Map unmarshal(XmlRepositoryList repositories) throws Exception { - Map repositoryMap = new LinkedHashMap(); + Map repositoryMap = new LinkedHashMap<>(); for (Repository repository : repositories) { diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java index 6a9098b545..f1f3040883 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java @@ -436,8 +436,8 @@ public class JAXBConfigurationEntryStore implements ConfigurationEntryStore je = new JAXBElement(QName.valueOf(TAG_VALUE), type, - e.getValue()); + JAXBElement je = new JAXBElement<>(QName.valueOf(TAG_VALUE), type, + e.getValue()); m.marshal(je, writer); diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java index bf5dae720f..69ac5784cb 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java @@ -102,9 +102,9 @@ public class JAXBConfigurationEntryStoreFactory type, name); //J- - return new JAXBConfigurationEntryStore( - new File(directory,name.concat(StoreConstants.FILE_EXTENSION)), - keyGenerator, + return new JAXBConfigurationEntryStore<>( + new File(directory, name.concat(StoreConstants.FILE_EXTENSION)), + keyGenerator, type ); //J+ diff --git a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java index 579856fce7..2306fd588b 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java +++ b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java @@ -202,5 +202,5 @@ public class XmlUserDatabase implements XmlDatabase /** Field description */ @XmlJavaTypeAdapter(XmlUserMapAdapter.class) @XmlElement(name = "users") - private Map userMap = new LinkedHashMap(); + private Map userMap = new LinkedHashMap<>(); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserList.java b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserList.java index e76f008b92..6877d8544e 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserList.java +++ b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserList.java @@ -72,7 +72,7 @@ public class XmlUserList implements Iterable */ public XmlUserList(Map userMap) { - this.users = new LinkedList(userMap.values()); + this.users = new LinkedList<>(userMap.values()); } //~--- methods -------------------------------------------------------------- diff --git a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserMapAdapter.java b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserMapAdapter.java index f5573310d5..0c2386f37c 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserMapAdapter.java +++ b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserMapAdapter.java @@ -81,7 +81,7 @@ public class XmlUserMapAdapter @Override public Map unmarshal(XmlUserList users) throws Exception { - Map userMap = new LinkedHashMap(); + Map userMap = new LinkedHashMap<>(); for (User user : users) { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java index a59e3b5754..4838f8ec23 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java @@ -198,7 +198,7 @@ public class GitChangesetConverter implements Closeable if (Util.isNotEmpty(parents)) { - parentList = new ArrayList(); + parentList = new ArrayList<>(); for (RevCommit parent : parents) { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitSubModuleParser.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitSubModuleParser.java index 7244a1f2bb..d5ed9cb500 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitSubModuleParser.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitSubModuleParser.java @@ -71,8 +71,7 @@ public final class GitSubModuleParser */ public static Map parse(String content) { - Map subRepositories = new HashMap(); + Map subRepositories = new HashMap<>(); Scanner scanner = new Scanner(content); SubRepository repository = null; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java index c797fd70eb..51f6974daa 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java @@ -137,7 +137,7 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand request.getPath())); } - List blameLines = new ArrayList(); + List blameLines = new ArrayList<>(); int total = gitBlameResult.getResultContents().size(); int i = 0; diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java index d16f056889..cb09c32870 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java @@ -145,7 +145,7 @@ public class HgPackageReader */ private void filterPackage(HgPackages packages) { - List pkgList = new ArrayList(); + List pkgList = new ArrayList<>(); for (HgPackage pkg : packages) { @@ -228,7 +228,7 @@ public class HgPackageReader if (packages == null) { packages = new HgPackages(); - packages.setPackages(new ArrayList()); + packages.setPackages(new ArrayList<>()); } return packages; diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java index 19df6f43d6..528f6b941a 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java @@ -282,7 +282,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller */ private List getInstallations(String[] registryKeys) { - List installations = new ArrayList(); + List installations = new ArrayList<>(); for (String registryKey : registryKeys) { diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java index 5f0e721594..1d54d0ad87 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java @@ -174,7 +174,7 @@ public class AbstractHgHandler */ protected Process createHgProcess(String... args) throws IOException { - return createHgProcess(new HashMap(), args); + return createHgProcess(new HashMap<>(), args); } /** @@ -262,7 +262,7 @@ public class AbstractHgHandler throws IOException, RepositoryException { return getResultFromScript(resultType, script, - new HashMap()); + new HashMap<>()); } /** @@ -315,7 +315,7 @@ public class AbstractHgHandler throws IOException { HgConfig config = handler.getConfig(); - List cmdList = new ArrayList(); + List cmdList = new ArrayList<>(); cmdList.add(cmd); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java index af485d19df..6dbba81a16 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java @@ -168,7 +168,7 @@ public class HgLogCommand extends AbstractCommand implements LogCommand { // empty repository - result = new ChangesetPagingResult(0, new ArrayList()); + result = new ChangesetPagingResult(0, new ArrayList<>()); } } diff --git a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java index 86b3de5615..054ef892ea 100644 --- a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java @@ -282,7 +282,7 @@ public abstract class UserManagerTestBase throws UserException, IOException, InterruptedException { int initialSize = manager.getAll().size(); - List testers = new ArrayList(); + List testers = new ArrayList<>(); for (int i = 0; i < THREAD_COUNT; i++) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/UriExtensionsConfig.java b/scm-webapp/src/main/java/sonia/scm/api/rest/UriExtensionsConfig.java index 637866ad61..d0b44a1ce1 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/UriExtensionsConfig.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/UriExtensionsConfig.java @@ -101,7 +101,7 @@ public class UriExtensionsConfig extends PackagesResourceConfig { if (mediaTypeMap == null) { - mediaTypeMap = new HashMap(); + mediaTypeMap = new HashMap<>(); mediaTypeMap.put(EXTENSION_JSON, MediaType.APPLICATION_JSON_TYPE); mediaTypeMap.put(EXTENSION_XML, MediaType.APPLICATION_XML_TYPE); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java index d6bb92d233..8b52d693ed 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java @@ -320,7 +320,7 @@ public class RepositoryImportResource { SecurityUtils.getSubject().checkRole(Role.ADMIN); - List repositories = new ArrayList(); + List repositories = new ArrayList<>(); importFromDirectory(repositories, type); @@ -354,7 +354,7 @@ public class RepositoryImportResource logger.info("start directory import for all supported repository types"); - List repositories = new ArrayList(); + List repositories = new ArrayList<>(); for (Type t : findImportableTypes()) { @@ -628,7 +628,7 @@ public class RepositoryImportResource */ private List findImportableTypes() { - List types = new ArrayList(); + List types = new ArrayList<>(); Collection handlerTypes = manager.getTypes(); for (Type t : handlerTypes) 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 ad092911ee..1ae31fcebf 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 @@ -1028,7 +1028,7 @@ public class RepositoryResource extends AbstractManagerResource()); + repository.setPermissions(new ArrayList<>()); } } else diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java index b08a2aaace..4b05493d3a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java @@ -98,14 +98,14 @@ public class SearchResource // create user searchhandler Cache userCache = cacheManager.getCache(CACHE_USER); - this.userSearchHandler = new SearchHandler(userCache, userManager); + this.userSearchHandler = new SearchHandler<>(userCache, userManager); // create group searchhandler Cache groupCache = cacheManager.getCache(CACHE_GROUP); - this.groupSearchHandler = new SearchHandler(groupCache, - groupManager); + this.groupSearchHandler = new SearchHandler<>(groupCache, + groupManager); } //~--- methods -------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java index 43e86c762c..94abbc6e7e 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java @@ -140,7 +140,7 @@ public class GuavaCacheManager logger.debug( "cache {} does not exists, creating a new instance from default configuration: {}", name, defaultConfiguration); - cache = new GuavaCache(defaultConfiguration, name); + cache = new GuavaCache<>(defaultConfiguration, name); cacheMap.put(name, cache); } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/MultiParentClassLoader.java b/scm-webapp/src/main/java/sonia/scm/plugin/MultiParentClassLoader.java index 5881652ec4..ebd8b6e24e 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/MultiParentClassLoader.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/MultiParentClassLoader.java @@ -74,7 +74,7 @@ public class MultiParentClassLoader extends ClassLoader public MultiParentClassLoader(Collection parents) { super(null); - this.parents = new CopyOnWriteArrayList(parents); + this.parents = new CopyOnWriteArrayList<>(parents); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/UberClassLoader.java b/scm-webapp/src/main/java/sonia/scm/plugin/UberClassLoader.java index 6906afc7d4..ba25fe8c65 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/UberClassLoader.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/UberClassLoader.java @@ -100,7 +100,7 @@ public final class UberClassLoader extends ClassLoader if (clazz != null) { - cache.put(name, new WeakReference>(clazz)); + cache.put(name, new WeakReference<>(clazz)); break; } diff --git a/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java b/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java index 4d62b823a1..726ab33032 100644 --- a/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java @@ -153,7 +153,7 @@ public class ErrorServlet extends HttpServlet { writer = response.getWriter(); - Map env = new HashMap(); + Map env = new HashMap<>(); String error = Util.EMPTY_STRING; if (context.getStartupError() != null) diff --git a/scm-webapp/src/main/java/sonia/scm/template/TemplateServlet.java b/scm-webapp/src/main/java/sonia/scm/template/TemplateServlet.java index 89e6baa685..902755f1f9 100644 --- a/scm-webapp/src/main/java/sonia/scm/template/TemplateServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/template/TemplateServlet.java @@ -129,7 +129,7 @@ public class TemplateServlet extends HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - Map params = new HashMap(); + Map params = new HashMap<>(); String contextPath = request.getContextPath(); params.put("contextPath", contextPath); diff --git a/scm-webapp/src/test/java/sonia/scm/it/GetRepositoriesITCase.java b/scm-webapp/src/test/java/sonia/scm/it/GetRepositoriesITCase.java index 6978c897f8..5ffe144158 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/GetRepositoriesITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/GetRepositoriesITCase.java @@ -90,7 +90,7 @@ public class GetRepositoriesITCase extends AbstractAdminITCaseBase @Parameters public static Collection createParameters() { - Collection params = new ArrayList(); + Collection params = new ArrayList<>(); params.add(new String[] { "git" }); params.add(new String[] { "svn" }); diff --git a/scm-webapp/src/test/java/sonia/scm/it/GroupITCase.java b/scm-webapp/src/test/java/sonia/scm/it/GroupITCase.java index e95f613f2a..175d58b45d 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/GroupITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/GroupITCase.java @@ -89,7 +89,7 @@ public class GroupITCase extends AbstractAdminITCaseBase group.setName("group-a"); group.setDescription("group a"); - List members = new ArrayList(); + List members = new ArrayList<>(); members.add("slarti"); members.add("marvin"); @@ -110,7 +110,7 @@ public class GroupITCase extends AbstractAdminITCaseBase group.setName("group-b"); group.setDescription("group b"); - List members = new ArrayList(); + List members = new ArrayList<>(); members.add("slarti"); members.add("dent"); diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java index 8e356152be..3ba12fc282 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java @@ -59,7 +59,7 @@ public class RepositoryTypeITCaseBase @Parameters public static Collection createParameters() { - Collection params = new ArrayList(); + Collection params = new ArrayList<>(); params.add(new String[] { "git" }); params.add(new String[] { "svn" }); diff --git a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpClientTest.java b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpClientTest.java index faac9a99e5..2fa9748dd4 100644 --- a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpClientTest.java +++ b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpClientTest.java @@ -284,7 +284,7 @@ public class DefaultAdvancedHttpClientTest public void setUp() { configuration = new ScmConfiguration(); - transformers = new HashSet(); + transformers = new HashSet<>(); client = new TestingAdvacedHttpClient(configuration, transformers); } diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultUberWebResourceLoaderTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultUberWebResourceLoaderTest.java index 19db037a9a..43f53e3814 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultUberWebResourceLoaderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultUberWebResourceLoaderTest.java @@ -111,7 +111,7 @@ public class DefaultUberWebResourceLoaderTest extends WebResourceLoaderTestBase DefaultUberWebResourceLoader resourceLoader = new DefaultUberWebResourceLoader(servletContext, - new ArrayList()); + new ArrayList<>()); resourceLoader.getCache().put("/myresource", GITHUB); @@ -152,7 +152,7 @@ public class DefaultUberWebResourceLoaderTest extends WebResourceLoaderTestBase WebResourceLoader resourceLoader = new DefaultUberWebResourceLoader(servletContext, - new ArrayList()); + new ArrayList<>()); URL resource = resourceLoader.getResource("/myresource"); assertSame(SCM_MANAGER, resource); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java index 31e008b42d..54765934dd 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java @@ -66,7 +66,7 @@ public class PluginTreeTest public void testPluginConditionFailed() throws IOException { PluginCondition condition = new PluginCondition("999", - new ArrayList(), "hit"); + new ArrayList<>(), "hit"); Plugin plugin = new Plugin(2, createInfo("a", "b", "1"), null, condition, false, null); ExplodedSmp smp = createSmp(plugin); From 94fba3df13a0ab4e46d577e72f9f9d798fd1f139 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:13:15 +0200 Subject: [PATCH 015/144] build: remove redundant groupIds as they are defined in the parent pom --- scm-annotation-processor/pom.xml | 3 +-- scm-annotations/pom.xml | 3 +-- scm-clients/scm-cli-client/pom.xml | 1 - scm-clients/scm-client-api/pom.xml | 1 - scm-clients/scm-client-impl/pom.xml | 1 - scm-core/pom.xml | 1 - scm-dao-xml/pom.xml | 3 +-- scm-plugin-backend/pom.xml | 1 - scm-plugins/scm-git-plugin/pom.xml | 1 - scm-plugins/scm-hg-plugin/pom.xml | 1 - scm-plugins/scm-legacy-plugin/pom.xml | 3 +-- scm-plugins/scm-svn-plugin/pom.xml | 1 - scm-server/pom.xml | 1 - scm-test/pom.xml | 1 - scm-webapp/pom.xml | 1 - 15 files changed, 4 insertions(+), 19 deletions(-) diff --git a/scm-annotation-processor/pom.xml b/scm-annotation-processor/pom.xml index 16900521ae..622bddd221 100644 --- a/scm-annotation-processor/pom.xml +++ b/scm-annotation-processor/pom.xml @@ -8,8 +8,7 @@ scm 2.0.0-SNAPSHOT - - sonia.scm + scm-annotation-processor 2.0.0-SNAPSHOT scm-annotation-processor diff --git a/scm-annotations/pom.xml b/scm-annotations/pom.xml index ba8922e0b6..c5a892af95 100644 --- a/scm-annotations/pom.xml +++ b/scm-annotations/pom.xml @@ -8,8 +8,7 @@ scm 2.0.0-SNAPSHOT - - sonia.scm + scm-annotations 2.0.0-SNAPSHOT scm-annotations diff --git a/scm-clients/scm-cli-client/pom.xml b/scm-clients/scm-cli-client/pom.xml index e5605878f8..7e32b5c397 100644 --- a/scm-clients/scm-cli-client/pom.xml +++ b/scm-clients/scm-cli-client/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.clients scm-cli-client 2.0.0-SNAPSHOT scm-cli-client diff --git a/scm-clients/scm-client-api/pom.xml b/scm-clients/scm-client-api/pom.xml index d2f8692ca7..ce9561d2e5 100644 --- a/scm-clients/scm-client-api/pom.xml +++ b/scm-clients/scm-client-api/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.clients scm-client-api jar 2.0.0-SNAPSHOT diff --git a/scm-clients/scm-client-impl/pom.xml b/scm-clients/scm-client-impl/pom.xml index 68ff65317f..84548301e6 100644 --- a/scm-clients/scm-client-impl/pom.xml +++ b/scm-clients/scm-client-impl/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.clients scm-client-impl jar 2.0.0-SNAPSHOT diff --git a/scm-core/pom.xml b/scm-core/pom.xml index f08de28f26..3b88e2fa9a 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm scm-core 2.0.0-SNAPSHOT scm-core diff --git a/scm-dao-xml/pom.xml b/scm-dao-xml/pom.xml index 5424d38f26..dcb8b940b0 100644 --- a/scm-dao-xml/pom.xml +++ b/scm-dao-xml/pom.xml @@ -8,8 +8,7 @@ scm 2.0.0-SNAPSHOT - - sonia.scm + scm-dao-xml 2.0.0-SNAPSHOT scm-dao-xml diff --git a/scm-plugin-backend/pom.xml b/scm-plugin-backend/pom.xml index 1d3621b8ea..c3c62e7c8f 100644 --- a/scm-plugin-backend/pom.xml +++ b/scm-plugin-backend/pom.xml @@ -9,7 +9,6 @@ 1.55-SNAPSHOT - sonia.scm scm-plugin-backend war 1.55-SNAPSHOT diff --git a/scm-plugins/scm-git-plugin/pom.xml b/scm-plugins/scm-git-plugin/pom.xml index 7013c237cb..74d0120f90 100644 --- a/scm-plugins/scm-git-plugin/pom.xml +++ b/scm-plugins/scm-git-plugin/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.plugins scm-git-plugin 2.0.0-SNAPSHOT scm-git-plugin diff --git a/scm-plugins/scm-hg-plugin/pom.xml b/scm-plugins/scm-hg-plugin/pom.xml index 67b6b3e684..72a480d25b 100644 --- a/scm-plugins/scm-hg-plugin/pom.xml +++ b/scm-plugins/scm-hg-plugin/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.plugins scm-hg-plugin 2.0.0-SNAPSHOT scm-hg-plugin diff --git a/scm-plugins/scm-legacy-plugin/pom.xml b/scm-plugins/scm-legacy-plugin/pom.xml index 31d8422fbf..df623df6c4 100644 --- a/scm-plugins/scm-legacy-plugin/pom.xml +++ b/scm-plugins/scm-legacy-plugin/pom.xml @@ -6,7 +6,6 @@ scm-plugins 2.0.0-SNAPSHOT - sonia.scm.plugins scm-legacy-plugin 2.0.0-SNAPSHOT smp @@ -23,4 +22,4 @@ - \ No newline at end of file + diff --git a/scm-plugins/scm-svn-plugin/pom.xml b/scm-plugins/scm-svn-plugin/pom.xml index 9d37319394..1e607371d1 100644 --- a/scm-plugins/scm-svn-plugin/pom.xml +++ b/scm-plugins/scm-svn-plugin/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm.plugins scm-svn-plugin 2.0.0-SNAPSHOT scm-svn-plugin diff --git a/scm-server/pom.xml b/scm-server/pom.xml index 64172d6673..a20dbd5857 100644 --- a/scm-server/pom.xml +++ b/scm-server/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm scm-server 2.0.0-SNAPSHOT scm-server diff --git a/scm-test/pom.xml b/scm-test/pom.xml index 94948a830a..f9762d46f1 100644 --- a/scm-test/pom.xml +++ b/scm-test/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm scm-test 2.0.0-SNAPSHOT scm-test diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index c8b6572e92..0b2bcfe544 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -9,7 +9,6 @@ 2.0.0-SNAPSHOT - sonia.scm scm-webapp war 2.0.0-SNAPSHOT From c91b3a39cdf3a7dc2715389db64c2d8137e38b11 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:15:21 +0200 Subject: [PATCH 016/144] build: remove duplicated dependencies --- scm-plugins/scm-git-plugin/pom.xml | 18 ------------------ scm-plugins/scm-hg-plugin/pom.xml | 10 ---------- scm-plugins/scm-legacy-plugin/pom.xml | 13 ------------- scm-plugins/scm-svn-plugin/pom.xml | 18 ------------------ 4 files changed, 59 deletions(-) diff --git a/scm-plugins/scm-git-plugin/pom.xml b/scm-plugins/scm-git-plugin/pom.xml index 74d0120f90..c2e37510d8 100644 --- a/scm-plugins/scm-git-plugin/pom.xml +++ b/scm-plugins/scm-git-plugin/pom.xml @@ -17,14 +17,6 @@ Plugin for the version control system Git - - - javax.servlet - javax.servlet-api - ${servlet.version} - provided - - sonia.jgit org.eclipse.jgit @@ -48,16 +40,6 @@ commons-lang 2.6 - - - - - sonia.scm - scm-test - 2.0.0-SNAPSHOT - test - - diff --git a/scm-plugins/scm-hg-plugin/pom.xml b/scm-plugins/scm-hg-plugin/pom.xml index 72a480d25b..252d504552 100644 --- a/scm-plugins/scm-hg-plugin/pom.xml +++ b/scm-plugins/scm-hg-plugin/pom.xml @@ -29,16 +29,6 @@ - - - - - sonia.scm - scm-test - 2.0.0-SNAPSHOT - test - - diff --git a/scm-plugins/scm-legacy-plugin/pom.xml b/scm-plugins/scm-legacy-plugin/pom.xml index df623df6c4..2243e24258 100644 --- a/scm-plugins/scm-legacy-plugin/pom.xml +++ b/scm-plugins/scm-legacy-plugin/pom.xml @@ -9,17 +9,4 @@ scm-legacy-plugin 2.0.0-SNAPSHOT smp - - - - - - - javax.servlet - javax.servlet-api - ${servlet.version} - provided - - - diff --git a/scm-plugins/scm-svn-plugin/pom.xml b/scm-plugins/scm-svn-plugin/pom.xml index 1e607371d1..d0f93671af 100644 --- a/scm-plugins/scm-svn-plugin/pom.xml +++ b/scm-plugins/scm-svn-plugin/pom.xml @@ -17,14 +17,6 @@ Plugin for the version control system Subversion - - - javax.servlet - javax.servlet-api - ${servlet.version} - provided - - sonia.svnkit svnkit @@ -42,16 +34,6 @@ svnkit-dav ${svnkit.version} - - - - - sonia.scm - scm-test - 2.0.0-SNAPSHOT - test - - From efac49ccf76f99221440c15be476a91b64514b81 Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:16:54 +0200 Subject: [PATCH 017/144] style: use uppercase L instead of lowercase version for better readability --- .../sonia/scm/config/ScmConfiguration.java | 2 +- .../src/main/java/sonia/scm/util/Base32.java | 2 +- .../src/main/java/sonia/scm/util/Base62.java | 2 +- .../scm/net/ahc/ByteSourceContentTest.java | 4 +-- .../sonia/scm/net/ahc/FileContentTest.java | 2 +- .../java/sonia/scm/util/UrlBuilderTest.java | 2 +- .../scm/repository/spi/GitPullCommand.java | 2 +- .../repository/spi/GitPushCommandTest.java | 2 +- .../scm/repository/spi/SvnBlameCommand.java | 2 +- .../scm/repository/spi/SvnBundleCommand.java | 2 +- .../scm/repository/spi/SvnLogCommand.java | 6 ++--- .../repository/spi/SvnBundleCommandTest.java | 4 +-- .../spi/SvnUnbundleCommandTest.java | 4 +-- .../sonia/scm/user/UserManagerTestBase.java | 2 +- .../ConfigurableLoginAttemptHandler.java | 6 ++--- .../java/sonia/scm/cache/CacheTestBase.java | 12 ++++----- .../cache/GuavaConfigurationReaderTest.java | 26 +++++++++---------- .../sonia/scm/it/ChangesetViewerITCase.java | 2 +- .../sonia/scm/it/HttpCacheITCaseBase.java | 2 +- .../sonia/scm/security/BearerRealmTest.java | 2 +- .../ConfigurableLoginAttemptHandlerTest.java | 4 +-- .../security/JwtAccessTokenResolverTest.java | 4 +-- 22 files changed, 48 insertions(+), 48 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java index ac22c1403e..a136bb0b36 100644 --- a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java @@ -701,7 +701,7 @@ public class ScmConfiguration * @since 1.34 */ @XmlElement(name = "login-attempt-limit-timeout") - private long loginAttemptLimitTimeout = TimeUnit.MINUTES.toSeconds(5l); + private long loginAttemptLimitTimeout = TimeUnit.MINUTES.toSeconds(5L); /** Field description */ private boolean enableProxy = false; diff --git a/scm-core/src/main/java/sonia/scm/util/Base32.java b/scm-core/src/main/java/sonia/scm/util/Base32.java index cadbab3d8f..5ff3576078 100644 --- a/scm-core/src/main/java/sonia/scm/util/Base32.java +++ b/scm-core/src/main/java/sonia/scm/util/Base32.java @@ -46,7 +46,7 @@ public final class Base32 extends AbstractBase { /** base value */ - private static final BigInteger BASE = BigInteger.valueOf(32l); + private static final BigInteger BASE = BigInteger.valueOf(32L); /** char table */ private static final String CHARS = "0123456789bcdefghjkmnpqrstuvwxyz"; diff --git a/scm-core/src/main/java/sonia/scm/util/Base62.java b/scm-core/src/main/java/sonia/scm/util/Base62.java index 04fd1657d6..b9c9fd6a54 100644 --- a/scm-core/src/main/java/sonia/scm/util/Base62.java +++ b/scm-core/src/main/java/sonia/scm/util/Base62.java @@ -46,7 +46,7 @@ public final class Base62 extends AbstractBase { /** base value */ - private static final BigInteger BASE = BigInteger.valueOf(62l); + private static final BigInteger BASE = BigInteger.valueOf(62L); /** char table */ private static final String CHARS = diff --git a/scm-core/src/test/java/sonia/scm/net/ahc/ByteSourceContentTest.java b/scm-core/src/test/java/sonia/scm/net/ahc/ByteSourceContentTest.java index 24487f6582..bd2eaf364b 100644 --- a/scm-core/src/test/java/sonia/scm/net/ahc/ByteSourceContentTest.java +++ b/scm-core/src/test/java/sonia/scm/net/ahc/ByteSourceContentTest.java @@ -58,7 +58,7 @@ public class ByteSourceContentTest { ByteSource source = ByteSource.wrap("abc".getBytes(Charsets.UTF_8)); ByteSourceContent content = new ByteSourceContent(source); content.prepare(request); - verify(request).contentLength(3l); + verify(request).contentLength(3L); } @Test @@ -71,4 +71,4 @@ public class ByteSourceContentTest { assertEquals("abc", baos.toString("UTF-8")); } -} \ No newline at end of file +} diff --git a/scm-core/src/test/java/sonia/scm/net/ahc/FileContentTest.java b/scm-core/src/test/java/sonia/scm/net/ahc/FileContentTest.java index 95b381b880..963ef86531 100644 --- a/scm-core/src/test/java/sonia/scm/net/ahc/FileContentTest.java +++ b/scm-core/src/test/java/sonia/scm/net/ahc/FileContentTest.java @@ -76,7 +76,7 @@ public class FileContentTest FileContent content = create("abc"); content.prepare(request); - verify(request).contentLength(3l); + verify(request).contentLength(3L); } /** diff --git a/scm-core/src/test/java/sonia/scm/util/UrlBuilderTest.java b/scm-core/src/test/java/sonia/scm/util/UrlBuilderTest.java index 16d4b59ffc..eb0af7926c 100644 --- a/scm-core/src/test/java/sonia/scm/util/UrlBuilderTest.java +++ b/scm-core/src/test/java/sonia/scm/util/UrlBuilderTest.java @@ -56,7 +56,7 @@ public class UrlBuilderTest UrlBuilder builder = new UrlBuilder("http://www.short.de"); builder.appendParameter("i", 123).appendParameter("s", "abc"); - builder.appendParameter("b", true).appendParameter("l", 321l); + builder.appendParameter("b", true).appendParameter("l", 321L); assertEquals("http://www.short.de?i=123&s=abc&b=true&l=321", builder.toString()); builder.appendParameter("c", "a b"); assertEquals("http://www.short.de?i=123&s=abc&b=true&l=321&c=a%20b", builder.toString()); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java index ec0f468a57..8ed1c4b3d3 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java @@ -145,7 +145,7 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand private PullResponse convert(Git git, FetchResult fetch) throws RepositoryException { - long counter = 0l; + long counter = 0L; for (TrackingRefUpdate tru : fetch.getTrackingRefUpdates()) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java index bf82193e84..0eb23572fc 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java @@ -86,7 +86,7 @@ public class GitPushCommandTest extends AbstractRemoteCommandTestBase PushResponse response = cmd.push(request); assertNotNull(response); - assertEquals(2l, response.getChangesetCount()); + assertEquals(2L, response.getChangesetCount()); Iterator commits = incoming.log().call().iterator(); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java index 9c059d0ea5..329f2672e1 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java @@ -120,7 +120,7 @@ public class SvnBlameCommand extends AbstractSvnCommand implements BlameCommand SVNLogClient svnLogClient = new SVNLogClient(svnManager, null); svnLogClient.doAnnotate(svnurl, SVNRevision.UNDEFINED, - SVNRevision.create(1l), endRevision, + SVNRevision.create(1L), endRevision, new SvnBlameHandler(svnRepository, path, blameLines)); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java index af9dbe5fda..f0811c2c74 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java @@ -98,7 +98,7 @@ public class SvnBundleCommand extends AbstractSvnCommand try { outputStream = target.openBufferedStream(); - adminClient.doDump(repository, outputStream, SVNRevision.create(-1l), + adminClient.doDump(repository, outputStream, SVNRevision.create(-1L), SVNRevision.HEAD, false, false); } finally diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java index b1024ec5b4..41b44415a3 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java @@ -203,7 +203,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand */ private long parseRevision(String v) throws RepositoryException { - long result = -1l; + long result = -1L; if (!Strings.isNullOrEmpty(v)) { @@ -252,7 +252,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand new ChangesetCollector(changesets)); } - return new ChangesetPagingResult((int) (latest + 1l), changesets); + return new ChangesetPagingResult((int) (latest + 1L), changesets); } /** @@ -279,7 +279,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand long endRev = Math.max(endRevision, 0); long maxRev = repo.getLatestRevision(); - if (startRevision >= 0l) + if (startRevision >= 0L) { startRev = startRevision; } diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java index 57fde186cf..88e3eddf02 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java @@ -78,9 +78,9 @@ public class SvnBundleCommandTest extends AbstractSvnCommandTestBase repository).bundle(req); assertThat(res, notNullValue()); - assertThat(res.getChangesetCount(), is(5l)); + assertThat(res.getChangesetCount(), is(5L)); assertTrue("file does not exists", file.exists()); - assertThat(file.length(), greaterThan(0l)); + assertThat(file.length(), greaterThan(0L)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java index 2c59797296..d0142151a1 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java @@ -87,11 +87,11 @@ public class SvnUnbundleCommandTest extends AbstractSvnCommandTestBase //J+ assertThat(res, notNullValue()); - assertThat(res.getChangesetCount(), is(5l)); + assertThat(res.getChangesetCount(), is(5L)); SVNRepository repo = ctx.open(); - assertThat(repo.getLatestRevision(), is(5l)); + assertThat(repo.getLatestRevision(), is(5L)); SvnUtil.closeSession(repo); } diff --git a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java index 054ef892ea..e86edaba56 100644 --- a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java @@ -301,7 +301,7 @@ public abstract class UserManagerTestBase while (!fin) { - Thread.sleep(100l); + Thread.sleep(100L); fin = true; for (MultiThreadTester tester : testers) diff --git a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java index 39c3c64d5d..304c8ead13 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java +++ b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java @@ -153,7 +153,7 @@ public class ConfigurableLoginAttemptHandler implements LoginAttemptHandler { } private boolean isEnabled() { - return (configuration.getLoginAttemptLimit() > 0) && (configuration.getLoginAttemptLimitTimeout() > 0l); + return (configuration.getLoginAttemptLimit() > 0) && (configuration.getLoginAttemptLimitTimeout() > 0L); } //~--- inner classes -------------------------------------------------------- @@ -161,7 +161,7 @@ public class ConfigurableLoginAttemptHandler implements LoginAttemptHandler { private static class LoginAttempt { private int counter = 0; - private long lastAttempt = -1l; + private long lastAttempt = -1L; synchronized void increase() { counter++; @@ -169,7 +169,7 @@ public class ConfigurableLoginAttemptHandler implements LoginAttemptHandler { } synchronized void reset() { - lastAttempt = -1l; + lastAttempt = -1L; counter = 0; } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java index 8a8a016146..f0396741aa 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java @@ -177,8 +177,8 @@ public abstract class CacheTestBase // skip test if implementation does not support stats Assume.assumeTrue( stats != null ); assertEquals("test", stats.getName()); - assertEquals(0l, stats.getHitCount()); - assertEquals(0l, stats.getMissCount()); + assertEquals(0L, stats.getHitCount()); + assertEquals(0L, stats.getMissCount()); cache.put("test-1", "test123"); cache.put("test-2", "test456"); cache.get("test-1"); @@ -186,11 +186,11 @@ public abstract class CacheTestBase cache.get("test-1"); cache.get("test-3"); // check that stats have not changed - assertEquals(0l, stats.getHitCount()); - assertEquals(0l, stats.getMissCount()); + assertEquals(0L, stats.getHitCount()); + assertEquals(0L, stats.getMissCount()); stats = cache.getStatistics(); - assertEquals(3l, stats.getHitCount()); - assertEquals(1l, stats.getMissCount()); + assertEquals(3L, stats.getHitCount()); + assertEquals(1L, stats.getMissCount()); assertEquals(0.75d, stats.getHitRate(), 0.0d); assertEquals(0.25d, stats.getMissRate(), 0.0d); } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/GuavaConfigurationReaderTest.java b/scm-webapp/src/test/java/sonia/scm/cache/GuavaConfigurationReaderTest.java index 7f7be94203..ff8b59cfc3 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/GuavaConfigurationReaderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/GuavaConfigurationReaderTest.java @@ -63,7 +63,7 @@ public class GuavaConfigurationReaderTest GuavaCacheConfiguration cfg = readConfiguration("gcache.001.xml").getDefaultCache(); - assertCacheValues(cfg, 200l, 1200l, 2400l); + assertCacheValues(cfg, 200L, 1200L, 2400L); } /** @@ -82,10 +82,10 @@ public class GuavaConfigurationReaderTest //J+ // cache sonia.test.cache.001 override by cache.004.xml - assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 6l, 2l, 8l); - assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000l, 120l, 60l); - assertCacheValues(getCache(gcm, "sonia.test.cache.003"), 3000l, 120l, - 2400l); + assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 6L, 2L, 8L); + assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000L, 120L, 60L); + assertCacheValues(getCache(gcm, "sonia.test.cache.003"), 3000L, 120L, + 2400L); } /** @@ -100,8 +100,8 @@ public class GuavaConfigurationReaderTest // check default - assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 1000l, 60l, 30l); - assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000l, 120l, 60l); + assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 1000L, 60L, 30L); + assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000L, 120L, 60L); } /** @@ -115,10 +115,10 @@ public class GuavaConfigurationReaderTest Iterators.forArray("gcache.002.xml", "gcache.003.xml")); - assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 1000l, 60l, 30l); - assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000l, 120l, 60l); - assertCacheValues(getCache(gcm, "sonia.test.cache.003"), 3000l, 120l, - 2400l); + assertCacheValues(getCache(gcm, "sonia.test.cache.001"), 1000L, 60L, 30L); + assertCacheValues(getCache(gcm, "sonia.test.cache.002"), 1000L, 120L, 60L); + assertCacheValues(getCache(gcm, "sonia.test.cache.003"), 3000L, 120L, + 2400L); } /** @@ -131,7 +131,7 @@ public class GuavaConfigurationReaderTest GuavaCacheConfiguration cfg = readConfiguration("gcache.001.xml").getCaches().get(0); - assertCacheValues(cfg, 1000l, 60l, 30l); + assertCacheValues(cfg, 1000L, 60L, 30L); } /** @@ -144,7 +144,7 @@ public class GuavaConfigurationReaderTest GuavaCacheConfiguration cfg = readConfiguration("gcache.002.xml").getCaches().get(0); - assertCacheValues(cfg, 1000l, 120l, 60l); + assertCacheValues(cfg, 1000L, 120L, 60L); } /** diff --git a/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java b/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java index 816f86fe52..53601dab8c 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java @@ -193,7 +193,7 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase if (sleep) { // cache clear is async - Thread.sleep(500l); + Thread.sleep(500L); } ChangesetPagingResult cpr = getChangesets(repository); diff --git a/scm-webapp/src/test/java/sonia/scm/it/HttpCacheITCaseBase.java b/scm-webapp/src/test/java/sonia/scm/it/HttpCacheITCaseBase.java index e3727a468d..ccd0a0d4f0 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/HttpCacheITCaseBase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/HttpCacheITCaseBase.java @@ -122,7 +122,7 @@ public abstract class HttpCacheITCaseBase long lastModified = getLastModified(response); // wait 1 second because http date is not millisecond precision - Thread.sleep(1000l); + Thread.sleep(1000L); item = createSampleItem(); response = getCollectionResponse(); diff --git a/scm-webapp/src/test/java/sonia/scm/security/BearerRealmTest.java b/scm-webapp/src/test/java/sonia/scm/security/BearerRealmTest.java index 9f54eb6518..ce10494f68 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/BearerRealmTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/BearerRealmTest.java @@ -188,7 +188,7 @@ public class BearerRealmTest resolveKey(key); - Date exp = new Date(System.currentTimeMillis() - 600l); + Date exp = new Date(System.currentTimeMillis() - 600L); String compact = createCompactToken(trillian.getName(), key, exp, Scope.empty()); realm.doGetAuthenticationInfo(BearerToken.valueOf(compact)); diff --git a/scm-webapp/src/test/java/sonia/scm/security/ConfigurableLoginAttemptHandlerTest.java b/scm-webapp/src/test/java/sonia/scm/security/ConfigurableLoginAttemptHandlerTest.java index 714438b8fe..01c4766396 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/ConfigurableLoginAttemptHandlerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/ConfigurableLoginAttemptHandlerTest.java @@ -74,7 +74,7 @@ public class ConfigurableLoginAttemptHandlerTest { handler.onUnsuccessfulAuthentication(token, new SimpleAuthenticationInfo()); handler.beforeAuthentication(token); handler.onUnsuccessfulAuthentication(token, new SimpleAuthenticationInfo()); - Thread.sleep(TimeUnit.MILLISECONDS.toMillis(1200l)); + Thread.sleep(TimeUnit.MILLISECONDS.toMillis(1200L)); handler.beforeAuthentication(token); } @@ -111,4 +111,4 @@ public class ConfigurableLoginAttemptHandlerTest { return new ConfigurableLoginAttemptHandler(configuration); } -} \ No newline at end of file +} diff --git a/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenResolverTest.java b/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenResolverTest.java index b7fd897559..2c1b0a34ec 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenResolverTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenResolverTest.java @@ -132,7 +132,7 @@ public class JwtAccessTokenResolverTest { resolveKey(secureKey); // create expired token - Date exp = new Date(System.currentTimeMillis() - 600l); + Date exp = new Date(System.currentTimeMillis() - 600L); String compact = createCompactToken("trillian", secureKey, exp, Scope.empty()); // expect exception @@ -236,4 +236,4 @@ public class JwtAccessTokenResolverTest { } -} \ No newline at end of file +} From 656288857b20b90fc156b1baf68769fad5a4e2ad Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:17:39 +0200 Subject: [PATCH 018/144] refactor: remove redundant type arguments --- .../src/main/java/sonia/scm/repository/HealthCheckResult.java | 2 +- .../sonia/scm/api/rest/resources/RepositoryImportResource.java | 2 +- .../java/sonia/scm/repository/DefaultRepositoryManagerTest.java | 2 +- .../test/java/sonia/scm/repository/RepositoryMatcherTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java index f5cb690533..88350eaa1e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java @@ -51,7 +51,7 @@ public final class HealthCheckResult /** healthy result */ private static final HealthCheckResult HEALTHY = - new HealthCheckResult(ImmutableSet.of()); + new HealthCheckResult(ImmutableSet.of()); //~--- constructors --------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java index 8b52d693ed..b7b6e0f826 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java @@ -419,7 +419,7 @@ public class RepositoryImportResource { logger.debug("start directory import, using normal import handler"); result = new ImportResult(importHandler.importRepositories(manager), - ImmutableList.of()); + ImmutableList.of()); } response = Response.ok(result).build(); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 5b7c3f2ae7..d3938009aa 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -568,7 +568,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBaseemptySet()); + return new RepositoryMatcher(Collections.emptySet()); } private Repository createRepository(Repository repository) throws RepositoryException, IOException { diff --git a/scm-webapp/src/test/java/sonia/scm/repository/RepositoryMatcherTest.java b/scm-webapp/src/test/java/sonia/scm/repository/RepositoryMatcherTest.java index c832bb8691..d3054b77e4 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/RepositoryMatcherTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/RepositoryMatcherTest.java @@ -48,7 +48,7 @@ public class RepositoryMatcherTest { @Before public void setUp() { - Set pathMatchers = Sets.newHashSet(new AbcRepositoryPathMatcher()); + Set pathMatchers = Sets.newHashSet(new AbcRepositoryPathMatcher()); this.matcher = new RepositoryMatcher(pathMatchers); } From 96f40485d13b13e69edd668de62aa3e4abe75edf Mon Sep 17 00:00:00 2001 From: broDom Date: Mon, 3 Jul 2017 17:17:58 +0200 Subject: [PATCH 019/144] refactor: remove redundant type casts --- .../src/main/java/sonia/scm/util/IOUtil.java | 2 +- .../java/sonia/scm/plugin/ScmModuleTest.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/util/IOUtil.java b/scm-core/src/main/java/sonia/scm/util/IOUtil.java index 51c67b0b7d..49807104c7 100644 --- a/scm-core/src/main/java/sonia/scm/util/IOUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/IOUtil.java @@ -229,7 +229,7 @@ public final class IOUtil while (byteCount > 0) { int max = (byteCount < bufferSize) - ? (int) byteCount + ? byteCount : bufferSize; len = in.read(buffer, 0, max); diff --git a/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java b/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java index 45c490d15e..1629562132 100644 --- a/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java +++ b/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java @@ -71,8 +71,8 @@ public class ScmModuleTest assertThat( module.getExtensions(), containsInAnyOrder( - (Class) String.class, - (Class) Integer.class + String.class, + Integer.class ) ); assertThat( @@ -86,8 +86,8 @@ public class ScmModuleTest assertThat( module.getEvents(), containsInAnyOrder( - (Class) String.class, - (Class) Boolean.class + String.class, + Boolean.class ) ); assertThat( @@ -100,15 +100,15 @@ public class ScmModuleTest assertThat( module.getRestProviders(), containsInAnyOrder( - (Class) Integer.class, - (Class) Long.class + Integer.class, + Long.class ) ); assertThat( module.getRestResources(), containsInAnyOrder( - (Class) Float.class, - (Class) Double.class + Float.class, + Double.class ) ); //J+ From 056c384c3951f2648952a8b80ecce00075609019 Mon Sep 17 00:00:00 2001 From: broDom Date: Wed, 5 Jul 2017 18:23:32 +0200 Subject: [PATCH 020/144] refactor: use Stream API in ValidationUtil.isRepoNameValid --- .../java/sonia/scm/util/ValidationUtil.java | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java index 621b704664..c53bb0bbb7 100644 --- a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java @@ -37,7 +37,9 @@ import com.google.common.base.Splitter; import sonia.scm.Validateable; import java.util.Arrays; +import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.StreamSupport; /** * @@ -58,6 +60,7 @@ public final class ValidationUtil private static final String REGEX_REPOSITORYNAME = "(?!^\\.\\.$)(?!^\\.$)(?!.*[\\\\\\[\\]])^[A-z0-9\\.][A-z0-9\\.\\-_/]*$"; + private static final Pattern REPO_NAME_REGEX = Pattern.compile(REGEX_REPOSITORYNAME); //~--- constructors --------------------------------------------------------- /** @@ -130,29 +133,10 @@ public final class ValidationUtil * * @return */ - public static boolean isRepositoryNameValid(String name) - { - Pattern pattern = Pattern.compile(REGEX_REPOSITORYNAME); - boolean result = true; - - if (Util.isNotEmpty(name)) - { - for (String p : Splitter.on('/').split(name)) - { - if (!pattern.matcher(p).matches()) - { - result = false; - - break; - } - } - } - else - { - result = false; - } - - return result; + public static boolean isRepositoryNameValid(String name) { + return Util.isNotEmpty(name) && StreamSupport.stream(Splitter.on('/').split(name).spliterator(), false) + .map(REPO_NAME_REGEX::matcher) + .allMatch(Matcher::matches); } /** From d7b539ba10161b56012cef840e6f37e90741f45a Mon Sep 17 00:00:00 2001 From: broDom Date: Wed, 5 Jul 2017 21:01:39 +0200 Subject: [PATCH 021/144] build: update guava (16 -> 22) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7f377a7f18..3ef98ec8d1 100644 --- a/pom.xml +++ b/pom.xml @@ -501,7 +501,7 @@ 1.8.15-scm1 - 16.0.1 + 22.0 2.2.3 From 1da3c7436c649be3c499cc8144e13676c114df89 Mon Sep 17 00:00:00 2001 From: broDom Date: Wed, 5 Jul 2017 21:02:17 +0200 Subject: [PATCH 022/144] refactor: replace StreamSupport.stream(spliterator, false) with Guava's Stream.stream(iterable) --- .../scm/repository/api/HookChangesetBuilder.java | 10 +++++----- .../src/main/java/sonia/scm/util/ValidationUtil.java | 8 ++++---- .../main/java/sonia/scm/web/GitRepositoryViewer.java | 11 +++++------ .../java/sonia/scm/plugin/PluginProcessorTest.java | 10 +++++----- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java index bdf5e13d60..fb3900445e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/HookChangesetBuilder.java @@ -33,8 +33,8 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Streams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.io.DeepCopy; @@ -46,8 +46,8 @@ import sonia.scm.repository.spi.HookChangesetRequest; import java.io.IOException; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.StreamSupport; //~--- JDK imports ------------------------------------------------------------ @@ -135,9 +135,9 @@ public final class HookChangesetBuilder return copy; }; - changesets = StreamSupport.stream(changesets.spliterator(), false) - .map(changesetFunction::apply) - .collect(Collectors.toList()); + changesets = Streams.stream(changesets) + .map(changesetFunction::apply) + .collect(Collectors.toList()); } return changesets; diff --git a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java index c53bb0bbb7..2f1fb4bb04 100644 --- a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java @@ -34,12 +34,12 @@ package sonia.scm.util; import com.google.common.base.Splitter; +import com.google.common.collect.Streams; import sonia.scm.Validateable; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.StreamSupport; /** * @@ -134,9 +134,9 @@ public final class ValidationUtil * @return */ public static boolean isRepositoryNameValid(String name) { - return Util.isNotEmpty(name) && StreamSupport.stream(Splitter.on('/').split(name).spliterator(), false) - .map(REPO_NAME_REGEX::matcher) - .allMatch(Matcher::matches); + return Util.isNotEmpty(name) && Streams.stream(Splitter.on('/').split(name)) + .map(REPO_NAME_REGEX::matcher) + .allMatch(Matcher::matches); } /** diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java index 18f4d5baaa..74cb228663 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java @@ -38,6 +38,7 @@ package sonia.scm.web; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.common.collect.Streams; import com.google.common.io.Closeables; import com.google.inject.Inject; import org.slf4j.Logger; @@ -62,7 +63,6 @@ import java.io.Writer; import java.util.Date; import java.util.Iterator; import java.util.stream.Collectors; -import java.util.stream.StreamSupport; //~--- JDK imports ------------------------------------------------------------ @@ -301,11 +301,10 @@ public class GitRepositoryViewer .setBranch(name) .setPagingLimit(CHANGESET_PER_BRANCH) .getChangesets(); - - Iterable changesets = - StreamSupport.stream(cpr.spliterator(), false) - .map(ChangesetModel::new) - .collect(Collectors.toList()); + + Iterable changesets = Streams.stream(cpr) + .map(ChangesetModel::new) + .collect(Collectors.toList()); //J+ model = new BranchModel(name, changesets); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java index a78a8acba9..42e54b4e59 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java @@ -35,6 +35,7 @@ package sonia.scm.plugin; import com.google.common.base.Charsets; import com.google.common.collect.Iterables; +import com.google.common.collect.Streams; import com.google.common.io.Resources; import org.junit.Before; import org.junit.Rule; @@ -48,7 +49,6 @@ import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Set; -import java.util.stream.StreamSupport; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -366,10 +366,10 @@ public class PluginProcessorTest private PluginWrapper findPlugin(Iterable plugin, final String id) { - return StreamSupport.stream(plugin.spliterator(), false) - .filter(input -> id.equals(input.getId())) - .findFirst() - .orElse(null); + return Streams.stream(plugin) + .filter(input -> id.equals(input.getId())) + .findFirst() + .orElse(null); } //~--- inner classes -------------------------------------------------------- From 46f5002f29ffeca07c8c2bba8ba8a0b665d23d9a Mon Sep 17 00:00:00 2001 From: broDom Date: Wed, 5 Jul 2017 21:23:28 +0200 Subject: [PATCH 023/144] refactor: replace removed Guava API calls --- .../java/sonia/scm/cache/CacheStatistics.java | 11 ++--- .../sonia/scm/event/AbstractHandlerEvent.java | 11 ++--- .../src/main/java/sonia/scm/group/Group.java | 29 ++++++------- .../java/sonia/scm/plugin/ClassElement.java | 9 ++-- .../scm/plugin/ExtensionPointElement.java | 13 +++--- .../main/java/sonia/scm/plugin/Plugin.java | 26 +++++------ .../sonia/scm/plugin/PluginCondition.java | 11 ++--- .../sonia/scm/plugin/PluginInformation.java | 43 ++++++++----------- .../sonia/scm/plugin/PluginRepository.java | 11 +++-- .../sonia/scm/plugin/PluginResources.java | 16 +++---- .../sonia/scm/plugin/SubscriberElement.java | 11 ++--- .../java/sonia/scm/repository/BlameLine.java | 17 ++++---- .../sonia/scm/repository/BlameResult.java | 19 +++----- .../java/sonia/scm/repository/Branch.java | 16 +++---- .../java/sonia/scm/repository/Branches.java | 15 ++++--- .../sonia/scm/repository/BrowserResult.java | 23 ++++------ .../scm/repository/ChangesetPagingResult.java | 19 +++----- .../java/sonia/scm/repository/FileObject.java | 27 ++++++------ .../scm/repository/HealthCheckFailure.java | 13 +++--- .../scm/repository/HealthCheckResult.java | 3 +- .../sonia/scm/repository/ImportResult.java | 19 ++++---- .../java/sonia/scm/repository/Permission.java | 19 ++++---- .../java/sonia/scm/repository/Repository.java | 39 ++++++++--------- .../sonia/scm/repository/SubRepository.java | 18 ++++---- .../main/java/sonia/scm/repository/Tag.java | 9 ++-- .../main/java/sonia/scm/repository/Tags.java | 16 +++---- ...stractBundleOrUnbundleCommandResponse.java | 7 +-- .../repository/spi/BrowseCommandRequest.java | 15 ++++--- .../spi/FileBaseCommandRequest.java | 9 ++-- .../scm/repository/spi/LogCommandRequest.java | 17 ++++---- .../spi/PagedRemoteCommandRequest.java | 11 ++--- .../repository/spi/RemoteCommandRequest.java | 9 ++-- .../scm/security/AssignedPermission.java | 18 ++++---- .../sonia/scm/security/DAORealmHelper.java | 15 ++----- .../scm/security/PermissionDescriptor.java | 18 ++++---- .../scm/security/RepositoryPermission.java | 9 ++-- .../StoredAssignedPermissionEvent.java | 16 +++---- .../src/main/java/sonia/scm/user/User.java | 33 +++++++------- .../main/java/sonia/scm/util/HttpUtil.java | 15 +++---- .../main/java/sonia/scm/web/UserAgent.java | 17 ++++---- .../scm/web/proxy/ProxyConfiguration.java | 27 +++++------- .../sonia/scm/repository/HgHookManager.java | 4 +- .../java/sonia/scm/repository/HgVersion.java | 9 ++-- .../repository/client/spi/CommitRequest.java | 9 ++-- .../scm/repository/client/spi/TagRequest.java | 9 ++-- .../main/java/sonia/scm/ClassOverride.java | 9 ++-- .../java/sonia/scm/api/rest/Permission.java | 16 +++---- .../scm/api/rest/RestExceptionResult.java | 9 ++-- .../resources/RepositoryImportResource.java | 9 ++-- .../sonia/scm/cache/CacheConfigurations.java | 3 +- .../scm/cache/GuavaCacheConfiguration.java | 35 ++++++++------- .../ConfigurableLoginAttemptHandler.java | 19 ++++---- .../cache/CacheConfigurationTestLoader.java | 3 +- .../selenium/page/RepositoriesAddPage.java | 13 +++--- 54 files changed, 410 insertions(+), 436 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java index 067e623e6d..3507763820 100644 --- a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java +++ b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java @@ -33,6 +33,7 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -101,11 +102,11 @@ public final class CacheStatistics public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("hitCount", hitCount) - .add("missCount", missCount) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("hitCount", hitCount) + .add("missCount", missCount) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java b/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java index 5efbf118ba..f828af9635 100644 --- a/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java +++ b/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java @@ -33,6 +33,7 @@ package sonia.scm.event; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import sonia.scm.HandlerEventType; @@ -127,11 +128,11 @@ public class AbstractHandlerEvent implements HandlerEvent public String toString() { //J- - return Objects.toStringHelper(this) - .add("eventType", eventType) - .add("item", item) - .add("oldItem", oldItem) - .toString(); + return MoreObjects.toStringHelper(this) + .add("eventType", eventType) + .add("item", item) + .add("oldItem", oldItem) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/group/Group.java b/scm-core/src/main/java/sonia/scm/group/Group.java index 8bffc22260..cb1e4e9cda 100644 --- a/scm-core/src/main/java/sonia/scm/group/Group.java +++ b/scm-core/src/main/java/sonia/scm/group/Group.java @@ -37,23 +37,22 @@ package sonia.scm.group; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; - import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; import java.util.Arrays; import java.util.Iterator; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * Organizes users into a group for easier permissions management. @@ -274,15 +273,15 @@ public class Group extends BasicPropertiesAware public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("description", description) - .add("members", members) - .add("type", type) - .add("creationDate", creationDate) - .add("lastModified", lastModified) - .add("properties", properties) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("description", description) + .add("members", members) + .add("type", type) + .add("creationDate", creationDate) + .add("lastModified", lastModified) + .add("properties", properties) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java b/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java index 8f931e5599..1b43a41ad6 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java @@ -33,6 +33,7 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -117,10 +118,10 @@ public final class ClassElement public String toString() { //J- - return Objects.toStringHelper(this) - .add("clazz", clazz) - .add("description", description) - .toString(); + return MoreObjects.toStringHelper(this) + .add("clazz", clazz) + .add("description", description) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java index 25b8fe303a..eda91d4e6f 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java @@ -33,6 +33,7 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -129,12 +130,12 @@ public final class ExtensionPointElement public String toString() { //J- - return Objects.toStringHelper(this) - .add("class", clazz) - .add("description", description) - .add("multiple", multiple) - .add("autoBind", autoBind) - .toString(); + return MoreObjects.toStringHelper(this) + .add("class", clazz) + .add("description", description) + .add("multiple", multiple) + .add("autoBind", autoBind) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/Plugin.java b/scm-core/src/main/java/sonia/scm/plugin/Plugin.java index d55555e747..438ca2184c 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/Plugin.java +++ b/scm-core/src/main/java/sonia/scm/plugin/Plugin.java @@ -35,18 +35,14 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableSet; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.util.Set; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -142,14 +138,14 @@ public final class Plugin extends ScmModule public String toString() { //J- - return Objects.toStringHelper(this) - .add("scmVersion", scmVersion) - .add("condition", condition) - .add("information", information) - .add("resources", resources) - .add("childFirstClassLoader", childFirstClassLoader) - .add("dependencies", dependencies) - .toString(); + return MoreObjects.toStringHelper(this) + .add("scmVersion", scmVersion) + .add("condition", condition) + .add("information", information) + .add("resources", resources) + .add("childFirstClassLoader", childFirstClassLoader) + .add("dependencies", dependencies) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java index 2a5dfcee8c..fb03b66351 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java @@ -35,6 +35,7 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import sonia.scm.PlatformType; import sonia.scm.SCMContext; @@ -157,11 +158,11 @@ public class PluginCondition implements Cloneable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("arch", arch) - .add("minVersion", minVersion) - .add("os", os) - .toString(); + return MoreObjects.toStringHelper(this) + .add("arch", arch) + .add("minVersion", minVersion) + .add("os", os) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java index 4fffdd8572..cab5245f6a 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java @@ -37,24 +37,17 @@ package sonia.scm.plugin; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; - +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.Validateable; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.io.Serializable; - import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -180,21 +173,21 @@ public class PluginInformation public String toString() { //J- - return Objects.toStringHelper(this) - .add("artifactId", artifactId) - .add("author", author) - .add("category", category) - .add("tags", tags) - .add("condition", condition) - .add("description", description) - .add("groupId", groupId) - .add("name", name) - .add("screenshots", screenshots) - .add("state", state) - .add("url", url) - .add("version", version) - .add("wiki", wiki) - .toString(); + return MoreObjects.toStringHelper(this) + .add("artifactId", artifactId) + .add("author", author) + .add("category", category) + .add("tags", tags) + .add("condition", condition) + .add("description", description) + .add("groupId", groupId) + .add("name", name) + .add("screenshots", screenshots) + .add("state", state) + .add("url", url) + .add("version", version) + .add("wiki", wiki) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java b/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java index c546788d09..c75e555d9f 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java @@ -35,12 +35,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -121,8 +122,10 @@ public class PluginRepository implements Serializable @Override public String toString() { - return Objects.toStringHelper(this).add("id", id).add("url", - url).toString(); + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("url", url) + .toString(); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java b/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java index b039c291f5..c6c8b3aead 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java @@ -35,15 +35,15 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Set; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -124,10 +124,10 @@ public class PluginResources public String toString() { //J- - return Objects.toStringHelper(this) - .add("scriptResources", scriptResources) - .add("stylesheetResources", stylesheetResources) - .toString(); + return MoreObjects.toStringHelper(this) + .add("scriptResources", scriptResources) + .add("stylesheetResources", stylesheetResources) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java b/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java index 44c3d6edd2..75c83003ce 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java @@ -33,6 +33,7 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -126,11 +127,11 @@ public final class SubscriberElement public String toString() { //J- - return Objects.toStringHelper(this) - .add("eventClass", eventClass) - .add("subscriberClass", subscriberClass) - .add("description", description) - .toString(); + return MoreObjects.toStringHelper(this) + .add("eventClass", eventClass) + .add("subscriberClass", subscriberClass) + .add("description", description) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/BlameLine.java b/scm-core/src/main/java/sonia/scm/repository/BlameLine.java index ff23ca8fd3..771450874c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/BlameLine.java +++ b/scm-core/src/main/java/sonia/scm/repository/BlameLine.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -140,14 +141,14 @@ public class BlameLine implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("lineNumber", lineNumber) - .add("revision", revision) - .add("author", author) - .add("when", when) - .add("code", code) - .add("description", description) - .toString(); + return MoreObjects.toStringHelper(this) + .add("lineNumber", lineNumber) + .add("revision", revision) + .add("author", author) + .add("when", when) + .add("code", code) + .add("description", description) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/BlameResult.java b/scm-core/src/main/java/sonia/scm/repository/BlameResult.java index 4a06de575c..c282aa92d1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/BlameResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/BlameResult.java @@ -35,21 +35,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.io.Serializable; - import java.util.Iterator; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * Changeset information by line for a given file. @@ -163,10 +158,10 @@ public class BlameResult implements Serializable, Iterable public String toString() { //J- - return Objects.toStringHelper(this) - .add("total", total) - .add("blameLines", blameLines) - .toString(); + return MoreObjects.toStringHelper(this) + .add("total", total) + .add("blameLines", blameLines) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/Branch.java b/scm-core/src/main/java/sonia/scm/repository/Branch.java index 3e610812ff..ca64085077 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Branch.java +++ b/scm-core/src/main/java/sonia/scm/repository/Branch.java @@ -35,15 +35,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents a branch in a repository. @@ -132,10 +132,10 @@ public final class Branch implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("revision", revision) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("revision", revision) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/Branches.java b/scm-core/src/main/java/sonia/scm/repository/Branches.java index f2f7de1a2a..c0dc88943c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Branches.java +++ b/scm-core/src/main/java/sonia/scm/repository/Branches.java @@ -34,17 +34,18 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Iterator; -import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents all branches of a repository. @@ -148,9 +149,9 @@ public final class Branches implements Iterable public String toString() { //J- - return Objects.toStringHelper(this) - .add("branches", branches) - .toString(); + return MoreObjects.toStringHelper(this) + .add("branches", branches) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java index 7880b58f11..7b7944b0d1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java @@ -35,20 +35,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.io.Serializable; - import java.util.Iterator; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -161,12 +156,12 @@ public class BrowserResult implements Iterable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("revision", revision) - .add("tag", tag) - .add("branch", branch) - .add("files", files) - .toString(); + return MoreObjects.toStringHelper(this) + .add("revision", revision) + .add("tag", tag) + .add("branch", branch) + .add("files", files) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java b/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java index 0712ed40af..df261fbd46 100644 --- a/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java @@ -35,20 +35,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.io.Serializable; - import java.util.Iterator; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * The changeset paging result is used to do a paging over the @@ -156,10 +151,10 @@ public class ChangesetPagingResult implements Iterable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("changesets", changesets) - .add("total", total) - .toString(); + return MoreObjects.toStringHelper(this) + .add("changesets", changesets) + .add("total", total) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/FileObject.java b/scm-core/src/main/java/sonia/scm/repository/FileObject.java index c5c4366a0e..9e2e9e5ff1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/FileObject.java +++ b/scm-core/src/main/java/sonia/scm/repository/FileObject.java @@ -35,18 +35,17 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.LastModifiedAware; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * The FileObject represents a file or a directory in a repository. @@ -110,15 +109,15 @@ public class FileObject implements LastModifiedAware, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("path", path) - .add("directory", directory) - .add("description", description) - .add("length", length) - .add("subRepository", subRepository) - .add("lastModified", lastModified) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("path", path) + .add("directory", directory) + .add("description", description) + .add("length", length) + .add("subRepository", subRepository) + .add("lastModified", lastModified) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java b/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java index 8bac16de8d..8dc7e3ac54 100644 --- a/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java +++ b/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java @@ -33,6 +33,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -132,12 +133,12 @@ public final class HealthCheckFailure public String toString() { //J- - return Objects.toStringHelper(this) - .add("id", id) - .add("summary", summary) - .add("url", url) - .add("description", description) - .toString(); + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("summary", summary) + .add("url", url) + .add("description", description) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java index 88350eaa1e..8d22e0fd63 100644 --- a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java @@ -33,6 +33,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableSet; @@ -182,7 +183,7 @@ public final class HealthCheckResult @Override public String toString() { - return Objects.toStringHelper(this).add("failures", failures).toString(); + return MoreObjects.toStringHelper(this).add("failures", failures).toString(); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/repository/ImportResult.java b/scm-core/src/main/java/sonia/scm/repository/ImportResult.java index a7d242abc4..47dc11fcfd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/ImportResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/ImportResult.java @@ -33,18 +33,19 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import static com.google.common.base.Preconditions.*; - -//~--- JDK imports ------------------------------------------------------------ - -import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +//~--- JDK imports ------------------------------------------------------------ /** * Import result of the {@link AdvancedImportHandler}. @@ -130,10 +131,10 @@ public final class ImportResult public String toString() { //J- - return Objects.toStringHelper(this) - .add("importedDirectories", importedDirectories) - .add("failedDirectories", failedDirectories) - .toString(); + return MoreObjects.toStringHelper(this) + .add("importedDirectories", importedDirectories) + .add("failedDirectories", failedDirectories) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/Permission.java b/scm-core/src/main/java/sonia/scm/repository/Permission.java index b5de810f75..7ea2d701b4 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Permission.java +++ b/scm-core/src/main/java/sonia/scm/repository/Permission.java @@ -35,17 +35,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.security.PermissionObject; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Permissions controls the access to {@link Repository}. @@ -163,11 +162,11 @@ public class Permission implements PermissionObject, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("type", type) - .add("groupPermission", groupPermission) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("type", type) + .add("groupPermission", groupPermission) + .toString(); //J+ } 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 b0a976db55..b6916d64f3 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -37,26 +37,21 @@ package sonia.scm.repository; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; - import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * Source code repository. @@ -253,20 +248,20 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per public String toString() { //J- - return Objects.toStringHelper(this) - .add("id", id) - .add("name", name) - .add("contact", contact) - .add("description", description) - .add("publicReadable", publicReadable) - .add("archived", archived) - .add("permissions", permissions) - .add("type", type) - .add("lastModified", lastModified) - .add("creationDate", creationDate) - .add("properties", properties) - .add("healthCheckFailures", healthCheckFailures) - .toString(); + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("name", name) + .add("contact", contact) + .add("description", description) + .add("publicReadable", publicReadable) + .add("archived", archived) + .add("permissions", permissions) + .add("type", type) + .add("lastModified", lastModified) + .add("creationDate", creationDate) + .add("properties", properties) + .add("healthCheckFailures", healthCheckFailures) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/SubRepository.java b/scm-core/src/main/java/sonia/scm/repository/SubRepository.java index 3c8acc4831..87e8b1f1e7 100644 --- a/scm-core/src/main/java/sonia/scm/repository/SubRepository.java +++ b/scm-core/src/main/java/sonia/scm/repository/SubRepository.java @@ -35,16 +35,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @since 1.10 @@ -157,11 +157,11 @@ public class SubRepository implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("repositoryUrl", repositoryUrl) - .add("browserUrl", browserUrl) - .add("revision", revision) - .toString(); + return MoreObjects.toStringHelper(this) + .add("repositoryUrl", repositoryUrl) + .add("browserUrl", browserUrl) + .add("revision", revision) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/Tag.java b/scm-core/src/main/java/sonia/scm/repository/Tag.java index 4fc246e0c5..b07c74ffa1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Tag.java +++ b/scm-core/src/main/java/sonia/scm/repository/Tag.java @@ -34,6 +34,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -124,10 +125,10 @@ public final class Tag public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("revision", revision) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("revision", revision) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/Tags.java b/scm-core/src/main/java/sonia/scm/repository/Tags.java index fd38b421a5..8126d8d106 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Tags.java +++ b/scm-core/src/main/java/sonia/scm/repository/Tags.java @@ -34,18 +34,18 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Iterator; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents all tags of a repository. @@ -138,9 +138,9 @@ public final class Tags implements Iterable public String toString() { //J- - return Objects.toStringHelper(this) - .add("tags", tags) - .toString(); + return MoreObjects.toStringHelper(this) + .add("tags", tags) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java b/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java index 36ae6f89ad..b9e8376fcd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java @@ -33,6 +33,7 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -95,9 +96,9 @@ public abstract class AbstractBundleOrUnbundleCommandResponse public String toString() { //J- - return Objects.toStringHelper(this) - .add("changesetCount", changesetCount) - .toString(); + return MoreObjects.toStringHelper(this) + .add("changesetCount", changesetCount) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java index 2f7c007959..445533455f 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java @@ -35,6 +35,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -127,13 +128,13 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest public String toString() { //J- - return Objects.toStringHelper(this) - .add("path", getPath()) - .add("revision", getRevision()) - .add("recursive", recursive) - .add("disableLastCommit", disableLastCommit) - .add("disableSubRepositoryDetection", disableSubRepositoryDetection) - .toString(); + return MoreObjects.toStringHelper(this) + .add("path", getPath()) + .add("revision", getRevision()) + .add("recursive", recursive) + .add("disableLastCommit", disableLastCommit) + .add("disableSubRepositoryDetection", disableSubRepositoryDetection) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java index aec2b7087a..ad70315e5f 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java @@ -35,6 +35,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -115,10 +116,10 @@ public abstract class FileBaseCommandRequest public String toString() { //J- - return Objects.toStringHelper(this) - .add("path", path) - .add("revision", revision) - .toString(); + return MoreObjects.toStringHelper(this) + .add("path", path) + .add("revision", revision) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java index 1637a92c16..4c7734667a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java @@ -35,6 +35,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -125,14 +126,14 @@ public final class LogCommandRequest implements Serializable, Resetable public String toString() { //J- - return Objects.toStringHelper(this) - .add("startChangeset", startChangeset) - .add("endChangeset", endChangeset) - .add("pagingStart", pagingStart) - .add("pagingLimit", pagingLimit) - .add("path", path) - .add("branch", branch) - .toString(); + return MoreObjects.toStringHelper(this) + .add("startChangeset", startChangeset) + .add("endChangeset", endChangeset) + .add("pagingStart", pagingStart) + .add("pagingLimit", pagingLimit) + .add("path", path) + .add("branch", branch) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java index c07ddb54ef..b1e15a0389 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java @@ -34,6 +34,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -84,11 +85,11 @@ public abstract class PagedRemoteCommandRequest extends RemoteCommandRequest { //J- - return Objects.toStringHelper(this) - .add("remoteURL", remoteRepository) - .add("pagingStart", pagingStart) - .add("pagingLimit", pagingLimit) - .toString(); + return MoreObjects.toStringHelper(this) + .add("remoteURL", remoteRepository) + .add("pagingStart", pagingStart) + .add("pagingLimit", pagingLimit) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java index 0f3cd909d9..1994afd29c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java @@ -35,6 +35,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import sonia.scm.repository.Repository; @@ -101,10 +102,10 @@ public abstract class RemoteCommandRequest implements Resetable public String toString() { //J- - return Objects.toStringHelper(this) - .add("remoteRepository", remoteRepository) - .add("remoteUrl", remoteUrl) - .toString(); + return MoreObjects.toStringHelper(this) + .add("remoteRepository", remoteRepository) + .add("remoteUrl", remoteUrl) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java b/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java index fc9083d13a..c9e1283a96 100644 --- a/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java +++ b/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java @@ -34,16 +34,16 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Permission object which is assigned to a specific user or group. @@ -150,11 +150,11 @@ public class AssignedPermission implements PermissionObject, Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("groupPermisison", groupPermission) - .add("permission", permission) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("groupPermisison", groupPermission) + .add("permission", permission) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java b/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java index 87ccfaf4cc..82555fd0b7 100644 --- a/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java +++ b/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java @@ -33,24 +33,15 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; - -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.AuthenticationInfo; -import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.authc.DisabledAccountException; -import org.apache.shiro.authc.SimpleAuthenticationInfo; -import org.apache.shiro.authc.UnknownAccountException; -import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authc.*; import org.apache.shiro.authc.credential.CredentialsMatcher; import org.apache.shiro.subject.SimplePrincipalCollection; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.group.Group; import sonia.scm.group.GroupDAO; import sonia.scm.group.GroupNames; @@ -161,7 +152,7 @@ public final class DAORealmHelper collection.add(principal, realm); collection.add(user, realm); collection.add(collectGroups(principal), realm); - collection.add(Objects.firstNonNull(scope, Scope.empty()), realm); + collection.add(MoreObjects.firstNonNull(scope, Scope.empty()), realm); String creds = credentials; diff --git a/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java b/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java index 5cd5520d61..acde1b447a 100644 --- a/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java +++ b/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java @@ -34,16 +34,16 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Descriptor for available permission objects. @@ -125,11 +125,11 @@ public class PermissionDescriptor implements Serializable { //J- - return Objects.toStringHelper(this) - .add("displayName", displayName) - .add("description", description) - .add("value", value) - .toString(); + return MoreObjects.toStringHelper(this) + .add("displayName", displayName) + .add("description", description) + .add("value", value) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java b/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java index f697e82dfd..ae98d70e47 100644 --- a/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java +++ b/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java @@ -35,6 +35,7 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import org.apache.shiro.authz.Permission; @@ -174,10 +175,10 @@ public final class RepositoryPermission public String toString() { //J- - return Objects.toStringHelper(this) - .add("repositoryId", repositoryId) - .add("permissionType", permissionType) - .toString(); + return MoreObjects.toStringHelper(this) + .add("repositoryId", repositoryId) + .add("permissionType", permissionType) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java b/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java index acd7d62052..1c2d0af156 100644 --- a/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java +++ b/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java @@ -34,14 +34,14 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.HandlerEventType; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.event.Event; import java.io.Serializable; -import sonia.scm.event.Event; + +//~--- JDK imports ------------------------------------------------------------ /** * Event which is fired after a {@link StoredAssignedPermission} was added, @@ -114,10 +114,10 @@ public final class StoredAssignedPermissionEvent implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("type", type) - .add("permission", permission) - .toString(); + return MoreObjects.toStringHelper(this) + .add("type", type) + .add("permission", permission) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/user/User.java b/scm-core/src/main/java/sonia/scm/user/User.java index 69c5a5732f..dc7105825d 100644 --- a/scm-core/src/main/java/sonia/scm/user/User.java +++ b/scm-core/src/main/java/sonia/scm/user/User.java @@ -37,20 +37,19 @@ package sonia.scm.user; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.security.Principal; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.security.Principal; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -259,18 +258,18 @@ public class User extends BasicPropertiesAware implements Principal, ModelObject : "(not set)"; //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("displayName",displayName) - .add("mail", mail) - .add("password", pwd) - .add("admin", admin) - .add("type", type) - .add("active", active) - .add("creationDate", creationDate) - .add("lastModified", lastModified) - .add("properties", properties) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("displayName",displayName) + .add("mail", mail) + .add("password", pwd) + .add("admin", admin) + .add("type", type) + .add("active", active) + .add("creationDate", creationDate) + .add("lastModified", lastModified) + .add("properties", properties) + .toString(); //J+ } 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 27abcaffbe..1a1394dd0c 100644 --- a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java @@ -37,29 +37,24 @@ package sonia.scm.util; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.CharMatcher; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.common.base.Strings; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.config.ScmConfiguration; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; - import java.net.URLDecoder; import java.net.URLEncoder; - import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +//~--- JDK imports ------------------------------------------------------------ /** * Util method for the http protocol. @@ -694,7 +689,7 @@ public final class HttpUtil { String value = request.getHeader(header); - return Objects.firstNonNull(value, defaultValue); + return MoreObjects.firstNonNull(value, defaultValue); } /** diff --git a/scm-core/src/main/java/sonia/scm/web/UserAgent.java b/scm-core/src/main/java/sonia/scm/web/UserAgent.java index 7efd1bd1c2..b3aa1eff01 100644 --- a/scm-core/src/main/java/sonia/scm/web/UserAgent.java +++ b/scm-core/src/main/java/sonia/scm/web/UserAgent.java @@ -36,14 +36,15 @@ package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Charsets; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -import static com.google.common.base.Preconditions.*; +import java.nio.charset.Charset; + +import static com.google.common.base.Preconditions.checkNotNull; //~--- JDK imports ------------------------------------------------------------ -import java.nio.charset.Charset; - /** * The software agent that is acting on behalf of a user. The user agent * represents a browser or one of the repository client (svn, git or hg). @@ -124,11 +125,11 @@ public final class UserAgent public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("browser", browser) - .add("basicAuthenticationCharset", basicAuthenticationCharset) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("browser", browser) + .add("basicAuthenticationCharset", basicAuthenticationCharset) + .toString(); //J+ } diff --git a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java index 71e39e13dd..7a9d986465 100644 --- a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java @@ -34,20 +34,15 @@ package sonia.scm.web.proxy; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.annotation.*; import java.net.URL; - import java.util.Collections; import java.util.Set; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -144,14 +139,14 @@ public class ProxyConfiguration public String toString() { //J- - return Objects.toStringHelper(this) - .add("url", url) - .add("copyRequestHeaders", copyRequestHeaders) - .add("requestHeaderExcludes", requestHeaderExcludes) - .add("copyResponseHeaders", copyResponseHeaders) - .add("responseHeaderExcludes", responseHeaderExcludes) - .add("cacheEnabled", cacheEnabled) - .toString(); + return MoreObjects.toStringHelper(this) + .add("url", url) + .add("copyRequestHeaders", copyRequestHeaders) + .add("requestHeaderExcludes", requestHeaderExcludes) + .add("copyResponseHeaders", copyResponseHeaders) + .add("responseHeaderExcludes", responseHeaderExcludes) + .add("cacheEnabled", cacheEnabled) + .toString(); //J+ } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java index 2814cedb32..b0bc088c98 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java @@ -36,7 +36,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.github.legman.Subscribe; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.inject.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -263,7 +263,7 @@ public class HgHookManager { //J- return HttpUtil.getUriWithoutEndSeperator( - Objects.firstNonNull( + MoreObjects.firstNonNull( configuration.getBaseUrl(), "http://localhost:8080/scm" ) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java index afe6a17ca1..ea4a96ba6e 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java @@ -34,6 +34,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -100,10 +101,10 @@ public class HgVersion public String toString() { //J- - return Objects.toStringHelper(this) - .add("mercurial", mercurial) - .add("python", python) - .toString(); + return MoreObjects.toStringHelper(this) + .add("mercurial", mercurial) + .add("python", python) + .toString(); //J+ } diff --git a/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java b/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java index fd473300fa..e278604366 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java @@ -34,6 +34,7 @@ package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import sonia.scm.repository.Person; @@ -105,10 +106,10 @@ public final class CommitRequest public String toString() { //J- - return Objects.toStringHelper(this) - .add("author", author) - .add("message", message) - .toString(); + return MoreObjects.toStringHelper(this) + .add("author", author) + .add("message", message) + .toString(); //J+ } diff --git a/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java b/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java index fccf555c16..3138a4331e 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java @@ -34,6 +34,7 @@ package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -103,10 +104,10 @@ public final class TagRequest public String toString() { //J- - return Objects.toStringHelper(this) - .add("revision", revision) - .add("name", name) - .toString(); + return MoreObjects.toStringHelper(this) + .add("revision", revision) + .add("name", name) + .toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/ClassOverride.java b/scm-webapp/src/main/java/sonia/scm/ClassOverride.java index 63d4c8339b..98a19bc28a 100644 --- a/scm-webapp/src/main/java/sonia/scm/ClassOverride.java +++ b/scm-webapp/src/main/java/sonia/scm/ClassOverride.java @@ -34,6 +34,7 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; //~--- JDK imports ------------------------------------------------------------ @@ -97,10 +98,10 @@ public class ClassOverride implements Validateable public String toString() { //J- - return Objects.toStringHelper(this) - .add("bind", bind) - .add("to", to) - .toString(); + return MoreObjects.toStringHelper(this) + .add("bind", bind) + .add("to", to) + .toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java b/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java index cab11840df..ffd0673f9e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java @@ -34,15 +34,15 @@ package sonia.scm.api.rest; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -127,10 +127,10 @@ public class Permission implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("id", id) - .add("value", value) - .toString(); + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("value", value) + .toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java b/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java index 42130a0a35..fac7168bc6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java @@ -34,6 +34,7 @@ package sonia.scm.api.rest; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.base.Throwables; @@ -145,10 +146,10 @@ public class RestExceptionResult public String toString() { //J- - return Objects.toStringHelper(this) - .add("message", message) - .add("stacktrace", stacktrace) - .toString(); + return MoreObjects.toStringHelper(this) + .add("message", message) + .add("stacktrace", stacktrace) + .toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java index b7b6e0f826..6be60703b8 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java @@ -35,6 +35,7 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -820,10 +821,10 @@ public class RepositoryImportResource public String toString() { //J- - return Objects.toStringHelper(this) - .add("name", name) - .add("url", url) - .toString(); + return MoreObjects.toStringHelper(this) + .add("name", name) + .add("url", url) + .toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java b/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java index f84782fee2..8a5e56624b 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java @@ -45,6 +45,7 @@ import java.io.IOException; import java.net.URL; +import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; @@ -109,7 +110,7 @@ public final class CacheConfigurations if (it == null) { - it = Iterators.emptyIterator(); + it = Collections.emptyIterator(); } return it; diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java index 0d339c8a6c..2b761996fc 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java @@ -34,17 +34,16 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Objects; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; +import com.google.common.base.MoreObjects; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -70,19 +69,19 @@ public class GuavaCacheConfiguration implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) - .add("concurrencyLevel", concurrencyLevel) - .add("copyStrategy", copyStrategy) - .add("expireAfterAccess", expireAfterAccess) - .add("expireAfterWrite", expireAfterWrite) - .add("initialCapacity", initialCapacity) - .add("maximumSize", maximumSize) - .add("maximumWeight", maximumWeight) - .add("recordStats", recordStats) - .add("softValues", softValues) - .add("weakKeys", weakKeys) - .add("weakValues", weakValues) - .omitNullValues().toString(); + return MoreObjects.toStringHelper(this) + .add("concurrencyLevel", concurrencyLevel) + .add("copyStrategy", copyStrategy) + .add("expireAfterAccess", expireAfterAccess) + .add("expireAfterWrite", expireAfterWrite) + .add("initialCapacity", initialCapacity) + .add("maximumSize", maximumSize) + .add("maximumWeight", maximumWeight) + .add("recordStats", recordStats) + .add("softValues", softValues) + .add("weakKeys", weakKeys) + .add("weakValues", weakValues) + .omitNullValues().toString(); //J+ } diff --git a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java index 304c8ead13..c1e08da13a 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java +++ b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java @@ -30,12 +30,8 @@ */ package sonia.scm.security; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.inject.Inject; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.TimeUnit; -import javax.inject.Singleton; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -44,6 +40,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.config.ScmConfiguration; +import javax.inject.Singleton; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; + /** * Configurable implementation of {@link LoginAttemptHandler}. * @@ -175,10 +176,10 @@ public class ConfigurableLoginAttemptHandler implements LoginAttemptHandler { @Override public String toString() { - return Objects.toStringHelper(this) - .add("counter", counter) - .add("lastAttempt", lastAttempt) - .toString(); + return MoreObjects.toStringHelper(this) + .add("counter", counter) + .add("lastAttempt", lastAttempt) + .toString(); } } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java index 0b111e4ef1..5bca6921f3 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java @@ -43,6 +43,7 @@ import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.Collections; import java.util.Iterator; import static org.mockito.Mockito.mock; @@ -190,7 +191,7 @@ public class CacheConfigurationTestLoader implements CacheConfigurationLoader if (moduleConfigurations == null) { - urlIterator = Iterators.emptyIterator(); + urlIterator = Collections.emptyIterator(); } else { diff --git a/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java b/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java index f9f00056ae..1454d8c5ac 100644 --- a/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java +++ b/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java @@ -30,17 +30,14 @@ */ package sonia.scm.selenium.page; -import com.google.common.base.Objects; -import java.util.List; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; +import com.google.common.base.MoreObjects; +import org.openqa.selenium.*; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.WebDriverWait; import sonia.scm.repository.Repository; +import java.util.List; + /** * Page object for scm-manager's repository creation page. * @@ -130,7 +127,7 @@ public class RepositoriesAddPage extends BasePage { String script = "Sonia.repository.getTypeByName('" + type + "').displayName;"; displayName = (String) ((JavascriptExecutor)driver).executeScript(script); } - return Objects.firstNonNull(displayName, type); + return MoreObjects.firstNonNull(displayName, type); } } From 326252483231d01d565747ace921026b5594312e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Stefanik?= Date: Mon, 18 Sep 2017 12:30:20 +0000 Subject: [PATCH 024/144] prevent binary data in {extras} from interfering with UTF-8 decoding --- .../src/main/resources/sonia/scm/styles/changesets-eager.style | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style index 5c462fc459..e911bce7b2 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style @@ -1,5 +1,5 @@ header = "%{pattern}" -changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}{join(extras,',')}\n{tags}{file_adds}{file_mods}{file_dels}\n{desc}\0" +changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}close={if(get(extras, 'close'),1,0)}\n{tags}{file_adds}{file_mods}{file_dels}\n{desc}\0" tag = "t {tag}\n" file_add = "a {file_add}\n" file_mod = "m {file_mod}\n" From bfc70d418def3284e7cc7615a59f074ac97df412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Stefanik?= Date: Mon, 18 Sep 2017 12:34:50 +0000 Subject: [PATCH 025/144] oops... don't interpret "close=junk" as "close=1" --- .../src/main/resources/sonia/scm/styles/changesets-eager.style | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style index e911bce7b2..73b3ec694b 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style @@ -1,5 +1,5 @@ header = "%{pattern}" -changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}close={if(get(extras, 'close'),1,0)}\n{tags}{file_adds}{file_mods}{file_dels}\n{desc}\0" +changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}close={ifeq(get(extras, 'close'),1,1,0)}\n{tags}{file_adds}{file_mods}{file_dels}\n{desc}\0" tag = "t {tag}\n" file_add = "a {file_add}\n" file_mod = "m {file_mod}\n" From bd1760a4ac578df9149b7a49cb373f6b7c93160c Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 10 Jun 2018 19:51:03 +0200 Subject: [PATCH 026/144] added missing default values to plugin.xml and module.xml --- .../scm/annotation/ScmAnnotationProcessor.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java index b49713d61a..c1cd26dfe7 100644 --- a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java +++ b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java @@ -101,6 +101,8 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import static javax.lang.model.util.ElementFilter.methodsIn; + /** * * @author Sebastian Sdorra @@ -432,7 +434,7 @@ public final class ScmAnnotationProcessor extends AbstractProcessor //J- descriptorElements.add( new SubscriberElement( - clazz.toString(), + clazz.toString(), param.asType().toString(), desc ) @@ -538,6 +540,15 @@ public final class ScmAnnotationProcessor extends AbstractProcessor attributes.put(entry.getKey().getSimpleName().toString(), getValue(entry.getValue())); } + + // add default values + for (ExecutableElement meth : methodsIn(am.getAnnotationType().asElement().getEnclosedElements())) { + String attribute = meth.getSimpleName().toString(); + AnnotationValue defaultValue = meth.getDefaultValue(); + if (defaultValue != null && !attributes.containsKey(attribute)) { + attributes.put(attribute, getValue(defaultValue)); + } + } } } From 87c4a12d6b540c2e659880ae3f5c6f6ecd8b7c19 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 10 Jun 2018 19:51:03 +0200 Subject: [PATCH 027/144] added missing default values to plugin.xml and module.xml --- .../sonia/scm/annotation/ScmAnnotationProcessor.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java index c548f30d45..7ef632a3b0 100644 --- a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java +++ b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java @@ -99,6 +99,8 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import static javax.lang.model.util.ElementFilter.methodsIn; + /** * * @author Sebastian Sdorra @@ -372,6 +374,15 @@ public final class ScmAnnotationProcessor extends AbstractProcessor { attributes.put(entry.getKey().getSimpleName().toString(), getValue(entry.getValue())); } + + // add default values + for (ExecutableElement meth : methodsIn(am.getAnnotationType().asElement().getEnclosedElements())) { + String attribute = meth.getSimpleName().toString(); + AnnotationValue defaultValue = meth.getDefaultValue(); + if (defaultValue != null && !attributes.containsKey(attribute)) { + attributes.put(attribute, getValue(defaultValue)); + } + } } } From 30c86d3291eff44483132c8e405ac481877ce2fc Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 10 Jun 2018 19:59:24 +0200 Subject: [PATCH 028/144] reformat ScmAnnotationProcessor --- .../annotation/ScmAnnotationProcessor.java | 358 ++++-------------- 1 file changed, 71 insertions(+), 287 deletions(-) diff --git a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java index c1cd26dfe7..6d53276498 100644 --- a/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java +++ b/scm-annotation-processor/src/main/java/sonia/scm/annotation/ScmAnnotationProcessor.java @@ -111,82 +111,53 @@ import static javax.lang.model.util.ElementFilter.methodsIn; @MetaInfServices(Processor.class) @SuppressWarnings({ "Since16", "Since15" }) @SupportedSourceVersion(SourceVersion.RELEASE_8) -public final class ScmAnnotationProcessor extends AbstractProcessor -{ +public final class ScmAnnotationProcessor extends AbstractProcessor { - /** Field description */ private static final String DESCRIPTOR_MODULE = "META-INF/scm/module.xml"; - - /** Field description */ private static final String DESCRIPTOR_PLUGIN = "META-INF/scm/plugin.xml"; - /** Field description */ private static final String EL_MODULE = "module"; - /** Field description */ private static final String EMPTY = ""; - /** Field description */ private static final String PROPERTY_VALUE = "yes"; - /** Field description */ - private static final Set SUBSCRIBE_ANNOTATIONS = - ImmutableSet.of(Subscribe.class.getName()); + private static final Set SUBSCRIBE_ANNOTATIONS = ImmutableSet.of(Subscribe.class.getName()); - /** Field description */ - private static final Set CLASS_ANNOTATIONS = - ImmutableSet.of(new ClassAnnotation("rest-resource", Path.class), - new ClassAnnotation("rest-provider", Provider.class)); + private static final Set CLASS_ANNOTATIONS = ImmutableSet.of( + new ClassAnnotation("rest-resource", Path.class), + new ClassAnnotation("rest-provider", Provider.class) + ); //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param annotations - * @param roundEnv - * - * @return - */ @Override - public boolean process(Set annotations, - RoundEnvironment roundEnv) - { - if (!roundEnv.processingOver()) - { + public boolean process(Set annotations, RoundEnvironment roundEnv) { + if (!roundEnv.processingOver()) { Set descriptorElements = Sets.newHashSet(); Set subscriberAnnotations = Sets.newHashSet(); - for (TypeElement e : annotations) - { + for (TypeElement e : annotations) { PluginAnnotation pa = e.getAnnotation(PluginAnnotation.class); - if (pa != null) - { + if (pa != null) { scanForClassAnnotations(descriptorElements, roundEnv, e, pa.value()); } - if (SUBSCRIBE_ANNOTATIONS.contains(e.getQualifiedName().toString())) - { + if (SUBSCRIBE_ANNOTATIONS.contains(e.getQualifiedName().toString())) { subscriberAnnotations.add(e); } } - for (ClassAnnotation ca : CLASS_ANNOTATIONS) - { - TypeElement annotation = findAnnotation(annotations, - ca.annotationClass); + for (ClassAnnotation ca : CLASS_ANNOTATIONS) { + TypeElement annotation = findAnnotation(annotations, ca.annotationClass); - if (annotation != null) - { - scanForClassAnnotations(descriptorElements, roundEnv, annotation, - ca.elementName); + if (annotation != null) { + scanForClassAnnotations(descriptorElements, roundEnv, annotation, ca.elementName); } } - for (TypeElement annotation : subscriberAnnotations) - { + for (TypeElement annotation : subscriberAnnotations) { scanForSubscriberAnnotations(descriptorElements, roundEnv, annotation); } @@ -196,45 +167,22 @@ public final class ScmAnnotationProcessor extends AbstractProcessor return false; } - /** - * Method description - * - * - * @param closeable - */ - private void close(Closeable closeable) - { - if (closeable != null) - { - try - { + private void close(Closeable closeable) { + if (closeable != null) { + try { closeable.close(); - } - catch (IOException ex) - { + } catch (IOException ex) { printException("could not close closeable", ex); } } } - /** - * Method description - * - * - * @param annotations - * @param annotationClass - * - * @return - */ private TypeElement findAnnotation(Set annotations, - Class annotationClass) - { + Class annotationClass) { TypeElement annotation = null; - for (TypeElement te : annotations) - { - if (te.getQualifiedName().toString().equals(annotationClass.getName())) - { + for (TypeElement te : annotations) { + if (te.getQualifiedName().toString().equals(annotationClass.getName())) { annotation = te; break; @@ -244,94 +192,50 @@ public final class ScmAnnotationProcessor extends AbstractProcessor return annotation; } - /** - * Method description - * - * - * @param filer - * - * @return - * - * @throws IOException - */ - private File findDescriptor(Filer filer) throws IOException - { - FileObject f = filer.getResource(StandardLocation.CLASS_OUTPUT, EMPTY, - DESCRIPTOR_PLUGIN); + private File findDescriptor(Filer filer) throws IOException { + FileObject f = filer.getResource(StandardLocation.CLASS_OUTPUT, EMPTY, DESCRIPTOR_PLUGIN); File file = new File(f.toUri()); - if (!file.exists()) - { - f = filer.getResource(StandardLocation.CLASS_OUTPUT, EMPTY, - DESCRIPTOR_MODULE); + if (!file.exists()) { + f = filer.getResource(StandardLocation.CLASS_OUTPUT, EMPTY, DESCRIPTOR_MODULE); file = new File(f.toUri()); } return file; } - /** - * Method description - * - * - * @param f - * - * @param file - * - * @return - */ - private Document parseDocument(File file) - { + private Document parseDocument(File file) { Document doc = null; InputStream input = null; - try - { + try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - if (file.exists()) - { + if (file.exists()) { input = new FileInputStream(file); doc = builder.parse(input); - } - else - { + } else { doc = builder.newDocument(); doc.appendChild(doc.createElement(EL_MODULE)); } } - catch (ParserConfigurationException | SAXException | IOException - | DOMException ex) - { + catch (ParserConfigurationException | SAXException | IOException | DOMException ex) { printException("could not parse document", ex); - } - finally - { + } finally { close(input); } return doc; } - /** - * Method description - * - * - * @param obj - * - * @return - */ - private String prepareArrayElement(Object obj) - { + private String prepareArrayElement(Object obj) { String v = obj.toString(); - if (v.startsWith("\"")) - { + if (v.startsWith("\"")) { v = v.substring(1); - if (v.endsWith("")) - { + if (v.endsWith("")) { v = v.substring(0, v.length() - 1); } } @@ -339,15 +243,7 @@ public final class ScmAnnotationProcessor extends AbstractProcessor return v; } - /** - * Method description - * - * - * @param msg - * @param throwable - */ - private void printException(String msg, Throwable throwable) - { + private void printException(String msg, Throwable throwable) { processingEnv.getMessager().printMessage(Kind.ERROR, msg); String stack = Throwables.getStackTraceAsString(throwable); @@ -355,37 +251,18 @@ public final class ScmAnnotationProcessor extends AbstractProcessor processingEnv.getMessager().printMessage(Kind.ERROR, stack); } - /** - * Method description - * - * - * @param descriptorElements - * @param roundEnv - * @param annotation - * @param elementName - * @param elements - * - * @return - */ - private void scanForClassAnnotations( - Set descriptorElements, RoundEnvironment roundEnv, - TypeElement annotation, String elementName) - { + private void scanForClassAnnotations(Set descriptorElements, + RoundEnvironment roundEnv, TypeElement annotation, String elementName) { Set classes = Sets.newHashSet(); - - for (Element e : roundEnv.getElementsAnnotatedWith(annotation)) - { - if (e.getKind().isClass() || e.getKind().isInterface()) - { + for (Element e : roundEnv.getElementsAnnotatedWith(annotation)) { + if (e.getKind().isClass() || e.getKind().isInterface()) { TypeElement type = (TypeElement) e; String desc = processingEnv.getElementUtils().getDocComment(type); - if (desc != null) - { + if (desc != null) { desc = desc.trim(); } - //J- classes.add( new ClassWithAttributes( type.getQualifiedName().toString(), @@ -393,45 +270,29 @@ public final class ScmAnnotationProcessor extends AbstractProcessor getAttributesFromAnnotation(e, annotation) ) ); - //J+ } } descriptorElements.add(new ClassSetElement(elementName, classes)); } - /** - * Method description - * - * - * @param descriptorElements - * @param roundEnv - * @param annotation - */ - private void scanForSubscriberAnnotations( - Set descriptorElements, RoundEnvironment roundEnv, - TypeElement annotation) - { - for (Element el : roundEnv.getElementsAnnotatedWith(annotation)) - { - if (el.getKind() == ElementKind.METHOD) - { + private void scanForSubscriberAnnotations(Set descriptorElements, RoundEnvironment roundEnv, + TypeElement annotation) { + for (Element el : roundEnv.getElementsAnnotatedWith(annotation)) { + if (el.getKind() == ElementKind.METHOD) { ExecutableElement ee = (ExecutableElement) el; List params = ee.getParameters(); - if ((params != null) && (params.size() == 1)) - { + if ((params != null) && (params.size() == 1)) { VariableElement param = params.get(0); Element clazz = el.getEnclosingElement(); String desc = processingEnv.getElementUtils().getDocComment(clazz); - if (desc != null) - { + if (desc != null) { desc = desc.trim(); } - //J- descriptorElements.add( new SubscriberElement( clazz.toString(), @@ -439,60 +300,37 @@ public final class ScmAnnotationProcessor extends AbstractProcessor desc ) ); - //J+ } } } } - /** - * Method description - * - * - * @param descriptorElements - */ - private void write(Set descriptorElements) - { + private void write(Set descriptorElements) { Filer filer = processingEnv.getFiler(); - try - { + try { File file = findDescriptor(filer); Document doc = parseDocument(file); - if (doc != null) - { + if (doc != null) { org.w3c.dom.Element root = doc.getDocumentElement(); - for (DescriptorElement el : descriptorElements) - { + for (DescriptorElement el : descriptorElements) { el.append(doc, root); } writeDocument(doc, file); } - } - catch (IOException ex) - { + } catch (IOException ex) { printException("could not open plugin descriptor", ex); } } - /** - * Method description - * - * - * @param doc - * @param f - * @param file - */ - private void writeDocument(Document doc, File file) - { + private void writeDocument(Document doc, File file) { Writer writer = null; - try - { + try { file.getParentFile().mkdirs(); writer = new FileWriter(file); @@ -501,42 +339,23 @@ public final class ScmAnnotationProcessor extends AbstractProcessor transformer.setOutputProperty(OutputKeys.INDENT, PROPERTY_VALUE); transformer.transform(new DOMSource(doc), new StreamResult(writer)); - } - catch (IOException | IllegalArgumentException | TransformerException ex) - { + } catch (IOException | IllegalArgumentException | TransformerException ex) { printException("could not write document", ex); - } - finally - { + } finally { close(writer); } } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param el - * @param annotation - * - * @return - */ - private Map getAttributesFromAnnotation(Element el, - TypeElement annotation) - { + private Map getAttributesFromAnnotation(Element el, TypeElement annotation) { Map attributes = Maps.newHashMap(); - for (AnnotationMirror am : el.getAnnotationMirrors()) - { + for (AnnotationMirror am : el.getAnnotationMirrors()) { String qn = am.getAnnotationType().asElement().toString(); - if (qn.equals(annotation.toString())) - { - for (Entry entry : am.getElementValues().entrySet()) - { + if (qn.equals(annotation.toString())) { + for (Entry entry : am.getElementValues().entrySet()) { attributes.put(entry.getKey().getSimpleName().toString(), getValue(entry.getValue())); } @@ -555,39 +374,25 @@ public final class ScmAnnotationProcessor extends AbstractProcessor return attributes; } - /** - * Method description - * - * - * @param v - * - * @return - */ - private String getValue(AnnotationValue v) - { + private String getValue(AnnotationValue v) { String value; Object object = v.getValue(); - if (object instanceof Iterable) - { + if (object instanceof Iterable) { Iterator it = ((Iterable) object).iterator(); StringBuilder buffer = new StringBuilder(); - while (it.hasNext()) - { + while (it.hasNext()) { buffer.append(prepareArrayElement(it.next())); - if (it.hasNext()) - { + if (it.hasNext()) { buffer.append(","); } } value = buffer.toString(); - } - else - { + } else { value = object.toString(); } @@ -596,36 +401,15 @@ public final class ScmAnnotationProcessor extends AbstractProcessor //~--- inner classes -------------------------------------------------------- - /** - * Class description - * - * - * @version Enter version here..., 14/03/18 - * @author Enter your name here... - */ - private static final class ClassAnnotation - { + private static final class ClassAnnotation { - /** - * Constructs ... - * - * - * @param elementName - * @param annotationClass - */ - public ClassAnnotation(String elementName, - Class annotationClass) - { + private final String elementName; + private final Class annotationClass; + + ClassAnnotation(String elementName, Class annotationClass) { this.elementName = elementName; this.annotationClass = annotationClass; } - //~--- fields ------------------------------------------------------------- - - /** Field description */ - private final Class annotationClass; - - /** Field description */ - private final String elementName; } } From 5a2a5e8ef0e5bfe9374e326b0ddf93fc9e24ade2 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 6 Nov 2019 15:55:07 +0100 Subject: [PATCH 029/144] added development mode for ui --- scm-ui/pom.xml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/scm-ui/pom.xml b/scm-ui/pom.xml index ffc727f10d..8bddc41fa9 100644 --- a/scm-ui/pom.xml +++ b/scm-ui/pom.xml @@ -68,7 +68,7 @@ run - + @@ -118,4 +118,32 @@ + + + + default + + + + + + + build + + + + dev + + + + development + + + + + build:dev + + + + From 5b5f71a837f4fa00d13052de00cf2f9d32f9b827 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 7 Nov 2019 10:22:01 +0100 Subject: [PATCH 030/144] do simple property override instead of default profile, to fix ci build --- scm-ui/pom.xml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/scm-ui/pom.xml b/scm-ui/pom.xml index 8bddc41fa9..e8277fae6e 100644 --- a/scm-ui/pom.xml +++ b/scm-ui/pom.xml @@ -17,6 +17,7 @@ scm-ui + build typescript ui-extensions/src,ui-components/src,ui-webapp/src **/*.test.js,src/tests/** @@ -120,17 +121,6 @@ - - default - - - - - - - build - - dev From 5bc8eedfb28d7cb8a8133bd68cb44890abd98a9b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 12 Nov 2019 08:42:01 +0100 Subject: [PATCH 031/144] update prettier and typescript in order to get support for optional chaining --- scm-ui/prettier-config/package.json | 2 +- scm-ui/tsconfig/package.json | 2 +- scm-ui/ui-components/package.json | 2 +- scm-ui/ui-extensions/package.json | 2 +- scm-ui/ui-tests/package.json | 2 +- scm-ui/ui-types/package.json | 2 +- scm-ui/ui-webapp/package.json | 3 +-- yarn.lock | 12 +++++++++++- 8 files changed, 18 insertions(+), 9 deletions(-) diff --git a/scm-ui/prettier-config/package.json b/scm-ui/prettier-config/package.json index 584081645c..097b07ee2b 100644 --- a/scm-ui/prettier-config/package.json +++ b/scm-ui/prettier-config/package.json @@ -7,7 +7,7 @@ "private": false, "main": "index.js", "dependencies": { - "prettier": "^1.18.2" + "prettier": "^1.19.1" }, "publishConfig": { "access": "public" diff --git a/scm-ui/tsconfig/package.json b/scm-ui/tsconfig/package.json index 4ee8613469..0ddbfc5975 100644 --- a/scm-ui/tsconfig/package.json +++ b/scm-ui/tsconfig/package.json @@ -7,7 +7,7 @@ "private": false, "main": "tsconfig.json", "dependencies": { - "typescript": "^3.6.4" + "typescript": "^3.7.2" }, "publishConfig": { "access": "public" diff --git a/scm-ui/ui-components/package.json b/scm-ui/ui-components/package.json index e7266aae6f..946416ca96 100644 --- a/scm-ui/ui-components/package.json +++ b/scm-ui/ui-components/package.json @@ -42,7 +42,7 @@ "raf": "^3.4.0", "react-test-renderer": "^16.10.2", "storybook-addon-i18next": "^1.2.1", - "typescript": "^3.6.4" + "typescript": "^3.7.2" }, "dependencies": { "@scm-manager/ui-extensions": "^2.0.0-SNAPSHOT", diff --git a/scm-ui/ui-extensions/package.json b/scm-ui/ui-extensions/package.json index 28e1d99905..cedc53fe47 100644 --- a/scm-ui/ui-extensions/package.json +++ b/scm-ui/ui-extensions/package.json @@ -16,7 +16,7 @@ "@types/enzyme": "^3.10.3", "@types/jest": "^24.0.19", "@types/react": "^16.9.9", - "typescript": "^3.6.4" + "typescript": "^3.7.2" }, "babel": { "presets": [ diff --git a/scm-ui/ui-tests/package.json b/scm-ui/ui-tests/package.json index 45978d3836..9958841160 100644 --- a/scm-ui/ui-tests/package.json +++ b/scm-ui/ui-tests/package.json @@ -26,6 +26,6 @@ "@types/enzyme": "^3.10.3", "@types/enzyme-adapter-react-16": "^1.0.5", "@types/jest": "^24.0.19", - "typescript": "^3.6.4" + "typescript": "^3.7.2" } } diff --git a/scm-ui/ui-types/package.json b/scm-ui/ui-types/package.json index fb971290a8..c872d70463 100644 --- a/scm-ui/ui-types/package.json +++ b/scm-ui/ui-types/package.json @@ -14,7 +14,7 @@ "typecheck": "tsc" }, "devDependencies": { - "typescript": "^3.6.4" + "typescript": "^3.7.2" }, "babel": { "presets": [ diff --git a/scm-ui/ui-webapp/package.json b/scm-ui/ui-webapp/package.json index af33163aeb..0c2b5e4821 100644 --- a/scm-ui/ui-webapp/package.json +++ b/scm-ui/ui-webapp/package.json @@ -26,8 +26,7 @@ "systemjs": "0.21.6" }, "scripts": { - "test": "jest", - "flow": "flow" + "test": "jest" }, "devDependencies": { "@scm-manager/ui-tests": "^2.0.0-SNAPSHOT", diff --git a/yarn.lock b/yarn.lock index 464bc0495c..650308884e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11199,6 +11199,11 @@ prettier@^1.16.4, prettier@^1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -13887,11 +13892,16 @@ typescript-compiler@^1.4.1-2: resolved "https://registry.yarnpkg.com/typescript-compiler/-/typescript-compiler-1.4.1-2.tgz#ba4f7db22d91534a1929d90009dce161eb72fd3f" integrity sha1-uk99si2RU0oZKdkACdzhYety/T8= -typescript@^3.4, typescript@^3.6.4: +typescript@^3.4: version "3.6.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== +typescript@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" + integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== + ua-parser-js@^0.7.18: version "0.7.20" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" From a795129c70be92ecf122317a3b445df3911c8ec5 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 19 Nov 2019 08:48:46 +0100 Subject: [PATCH 032/144] Remove global style: last div two levels below .modal-card-body Apparently added for the CI plugin on 2019-07-24, but no longer necessary --- scm-ui/ui-styles/src/scm.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scm-ui/ui-styles/src/scm.scss b/scm-ui/ui-styles/src/scm.scss index 97e3a70a9f..01d8d3e55a 100644 --- a/scm-ui/ui-styles/src/scm.scss +++ b/scm-ui/ui-styles/src/scm.scss @@ -809,10 +809,6 @@ form .field:not(.is-grouped) { } } -.modal-card-body div div:last-child { - border-bottom: none; -} - // cursor .has-cursor-pointer { cursor: pointer; From dd8f84e7c4e947aaf58110af6f557d72dbd668c8 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 13:50:57 +0100 Subject: [PATCH 033/144] implement repository public flag migration to repositoryPermissions for _anonymous user --- .../repository/PublicFlagUpdateStep.java | 97 ++++++++++++++ .../scm/update/repository/V1Repository.java | 2 + .../update/repository/V1RepositoryHelper.java | 51 ++++++++ .../repository/XmlRepositoryV1UpdateStep.java | 52 ++------ .../repository/PublicFlagUpdateStepTest.java | 118 ++++++++++++++++++ .../scm/update/repository/scm-home.v1.zip | Bin 13593 -> 14520 bytes 6 files changed, 277 insertions(+), 43 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java create mode 100644 scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java create mode 100644 scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java new file mode 100644 index 0000000000..b2e3c17980 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java @@ -0,0 +1,97 @@ +package sonia.scm.update.repository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.SCMContext; +import sonia.scm.SCMContextProvider; +import sonia.scm.migration.UpdateStep; +import sonia.scm.plugin.Extension; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryPermission; +import sonia.scm.repository.xml.XmlRepositoryDAO; +import sonia.scm.user.User; +import sonia.scm.user.xml.XmlUserDAO; +import sonia.scm.version.Version; + +import javax.inject.Inject; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import static sonia.scm.version.Version.parse; + +@Extension +public class PublicFlagUpdateStep implements UpdateStep { + + private static final Logger LOG = LoggerFactory.getLogger(PublicFlagUpdateStep.class); + + private static final String V1_REPOSITORY_BACKUP_FILENAME = "repositories.xml.v1.backup"; + + private final SCMContextProvider contextProvider; + private final XmlUserDAO userDAO; + private final XmlRepositoryDAO repositoryDAO; + + @Inject + public PublicFlagUpdateStep(SCMContextProvider contextProvider, XmlUserDAO userDAO, XmlRepositoryDAO repositoryDAO) { + this.contextProvider = contextProvider; + this.userDAO = userDAO; + this.repositoryDAO = repositoryDAO; + } + + @Override + public void doUpdate() throws JAXBException { + createNewAnonymousUserIfNotExists(); + deleteOldAnonymousUserIfAvailable(); + + JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); + LOG.info("Migrating public flags of repositories as RepositoryRolePermission 'READ' for user '_anonymous'"); + V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_BACKUP_FILENAME).ifPresent( + this::addRepositoryReadPermissionForAnonymousUser + ); + } + + @Override + public Version getTargetVersion() { + return parse("2.0.3"); + } + + @Override + public String getAffectedDataType() { + return "sonia.scm.repository.xml"; + } + + private void addRepositoryReadPermissionForAnonymousUser(V1RepositoryHelper.V1RepositoryDatabase v1RepositoryDatabase) { + User v2AnonymousUser = userDAO.get(SCMContext.USER_ANONYMOUS); + v1RepositoryDatabase.repositoryList.repositories + .stream() + .filter(V1Repository::isPublic) + .forEach(v1Repository -> { + Repository v2Repository = repositoryDAO.get(v1Repository.getId()); + LOG.info(String.format("Add RepositoryRole 'READ' to _anonymous user for repository: %s - %s/%s", v2Repository.getId(), v2Repository.getNamespace(), v2Repository.getName())); + v2Repository.addPermission(new RepositoryPermission(v2AnonymousUser.getId(), "READ", false)); + repositoryDAO.modify(v2Repository); + }); + } + + private void createNewAnonymousUserIfNotExists() { + if (!userExists(SCMContext.USER_ANONYMOUS)) { + LOG.info("Create new _anonymous user"); + userDAO.add(SCMContext.ANONYMOUS); + } + } + + private void deleteOldAnonymousUserIfAvailable() { + String oldAnonymous = "anonymous"; + if (userExists(oldAnonymous)) { + User anonymousUser = userDAO.get(oldAnonymous); + LOG.info("Delete obsolete anonymous user"); + userDAO.delete(anonymousUser); + } + } + + private boolean userExists(String username) { + return userDAO + .getAll() + .stream() + .anyMatch(user -> user.getName().equals(username)); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/V1Repository.java b/scm-webapp/src/main/java/sonia/scm/update/repository/V1Repository.java index 4ce823bd33..8b389e467b 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/V1Repository.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/V1Repository.java @@ -4,6 +4,7 @@ import sonia.scm.update.V1Properties; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; @@ -16,6 +17,7 @@ public class V1Repository { private String description; private String id; private String name; + @XmlElement(name="public") private boolean isPublic; private boolean archived; private String type; diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java new file mode 100644 index 0000000000..bba89b541f --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java @@ -0,0 +1,51 @@ +package sonia.scm.update.repository; + +import sonia.scm.SCMContextProvider; +import sonia.scm.store.StoreConstants; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.File; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; + +import static java.util.Optional.empty; +import static java.util.Optional.of; + +class V1RepositoryHelper { + + static File resolveV1File(SCMContextProvider contextProvider, String filename) { + return contextProvider + .resolve( + Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(filename) + ).toFile(); + } + + static Optional readV1Database(JAXBContext jaxbContext, SCMContextProvider contextProvider, String filename) throws JAXBException { + Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File(contextProvider,filename)); + if (unmarshal instanceof V1RepositoryHelper.V1RepositoryDatabase) { + return of((V1RepositoryHelper.V1RepositoryDatabase) unmarshal); + } else { + return empty(); + } + } + + static class RepositoryList { + @XmlElement(name = "repository") + List repositories; + } + + @XmlRootElement(name = "repository-db") + @XmlAccessorType(XmlAccessType.FIELD) + static class V1RepositoryDatabase { + long creationTime; + Long lastModified; + @XmlElement(name = "repositories") + RepositoryList repositoryList; + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java index a2f7656498..69354c294a 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java @@ -19,24 +19,17 @@ import sonia.scm.version.Version; import javax.inject.Inject; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.util.Collections.emptyList; -import static java.util.Optional.empty; -import static java.util.Optional.of; import static sonia.scm.update.V1PropertyReader.REPOSITORY_PROPERTY_READER; +import static sonia.scm.update.repository.V1RepositoryHelper.resolveV1File; import static sonia.scm.version.Version.parse; /** @@ -59,6 +52,8 @@ import static sonia.scm.version.Version.parse; @Extension public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { + private final String V1_REPOSITORY_FILENAME = "repositories" + StoreConstants.FILE_EXTENSION; + private static Logger LOG = LoggerFactory.getLogger(XmlRepositoryV1UpdateStep.class); private final SCMContextProvider contextProvider; @@ -97,12 +92,12 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { @Override public void doUpdate() throws JAXBException { - if (!resolveV1File().exists()) { + if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).exists()) { LOG.info("no v1 repositories database file found"); return; } - JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryDatabase.class); - readV1Database(jaxbContext).ifPresent( + JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); + V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_FILENAME).ifPresent( v1Database -> { v1Database.repositoryList.repositories.forEach(this::readMigrationEntry); v1Database.repositoryList.repositories.forEach(this::update); @@ -112,13 +107,13 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { } public List getRepositoriesWithoutMigrationStrategies() { - if (!resolveV1File().exists()) { + if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).exists()) { LOG.info("no v1 repositories database file found"); return emptyList(); } try { - JAXBContext jaxbContext = JAXBContext.newInstance(XmlRepositoryV1UpdateStep.V1RepositoryDatabase.class); - return readV1Database(jaxbContext) + JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); + return V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_FILENAME) .map(v1Database -> v1Database.repositoryList.repositories.stream()) .orElse(Stream.empty()) .filter(v1Repository -> !this.findMigrationStrategy(v1Repository).isPresent()) @@ -196,33 +191,4 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { return new RepositoryPermission(v1Permission.getName(), v1Permission.getType(), v1Permission.isGroupPermission()); } - private Optional readV1Database(JAXBContext jaxbContext) throws JAXBException { - Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File()); - if (unmarshal instanceof V1RepositoryDatabase) { - return of((V1RepositoryDatabase) unmarshal); - } else { - return empty(); - } - } - - private File resolveV1File() { - return contextProvider - .resolve( - Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve("repositories" + StoreConstants.FILE_EXTENSION) - ).toFile(); - } - - private static class RepositoryList { - @XmlElement(name = "repository") - private List repositories; - } - - @XmlRootElement(name = "repository-db") - @XmlAccessorType(XmlAccessType.FIELD) - private static class V1RepositoryDatabase { - private long creationTime; - private Long lastModified; - @XmlElement(name = "repositories") - private RepositoryList repositoryList; - } } diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java new file mode 100644 index 0000000000..68edc760c3 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java @@ -0,0 +1,118 @@ +package sonia.scm.update.repository; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junitpioneer.jupiter.TempDirectory; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.SCMContext; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryPermission; +import sonia.scm.repository.RepositoryRolePermissions; +import sonia.scm.repository.RepositoryTestData; +import sonia.scm.repository.xml.XmlRepositoryDAO; +import sonia.scm.update.UpdateStepTestUtil; +import sonia.scm.user.User; +import sonia.scm.user.xml.XmlUserDAO; + +import javax.xml.bind.JAXBException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junitpioneer.jupiter.TempDirectory.TempDir; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +@ExtendWith(TempDirectory.class) +class PublicFlagUpdateStepTest { + + @Mock + XmlUserDAO userDAO; + @Mock + XmlRepositoryDAO repositoryDAO; + @Captor + ArgumentCaptor repositoryCaptor; + + private UpdateStepTestUtil testUtil; + private PublicFlagUpdateStep updateStep; + private Repository REPOSITORY = RepositoryTestData.createHeartOfGold(); + + @BeforeEach + void mockScmHome(@TempDir Path tempDir) throws IOException { + testUtil = new UpdateStepTestUtil(tempDir); + updateStep = new PublicFlagUpdateStep(testUtil.getContextProvider(), userDAO, repositoryDAO); + + //prepare backup xml + V1RepositoryFileSystem.createV1Home(tempDir); + Files.move(tempDir.resolve("config").resolve("repositories.xml"), tempDir.resolve("config").resolve("repositories.xml.v1.backup")); + when(repositoryDAO.get((String) any())).thenReturn(REPOSITORY); + } + + @Test + void shouldDeleteOldAnonymousUserIfExists() throws JAXBException { + when(userDAO.getAll()).thenReturn(Collections.singleton(new User("anonymous"))); + User anonymous = new User("anonymous"); + doReturn(anonymous).when(userDAO).get("anonymous"); + doReturn(SCMContext.ANONYMOUS).when(userDAO).get(SCMContext.USER_ANONYMOUS); + + updateStep.doUpdate(); + + verify(userDAO).delete(anonymous); + } + + @Test + void shouldNotTryToDeleteOldAnonymousUserIfNotExists() throws JAXBException { + when(userDAO.getAll()).thenReturn(Collections.emptyList()); + doReturn(SCMContext.ANONYMOUS).when(userDAO).get(SCMContext.USER_ANONYMOUS); + + updateStep.doUpdate(); + + verify(userDAO, never()).delete(any()); + } + + @Test + void shouldCreateNewAnonymousUserIfNotExists() throws JAXBException { + doReturn(SCMContext.ANONYMOUS).when(userDAO).get(SCMContext.USER_ANONYMOUS); + when(userDAO.getAll()).thenReturn(Collections.singleton(new User("trillian"))); + + updateStep.doUpdate(); + + verify(userDAO).add(SCMContext.ANONYMOUS); + } + + @Test + void shouldNotCreateNewAnonymousUserIfAlreadyExists() throws JAXBException { + doReturn(SCMContext.ANONYMOUS).when(userDAO).get(SCMContext.USER_ANONYMOUS); + when(userDAO.getAll()).thenReturn(Collections.singleton(new User("_anonymous"))); + + updateStep.doUpdate(); + + verify(userDAO, never()).add(SCMContext.ANONYMOUS); + } + + @Test + void shouldMigratePublicFlagToAnonymousRepositoryPermission() throws JAXBException { + when(userDAO.getAll()).thenReturn(Collections.emptyList()); + when(userDAO.get("_anonymous")).thenReturn(SCMContext.ANONYMOUS); + + updateStep.doUpdate(); + + verify(repositoryDAO, times(2)).modify(repositoryCaptor.capture()); + + RepositoryPermission migratedRepositoryPermission = repositoryCaptor.getValue().getPermissions().iterator().next(); + assertThat(migratedRepositoryPermission.getName()).isEqualTo(SCMContext.USER_ANONYMOUS); + assertThat(migratedRepositoryPermission.getRole()).isEqualTo("READ"); + assertThat(migratedRepositoryPermission.isGroupPermission()).isFalse(); + } +} diff --git a/scm-webapp/src/test/resources/sonia/scm/update/repository/scm-home.v1.zip b/scm-webapp/src/test/resources/sonia/scm/update/repository/scm-home.v1.zip index 5d936db5e264ac6182855e34a5aae82871c2c3fd..4b21785f20ee59325f4b6208385143a4abe44e1d 100644 GIT binary patch literal 14520 zcmcgz3s_BQ7e3uPDT;JgF;TjSLb)`y6iO7L8Zk*ahdPHYNE(isq(&NPGKo>0<&K8&Y*k<|1Yf)aAgT;iMxA@{ zYzR_?ebXNY31LUtt_uqlV9m*YvS{)_>^Fu-!U~)1)c=y5X4`AEidf%P3!{AG9K-ng zwrzgp9d3)`uD73_X1PDp#ooZ)IehNgBU2YCpRWrozSQL8wKdN9x0Fwdt=LBuGk$N_ zr>i}=wsM{AAlJHsy0c7IXT+Dzwq+Xlz8!zm@r2itGe!q;HV*1%Q)TMh`M~>WOJwr= zeWwiyW817k;)`ckXdcw>8h=l}>wL7lmxqe#R^^FisaP~1BGIvi$T1iic&w}tN};A! zaW0#xZ)uNCN{o4mmMCP;9gChBQlhf2RLSGxp#67?^11$*th5{DkK64{zk9xMbNj_Y zyFACFmin~T(X-3FPUd#K-(a|ST9wcA+}I??Bz?a&AM+RkD6|0+$OnF+=34IN^ZZ>UO_|CHl&b8yD+#tAQ6?$7i+6)6XD z6qD?4RgUEcWI}X~I)&>YVhyJ^NwX!?L&|xq9@OJIon6zX_aamUs=U1<%X8(h5Ex;LtQToe7)h4`g%XJQO>LHTzIJ#koNHI(gxSy ze$B}y)e4V|wG!`YD}D(nPH1gSvvk~dc}&IU+TWDE1mBadso{bIH2GZ~lZS-}!W5l= z1nj{gqN0T3iFGXPaSfq@k3+quUmLg`}7?A z8^^WXPB4&ztBJp%;{Az6@mI!F7EKB;FCUS7XY;`AyKfjC=REFgkbe*r zU9$hmll`x8ew|Zmpw&UagW0jSGd*t#phTlIqYNu)Dotki`{;%y!nQAGl1;xMY{OQ~%?>LVo zj+PeQ7d^i_-Z9T`LHOR+M=FyPb9U*TTh1(UIF=)S$1-WqO~1-CwedR_nO#VG=5PIB zB2u3Cciy0l&%Q8uE{fw4=}+z-!wns(lX7x5My`NzYC?Rp%)NAVw?P2#;Yd9Msk zsoEf{|ZI_;#m`$roB`QxL z(tFevXUr;Iak?aB+jLc*ZAvTp-Ck4w&)T2Huc?iVF!<1wSZ{Sv>1zi#6sKpq-Hd=V>UC8`fs|(&dx*F!!W?;~EWODFNhRX&fYey)fnR0roeZNpE(bQ8kZe=I$_@G$9deH=fZOC z?)diG4QIal?6IRjXRaD+cE#dH^$+(Jyr1(}$++#Lbxlo4hMtEjax}d#;~#5{!tAkY zPQ38w{O7pDFJ&fUJ}xO607~`txr7Ecc?JU%WOu1zH7hj7!Ovi}5o@%2B@py1 zNh<;Pt7ARzy9IvMB12(|K{s3{m;%z^7$i77QE(CLuvMYK-KeS3P{H0pMAgNdG?IWi z!xfn(Xaxdf(OZm_yXT3y7Ve%_HB~b_XN|0>^0c;{Y11Sx=nhuwhUFW)0tnsXHxMu2i`ma)#l*-X<@g^(G4{px8AD309H?_7b`}r^XUZv}Tnt5oF zZ0>`(2;9VLh8O_$2aF*S0tn@XL{K~)07Zr#CJj0~c)2Y27L@Q=!GX(UVUcvgEG~DY zEZC+JBH%7v5gZgL3;J*h=&J&QR?2Y1R4CY-~O5yx#7{>r9unb zOgcE;(r7V^q{x6*4lSBdeW4*#kyJ7;MTtiOhMUMT1*eQ3N$)Tf5PY>^O7sLwDUsbo z*b~A`mEg;NJX48rfTE`m2VrtZJv0DGrZAUYAwmO$7Kt@=5`2#QznSoHLW@b{(jZ)8 z!c&D73x!T3V~enqem3M8Ln{&r9gj3>DAABVZ|H~$CxRQ+GixY)=pbVnip31$hRXsh z^709s6#&D&iMMZci@bcINg`Q+92uDGB2j)TTu_fi5L} zM``g+k%^Zu*QK(9xlSy9FxMSuu=fsn0pnL0^k8}sT?0Rlqv0B1V)i*5V7Z{fN!T_d zB;-HdHpt0zq>)Ua-9TzO!I6H?%O*~l?(ZB=%B6@d~OT3+Um6OL8xHiyG#Fq?BP3^$p$xq)v?|_CP`J&({ zs~>pf0~Vqz0rU@OeBLJsEWLZ31T_Sn1h~I|iKridM{sC--XE9l?t%G!#M9#B<>v3na=%;*SYDph82DENN8uNTtaK9v`5g$VWrpW~q4QMEGK?0Z13QCg=JhVYW5hHc+kwG?m_53Q78!1rYD<@4#pnyO_ zktPY0!mB1tI@0~q5T8_;?*n*xhKAigX;iXb1>p<-Ng5$V{RD3?Bfc_$K z+54Iz@!d>31yEF=p~!J@6z~;?ioPPA47_VX!zS_oG4bGJc#EbP9(aF*h9X>wjCf_z zqy-8LG!&`n3oW5aDUgF{3#x`V*NNAH&vVg~n&sZ{E+7>BYy(FwBqWY^Vjt!6Zb>I3 zOnC~FAd%#oL8L^HbS1zG=N3~ zjn6aG>w8vuR}X;)l2;GFM85DqmVt&MB{V!BECzkZ0&)Ez`oQN|V*l#1ueCwghiK*j zs5sD2M8Tl%KETC6maYg?9cU;LErS>M`a(Y`ar`zgBbSx zY=jpanr;Yp(Z6Z9A#?Wvst`03@iXdsCIl|@t#JWDa&-u|^E-4M!FM8xXF`6WCcfgM zi2D#yLMUlS-E$MPXNV4EAD|*Z*6eT6_UuhT< Pv0rnsyXu93Fc|*>fMK>$ literal 13593 zcmchddt6NEAIC@cNl{7nE2SG1B^CNf%B7WBrOPUk(M*>aDk%xMgsilZcEjpIVcAWT zEyZ?`P3gj}ke2kLHeC>f(C?g?Y0i00bI#0}UVeGyHU9a$pYQkiKA-P*o`<`uxP&Z) z{o`8b#`(bcTbiOp31TrfFoG?-JgF4%l)U!U^Ut-f-W)TYGESmXoI+v$<<1j$ybKhO zhXf*M8(EQzC{_f67RixWfiI&Bfn_ML%mJyn1}V_L8lc|^$U1@VeIAL=!Co3 zO{lO`=SN3&Ik%is{YGz7`krz(bE<~VyE(twUUqLU z(K?&GW77B;4SEiP4?Vg%q7Hgy7HeFJ?=}nGQ@F%f;hg&WIe)9aFN+m}(}TnnchJwQ z28thnrt|u)wfV8km)Oa{KyXllI4T^%RL`eLK6SM7u~jvs}{k)1=&c1$ivL z40`JAnkRi$df)Z#*wuIAlI0oOq>k3q&Y5mC?pJc&f83@Su&BXnaZY@aZIZfgx0g|# z@{09d%@&I_*2TZ2|FtyEg{nEn-_j^IiX$wuUsZ&)If$ zlhX~`>|Z%GFZH<^H4e$gIrl=hy$y2~JBv{$`7#uWDv}R$)$lUoaEWjI^{nz|9k*1D z@B3{*>=vzERCkY(Wj&|ocRP9HI;;sx^|4ZWnCt)LvsU`FgfsqDj7K`vldg9>7<~V8 zsMGe(Wyi|Jn_bSn2vKqiPTe`jb7s?p-=?kc?(?vxe!n*{!BhT5Mp*Grt5sEtUtFA3 zVOr*VVY<24;D0?M^O+~p&c-TMZ(8=k<7i5lL&IxIT(+y_Ku)bEwSMc?6MGpaPTT3M zUGX;FrTorHy4pWFyL9MhZf6t9g++g-xz)G-!0$IiGCCxsWJ3^f2-LI$!ky2 zTJBA!PQ3Q!!A6bt#E_=m#%I%P&&uiSZIu}CkW4#LH+g$Tdrm9B>lVr?R5T`dH2OHO_udX zj(Exxgd{FmWhmq0lVu#JNSVmc^0xR8?0IL?#kb`*{e8QoG`cT*X3-b@8K#pLtQNAU zb(w?1;q#ZvJ@)RPnH*SptWG^s_I#aojj`kNDJQ48P!$}+m&C?a-0e3n^)QNQ&C~8E zQQ5F1;kf>@rovVJL$nnp7kVGhYVU05-+c1vVjQP+RAtHVVwK z)>Vo3AKa;E=(!ejJ>mx~=TF{Wery}I+D<{LvITOVXTFuQ&OoPh5Okl&XeO^1-T1p$ zcybx!K5}~o9h}q3By19`{dZoP{))nQCgu8JrIzW(0e4fcg%zovPj1_i9T)4pB83`6 ze;9Z*c(#PLyi`lUP|sa0-{sDdIjiLw3)J^-E>N;hRJ?eht3hV>X(?%!Lw)W5AlZmX|>g~O)1*I&!}r#`;7?x{0v{PTmlP2x{<6!+g#mKY8$OziATHMPyG zoK^ef(J9Gc+TUXL@3W9#VXJM@2)?ugvZF-E&=rs)xH*y*5y=Y|$81lotYz-DR4DB* zQy8pLSTL?e|DxZ!V*wf4|Jc?1gJIaz7Dnxp^nFUtiuRp8QC(NxT@cjS>uOUjtzmZM zQQ~V;S#i(84GXoewhgt>e%hC?IaAHrug#{rG4Wc2;|i5KN4%a->D2YplxUu-wWn%U zeZf3`qnc?4@9t7MeEha%KJ&@oQ?ZAeV~cXD+H>DzrJsEDe4g$t?~6?{G>jUL=*n4| zc>Y^QHTfyO;nb}-sg6TG-|X+4+EM#sez{GASdHoX&z_-|^AcX`ew2cDgwuo%LZ+D0*;^|Cl^*=7gzQK(v>^-@(>y9B ziroMu`TOBa^O>^|JsV6@SA_J??rH(GR8C(WwD8G~Zu z{ft@^bkaDB!Z~J$6a^EX8g@}|e36XsjbSt)rx>iFHi2RoE0{ag2po>EvQq@fM$k5h zs%?miZ=46~8$22~xc- zB9IwGANk@z`iK&p{4t!)sRS!V9Sfoy;=m3 zapb?U;bS+L?{EXw59s?i%f>GuA^Zb8+%N(6Rt&p-Q^EDaR>z!cQVbzHip@Zp0W435 zzS^NYg|i|=73FIN>_xIgM_i6~H%WTce9eGAAc`Ky{Zd1k zVo97EbQo+3uP2ix%@%=#^it9|dr@)7`6JC-FeWDIR0>5#cUx-_$h`K8LxU1Q+q`Llk>uLy@^aU|zAeg6h~np<6+7*g$5? zG`D4cr-iQvQ-9?%F^v<`5yyLqRO7~_K~hPkG=IB}WpvMyH%k*pIA__h1PvQwUA)c@V9+7Lw-1Jn~p5SaS3W8(MNB z^zO!$L??iA=MRa)?`;G*82wO!7MGIbiSwRKAWir_mq2s$djwjuAJIg;P7tL5?@k@9 zx>uUFQs9Oi(uHr>`L33ui*+$Yps@aibkTX`-n2uq@R=fz#n!6=Agc$xlmfEsTX(@p z7=7o?Ndo-n)8iO|Rps2kL$bI##{ZpVdVz2>^ysO@rEv^O3)(xNhER#)44lFdAfMy?=m7B? zARvrPljIqC0Hck7flQF(DTV-L?s)uMjZnB#<5*D{LZG;lA`uGjQXg%49|%w*(;*Rq z|KZmMGM6idpE=aMbw}X-L=Cp%$!BAdT5CViQZ_rD<6$B;|)f`BojDSQI2}X^$ zw;fYAcz$M~64xl?myI>-!ap0mjjRR{T;4qY~Bru&| z{~$>Nz2t*nn#hOS6ett#Ndn_ylgOQG^l<~d>za@}q^Sr+jCwD$iu+XYcLrvQ=^_GxUUA}iIzbAl1LJH zvjE9mn+;Ikia0nGt zuuvC00m!(3y9Ca-02?;=5P=>Saz$7IYJR|FbLIzZv# Date: Tue, 19 Nov 2019 14:04:47 +0100 Subject: [PATCH 034/144] remove repository public flag --- .../scm/repository/AbstactImportHandler.java | 1 - .../java/sonia/scm/repository/Repository.java | 19 +------------------ .../RepositoryDtoToRepositoryMapper.java | 1 - .../AuthorizationChangedEventProducer.java | 3 +-- .../MigrateVerbsToPermissionRoles.java | 1 - 5 files changed, 2 insertions(+), 23 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java index 1f1e7cfefb..63d4638ab8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java @@ -113,7 +113,6 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler Repository repository = new Repository(); repository.setName(repositoryName); - repository.setPublicReadable(false); repository.setType(getTypeName()); return repository; 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 463085a7ea..6b7df70081 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -84,7 +84,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per @XmlElement(name = "permission") private Set permissions = new HashSet<>(); @XmlElement(name = "public") - private boolean publicReadable = false; private String type; @@ -225,15 +224,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per return Util.isEmpty(healthCheckFailures); } - /** - * Returns true if the {@link Repository} is public readable. - * - * @return true if the {@link Repository} is public readable - */ - public boolean isPublicReadable() { - return publicReadable; - } - /** * Returns true if the {@link Repository} is valid. *
    @@ -292,10 +282,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per return this.permissions.remove(permission); } - public void setPublicReadable(boolean publicReadable) { - this.publicReadable = publicReadable; - } - public void setType(String type) { this.type = type; } @@ -332,7 +318,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per repository.setLastModified(lastModified); repository.setDescription(description); repository.setPermissions(permissions); - repository.setPublicReadable(publicReadable); // do not copy health check results } @@ -360,7 +345,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per && Objects.equal(name, other.name) && Objects.equal(contact, other.contact) && Objects.equal(description, other.description) - && Objects.equal(publicReadable, other.publicReadable) && Objects.equal(permissions, other.permissions) && Objects.equal(type, other.type) && Objects.equal(creationDate, other.creationDate) @@ -371,7 +355,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per @Override public int hashCode() { - return Objects.hashCode(id, namespace, name, contact, description, publicReadable, + return Objects.hashCode(id, namespace, name, contact, description, permissions, type, creationDate, lastModified, properties, healthCheckFailures); } @@ -384,7 +368,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per .add("name", name) .add("contact", contact) .add("description", description) - .add("publicReadable", publicReadable) .add("permissions", permissions) .add("type", type) .add("lastModified", lastModified) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java index b9add14529..ab36672f83 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java @@ -8,7 +8,6 @@ public abstract class RepositoryDtoToRepositoryMapper extends BaseDtoMapper { @Mapping(target = "creationDate", ignore = true) @Mapping(target = "id", ignore = true) - @Mapping(target = "publicReadable", ignore = true) @Mapping(target = "healthCheckFailures", ignore = true) public abstract Repository map(RepositoryDto repositoryDto, @Context String id); diff --git a/scm-webapp/src/main/java/sonia/scm/security/AuthorizationChangedEventProducer.java b/scm-webapp/src/main/java/sonia/scm/security/AuthorizationChangedEventProducer.java index fc653efa52..6914f89286 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/AuthorizationChangedEventProducer.java +++ b/scm-webapp/src/main/java/sonia/scm/security/AuthorizationChangedEventProducer.java @@ -168,8 +168,7 @@ public class AuthorizationChangedEventProducer { } private boolean isAuthorizationDataModified(Repository repository, Repository beforeModification) { - return repository.isPublicReadable() != beforeModification.isPublicReadable() - || !(repository.getPermissions().containsAll(beforeModification.getPermissions()) && beforeModification.getPermissions().containsAll(repository.getPermissions())); + return !(repository.getPermissions().containsAll(beforeModification.getPermissions()) && beforeModification.getPermissions().containsAll(repository.getPermissions())); } private void fireEventForEveryUser() { diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java index be40ab3a6d..fc2dec12a6 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java @@ -90,7 +90,6 @@ public class MigrateVerbsToPermissionRoles implements UpdateStep { repository.setCreationDate(oldRepository.creationDate); repository.setHealthCheckFailures(oldRepository.healthCheckFailures); repository.setLastModified(oldRepository.lastModified); - repository.setPublicReadable(oldRepository.publicReadable); return repository; } From e432d6d210c31435160a0f2cc098f8cb785acdfe Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 14:23:05 +0100 Subject: [PATCH 035/144] refactor --- .../src/main/java/sonia/scm/repository/Repository.java | 1 - .../sonia/scm/update/repository/PublicFlagUpdateStep.java | 4 +--- .../sonia/scm/update/repository/V1RepositoryHelper.java | 5 +++-- .../scm/update/repository/XmlRepositoryV1UpdateStep.java | 7 ++----- 4 files changed, 6 insertions(+), 11 deletions(-) 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 6b7df70081..e35e12bbb0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -83,7 +83,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per private String name; @XmlElement(name = "permission") private Set permissions = new HashSet<>(); - @XmlElement(name = "public") private String type; diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java index b2e3c17980..5eedce12d0 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java @@ -14,7 +14,6 @@ import sonia.scm.user.xml.XmlUserDAO; import sonia.scm.version.Version; import javax.inject.Inject; -import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import static sonia.scm.version.Version.parse; @@ -42,9 +41,8 @@ public class PublicFlagUpdateStep implements UpdateStep { createNewAnonymousUserIfNotExists(); deleteOldAnonymousUserIfAvailable(); - JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); LOG.info("Migrating public flags of repositories as RepositoryRolePermission 'READ' for user '_anonymous'"); - V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_BACKUP_FILENAME).ifPresent( + V1RepositoryHelper.readV1Database(contextProvider, V1_REPOSITORY_BACKUP_FILENAME).ifPresent( this::addRepositoryReadPermissionForAnonymousUser ); } diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java index bba89b541f..43ddb2671b 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java @@ -26,8 +26,9 @@ class V1RepositoryHelper { ).toFile(); } - static Optional readV1Database(JAXBContext jaxbContext, SCMContextProvider contextProvider, String filename) throws JAXBException { - Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File(contextProvider,filename)); + static Optional readV1Database(SCMContextProvider contextProvider, String filename) throws JAXBException { + JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryDatabase.class); + Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File(contextProvider, filename)); if (unmarshal instanceof V1RepositoryHelper.V1RepositoryDatabase) { return of((V1RepositoryHelper.V1RepositoryDatabase) unmarshal); } else { diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java index 69354c294a..6230919503 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java @@ -17,7 +17,6 @@ import sonia.scm.update.V1Properties; import sonia.scm.version.Version; import javax.inject.Inject; -import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import java.io.IOException; import java.nio.file.Files; @@ -96,8 +95,7 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { LOG.info("no v1 repositories database file found"); return; } - JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); - V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_FILENAME).ifPresent( + V1RepositoryHelper.readV1Database(contextProvider, V1_REPOSITORY_FILENAME).ifPresent( v1Database -> { v1Database.repositoryList.repositories.forEach(this::readMigrationEntry); v1Database.repositoryList.repositories.forEach(this::update); @@ -112,8 +110,7 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { return emptyList(); } try { - JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryHelper.V1RepositoryDatabase.class); - return V1RepositoryHelper.readV1Database(jaxbContext, contextProvider, V1_REPOSITORY_FILENAME) + return V1RepositoryHelper.readV1Database(contextProvider, V1_REPOSITORY_FILENAME) .map(v1Database -> v1Database.repositoryList.repositories.stream()) .orElse(Stream.empty()) .filter(v1Repository -> !this.findMigrationStrategy(v1Repository).isPresent()) From e7cb674bb5fa81db7e5ecf6f4c7d372957a18bfb Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 14:27:14 +0100 Subject: [PATCH 036/144] fix anonymous email --- scm-core/src/main/java/sonia/scm/SCMContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-core/src/main/java/sonia/scm/SCMContext.java b/scm-core/src/main/java/sonia/scm/SCMContext.java index 42d311ed2a..f5367625bb 100644 --- a/scm-core/src/main/java/sonia/scm/SCMContext.java +++ b/scm-core/src/main/java/sonia/scm/SCMContext.java @@ -59,7 +59,7 @@ public final class SCMContext */ public static final User ANONYMOUS = new User(USER_ANONYMOUS, "SCM Anonymous", - "scm-anonymous@scm-manager.com"); + "scm-anonymous@scm-manager.org"); /** Singleton instance of {@link SCMContextProvider} */ private static volatile SCMContextProvider provider; From aa7b6f528223ec74406c7a30902a2698be8dd0eb Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 15:42:22 +0100 Subject: [PATCH 037/144] only migrate public flag if repository-v1-xml-backup --- .../MigrateVerbsToPermissionRoles.java | 2 -- .../update/repository/V1RepositoryHelper.java | 25 +++++++++++-------- .../repository/XmlRepositoryV1UpdateStep.java | 4 +-- .../it/RepositorySimplePermissionITCase.java | 1 - 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java index fc2dec12a6..f33f4200c4 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrateVerbsToPermissionRoles.java @@ -148,8 +148,6 @@ public class MigrateVerbsToPermissionRoles implements UpdateStep { private String name; @XmlElement(name = "permission") private final Set permissions = new HashSet<>(); - @XmlElement(name = "public") - private boolean publicReadable = false; private boolean archived = false; private String type; } diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java index 43ddb2671b..10cf343cff 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java @@ -19,21 +19,26 @@ import static java.util.Optional.of; class V1RepositoryHelper { - static File resolveV1File(SCMContextProvider contextProvider, String filename) { - return contextProvider - .resolve( - Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(filename) - ).toFile(); + static Optional resolveV1File(SCMContextProvider contextProvider, String filename) { + File v1XmlFile = contextProvider.resolve(Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(filename)).toFile(); + if (v1XmlFile.exists()) { + return Optional.of(v1XmlFile); + } + return Optional.empty(); } static Optional readV1Database(SCMContextProvider contextProvider, String filename) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(V1RepositoryDatabase.class); - Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File(contextProvider, filename)); - if (unmarshal instanceof V1RepositoryHelper.V1RepositoryDatabase) { - return of((V1RepositoryHelper.V1RepositoryDatabase) unmarshal); - } else { - return empty(); + Optional file = resolveV1File(contextProvider, filename); + if (file.isPresent()) { + Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(file.get()); + if (unmarshal instanceof V1RepositoryHelper.V1RepositoryDatabase) { + return of((V1RepositoryHelper.V1RepositoryDatabase) unmarshal); + } else { + return empty(); + } } + return empty(); } static class RepositoryList { diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java index 6230919503..dd1284492b 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java @@ -91,7 +91,7 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { @Override public void doUpdate() throws JAXBException { - if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).exists()) { + if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).isPresent()) { LOG.info("no v1 repositories database file found"); return; } @@ -105,7 +105,7 @@ public class XmlRepositoryV1UpdateStep implements CoreUpdateStep { } public List getRepositoriesWithoutMigrationStrategies() { - if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).exists()) { + if (!resolveV1File(contextProvider, V1_REPOSITORY_FILENAME).isPresent()) { LOG.info("no v1 repositories database file found"); return emptyList(); } diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositorySimplePermissionITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositorySimplePermissionITCase.java index 7900f11096..5a0ca8fc38 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositorySimplePermissionITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositorySimplePermissionITCase.java @@ -94,7 +94,6 @@ public class RepositorySimplePermissionITCase repository.setName("test-repo"); repository.setType("git"); -// repository.setPublicReadable(false); ScmClient client = createAdminClient(); From 303458c44e5d1e7737f08d609f5d83840895b59c Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 15:06:12 +0000 Subject: [PATCH 038/144] Close branch bugfix/outdated_context_bottom_border From fd7527717673901827216b51c56ad09da1679acc Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 19 Nov 2019 16:43:45 +0100 Subject: [PATCH 039/144] cleanup --- scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java | 1 + .../java/sonia/scm/update/repository/V1RepositoryHelper.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java index 1b48da792b..6765f0e2d7 100644 --- a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java @@ -53,6 +53,7 @@ class AnonymousAccessITCase { @Test void shouldRejectRepositoryResourceWithoutAuthentication() { + setAnonymousAccess(false); assertEquals(401, RestAssured.given() .when() .get(RestUtil.REST_BASE_URL.resolve("repositories/")) diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java index 10cf343cff..f2a60c5529 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/V1RepositoryHelper.java @@ -32,8 +32,8 @@ class V1RepositoryHelper { Optional file = resolveV1File(contextProvider, filename); if (file.isPresent()) { Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(file.get()); - if (unmarshal instanceof V1RepositoryHelper.V1RepositoryDatabase) { - return of((V1RepositoryHelper.V1RepositoryDatabase) unmarshal); + if (unmarshal instanceof V1RepositoryDatabase) { + return of((V1RepositoryDatabase) unmarshal); } else { return empty(); } From 49bdf18fb052dc6e25e7440267b8bda864d5ef5d Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 20 Nov 2019 08:24:42 +0100 Subject: [PATCH 040/144] fix integration tests --- .../test/java/sonia/scm/it/AnonymousAccessITCase.java | 1 - .../scm/update/repository/PublicFlagUpdateStep.java | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java index 6765f0e2d7..1b48da792b 100644 --- a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java @@ -53,7 +53,6 @@ class AnonymousAccessITCase { @Test void shouldRejectRepositoryResourceWithoutAuthentication() { - setAnonymousAccess(false); assertEquals(401, RestAssured.given() .when() .get(RestUtil.REST_BASE_URL.resolve("repositories/")) diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java index 5eedce12d0..24bcbc363e 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/PublicFlagUpdateStep.java @@ -38,12 +38,13 @@ public class PublicFlagUpdateStep implements UpdateStep { @Override public void doUpdate() throws JAXBException { - createNewAnonymousUserIfNotExists(); - deleteOldAnonymousUserIfAvailable(); - LOG.info("Migrating public flags of repositories as RepositoryRolePermission 'READ' for user '_anonymous'"); V1RepositoryHelper.readV1Database(contextProvider, V1_REPOSITORY_BACKUP_FILENAME).ifPresent( - this::addRepositoryReadPermissionForAnonymousUser + v1RepositoryDatabase -> { + createNewAnonymousUserIfNotExists(); + deleteOldAnonymousUserIfAvailable(); + addRepositoryReadPermissionForAnonymousUser(v1RepositoryDatabase); + } ); } From 0763ae94406658aa96e01c884189cf0edf479557 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 08:29:05 +0100 Subject: [PATCH 041/144] Add optional heades for api client push and put --- scm-ui/ui-components/src/apiclient.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/scm-ui/ui-components/src/apiclient.ts b/scm-ui/ui-components/src/apiclient.ts index babb0b64d7..3fb03b067f 100644 --- a/scm-ui/ui-components/src/apiclient.ts +++ b/scm-ui/ui-components/src/apiclient.ts @@ -80,23 +80,24 @@ class ApiClient { return fetch(createUrl(url), applyFetchOptions({})).then(handleFailure); } - post(url: string, payload?: any, contentType = "application/json") { - return this.httpRequestWithJSONBody("POST", url, contentType, payload); + post(url: string, payload?: any, contentType = "application/json", additionalHeaders = new Headers()) { + return this.httpRequestWithJSONBody("POST", url, contentType, additionalHeaders, payload); } - postBinary(url: string, fileAppender: (p: FormData) => void) { + postBinary(url: string, fileAppender: (p: FormData) => void, additionalHeaders = new Headers()) { const formData = new FormData(); fileAppender(formData); const options: RequestInit = { method: "POST", - body: formData + body: formData, + headers: additionalHeaders }; return this.httpRequestWithBinaryBody(options, url); } - put(url: string, payload: any, contentType = "application/json") { - return this.httpRequestWithJSONBody("PUT", url, contentType, payload); + put(url: string, payload: any, contentType = "application/json", additionalHeaders = new Headers()) { + return this.httpRequestWithJSONBody("PUT", url, contentType, additionalHeaders, payload); } head(url: string) { @@ -115,9 +116,16 @@ class ApiClient { return fetch(createUrl(url), options).then(handleFailure); } - httpRequestWithJSONBody(method: string, url: string, contentType: string, payload?: any): Promise { + httpRequestWithJSONBody( + method: string, + url: string, + contentType: string, + additionalHeaders: Headers, + payload?: any + ): Promise { const options: RequestInit = { - method: method + method: method, + headers: additionalHeaders }; if (payload) { options.body = JSON.stringify(payload); From 18c94352cfbdb0c783574e43d3334bdcf6dd3e1d Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 20 Nov 2019 08:36:18 +0100 Subject: [PATCH 042/144] cleanup --- .../sonia/scm/update/repository/PublicFlagUpdateStepTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java index 68edc760c3..cbd8312642 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java @@ -61,8 +61,8 @@ class PublicFlagUpdateStepTest { @Test void shouldDeleteOldAnonymousUserIfExists() throws JAXBException { - when(userDAO.getAll()).thenReturn(Collections.singleton(new User("anonymous"))); User anonymous = new User("anonymous"); + when(userDAO.getAll()).thenReturn(Collections.singleton(anonymous)); doReturn(anonymous).when(userDAO).get("anonymous"); doReturn(SCMContext.ANONYMOUS).when(userDAO).get(SCMContext.USER_ANONYMOUS); From 20659bc32e23950e74f2d7d3c1260d3710044cc3 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 08:59:57 +0100 Subject: [PATCH 043/144] Add post and put with text --- scm-ui/ui-components/src/apiclient.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scm-ui/ui-components/src/apiclient.ts b/scm-ui/ui-components/src/apiclient.ts index 3fb03b067f..4f2a8a735e 100644 --- a/scm-ui/ui-components/src/apiclient.ts +++ b/scm-ui/ui-components/src/apiclient.ts @@ -84,6 +84,14 @@ class ApiClient { return this.httpRequestWithJSONBody("POST", url, contentType, additionalHeaders, payload); } + postText(url: string, payload: string, additionalHeaders = new Headers()) { + return this.httpRequestWithTextBody("POST", url, additionalHeaders, payload); + } + + putText(url: string, payload: string, additionalHeaders = new Headers()) { + return this.httpRequestWithTextBody("PUT", url, additionalHeaders, payload); + } + postBinary(url: string, fileAppender: (p: FormData) => void, additionalHeaders = new Headers()) { const formData = new FormData(); fileAppender(formData); @@ -133,6 +141,15 @@ class ApiClient { return this.httpRequestWithBinaryBody(options, url, contentType); } + httpRequestWithTextBody(method: string, url: string, additionalHeaders: Headers, payload: string) { + const options: RequestInit = { + method: method, + headers: additionalHeaders + }; + options.body = payload; + return this.httpRequestWithBinaryBody(options, url, "text/plain"); + } + httpRequestWithBinaryBody(options: RequestInit, url: string, contentType?: string) { options = applyFetchOptions(options); if (contentType) { From a2474896cc38c7858f9a4dcf036c7dba3a4ef8ed Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 10:44:11 +0100 Subject: [PATCH 044/144] Fix types --- scm-ui/ui-components/src/apiclient.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/scm-ui/ui-components/src/apiclient.ts b/scm-ui/ui-components/src/apiclient.ts index 4f2a8a735e..4c1bad8ac1 100644 --- a/scm-ui/ui-components/src/apiclient.ts +++ b/scm-ui/ui-components/src/apiclient.ts @@ -80,19 +80,19 @@ class ApiClient { return fetch(createUrl(url), applyFetchOptions({})).then(handleFailure); } - post(url: string, payload?: any, contentType = "application/json", additionalHeaders = new Headers()) { + post(url: string, payload?: any, contentType = "application/json", additionalHeaders: Record = {}) { return this.httpRequestWithJSONBody("POST", url, contentType, additionalHeaders, payload); } - postText(url: string, payload: string, additionalHeaders = new Headers()) { + postText(url: string, payload: string, additionalHeaders: Record = {}) { return this.httpRequestWithTextBody("POST", url, additionalHeaders, payload); } - putText(url: string, payload: string, additionalHeaders = new Headers()) { + putText(url: string, payload: string, additionalHeaders: Record = {}) { return this.httpRequestWithTextBody("PUT", url, additionalHeaders, payload); } - postBinary(url: string, fileAppender: (p: FormData) => void, additionalHeaders = new Headers()) { + postBinary(url: string, fileAppender: (p: FormData) => void, additionalHeaders: Record = {}) { const formData = new FormData(); fileAppender(formData); @@ -104,7 +104,7 @@ class ApiClient { return this.httpRequestWithBinaryBody(options, url); } - put(url: string, payload: any, contentType = "application/json", additionalHeaders = new Headers()) { + put(url: string, payload: any, contentType = "application/json", additionalHeaders: Record = {}) { return this.httpRequestWithJSONBody("PUT", url, contentType, additionalHeaders, payload); } @@ -128,7 +128,7 @@ class ApiClient { method: string, url: string, contentType: string, - additionalHeaders: Headers, + additionalHeaders: Record, payload?: any ): Promise { const options: RequestInit = { @@ -141,7 +141,12 @@ class ApiClient { return this.httpRequestWithBinaryBody(options, url, contentType); } - httpRequestWithTextBody(method: string, url: string, additionalHeaders: Headers, payload: string) { + httpRequestWithTextBody( + method: string, + url: string, + additionalHeaders: Record = {}, + payload: string + ) { const options: RequestInit = { method: method, headers: additionalHeaders @@ -156,7 +161,7 @@ class ApiClient { if (!options.headers) { options.headers = new Headers(); } - // @ts-ignore + // @ts-ignore We are sure that here we only get headers of type Record options.headers["Content-Type"] = contentType; } From 9e9df35fdba8abe6b9974aae333814417311c783 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 Nov 2019 10:57:32 +0100 Subject: [PATCH 045/144] upgrade resteasy, legman and hibernate-validator * resteasy from 3.6.2.Final to 4.4.1.Final * legman from 1.5.1 to 1.6.0 * hibernate-validator from 5.3.6.Final to 6.1.0.Final --- pom.xml | 12 ++++++--- scm-core/pom.xml | 2 +- scm-plugins/pom.xml | 8 +++++- .../v2/resources/GitConfigResourceTest.java | 2 +- ...HgConfigAutoConfigurationResourceTest.java | 2 +- .../HgConfigInstallationsResourceTest.java | 2 +- .../HgConfigPackageResourceTest.java | 2 +- .../v2/resources/HgConfigResourceTest.java | 2 +- .../v2/resources/SvnConfigResourceTest.java | 2 +- scm-webapp/pom.xml | 26 ++++++++++++++----- .../ResteasyAllInOneServletDispatcher.java | 7 ++++- .../resources/AuthenticationResourceTest.java | 7 +++-- .../resources/AutoCompleteResourceTest.java | 2 +- .../AvailablePluginResourceTest.java | 2 +- .../v2/resources/BranchRootResourceTest.java | 16 +++++------- .../resources/ChangesetRootResourceTest.java | 2 +- .../api/v2/resources/ConfigResourceTest.java | 2 +- .../api/v2/resources/DiffResourceTest.java | 2 +- .../scm/api/v2/resources/DispatcherMock.java | 2 +- .../v2/resources/FileHistoryResourceTest.java | 2 +- .../v2/resources/GroupRootResourceTest.java | 2 +- .../resources/IncomingRootResourceTest.java | 2 +- .../InstalledPluginResourceTest.java | 2 +- .../scm/api/v2/resources/MeResourceTest.java | 2 +- .../resources/ModificationsResourceTest.java | 2 +- .../resources/PendingPluginResourceTest.java | 2 +- .../RepositoryPermissionRootResourceTest.java | 2 +- .../RepositoryRoleRootResourceTest.java | 2 +- .../resources/RepositoryRootResourceTest.java | 2 +- .../RepositoryTypeRootResourceTest.java | 2 +- .../v2/resources/SourceRootResourceTest.java | 2 +- .../api/v2/resources/TagRootResourceTest.java | 2 +- .../api/v2/resources/UIRootResourceTest.java | 2 +- .../v2/resources/UserRootResourceTest.java | 2 +- 34 files changed, 78 insertions(+), 54 deletions(-) diff --git a/pom.xml b/pom.xml index 910287abf0..9fa7045684 100644 --- a/pom.xml +++ b/pom.xml @@ -220,7 +220,13 @@ org.jboss.resteasy - resteasy-jaxrs + resteasy-core + ${resteasy.version} + + + + org.jboss.resteasy + resteasy-core-spi ${resteasy.version} @@ -831,7 +837,7 @@ 3.0.1 2.1.1 - 3.6.2.Final + 4.4.1.Final 1.19.4 2.11.1 2.10.0 @@ -839,7 +845,7 @@ 2.3.0 - 1.5.1 + 1.6.0 9.4.22.v20191022 diff --git a/scm-core/pom.xml b/scm-core/pom.xml index 8437b256b2..4e8e315253 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -98,7 +98,7 @@ org.jboss.resteasy - resteasy-jaxrs + resteasy-core test diff --git a/scm-plugins/pom.xml b/scm-plugins/pom.xml index 1611633449..e6b2929bd2 100644 --- a/scm-plugins/pom.xml +++ b/scm-plugins/pom.xml @@ -72,7 +72,13 @@ org.jboss.resteasy - resteasy-jaxrs + resteasy-core + test + + + + org.jboss.resteasy + resteasy-core-spi test diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java index c25b5c5b60..7cfc79835b 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java @@ -2,7 +2,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java index 1f88bfe665..21da84e7ec 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java @@ -2,7 +2,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java index bcd9543d28..2293d1ddb7 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java @@ -2,7 +2,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java index 473ddfe4b4..29032ac8de 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java index e0253ad86a..910f5721e9 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java index f7ccf039b2..6a854471dd 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index 571c3b5370..cd7a9e1c3c 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -124,7 +124,7 @@ org.jboss.resteasy - resteasy-jaxrs + resteasy-core @@ -154,26 +154,38 @@ org.jboss.resteasy - resteasy-validator-provider-11 + resteasy-validator-provider ${resteasy.version} - org.hibernate + org.hibernate.validator hibernate-validator - 5.3.6.Final + 6.1.0.Final javax.el javax.el-api - 2.2.4 + 3.0.0 - org.glassfish.web + org.glassfish javax.el - 2.2.4 + 3.0.1-b11 + + + + javax.xml.bind + jaxb-api + 2.3.0 + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.0 diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java index a30cb20c01..0cbb3cd671 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java @@ -72,8 +72,13 @@ public class ResteasyAllInOneServletDispatcher extends HttpServletDispatcher { // ensure everything gets cleared, to avoid classloader leaks ResteasyProviderFactory.clearInstanceIfEqual(ResteasyProviderFactory.getInstance()); - ResteasyProviderFactory.clearContextData(); RuntimeDelegate.setInstance(null); + + removeDeploymentFromServletContext(); + } + + private void removeDeploymentFromServletContext() { + getServletContext().removeAttribute(ResteasyDeployment.class.getName()); } private ResteasyDeployment getDeploymentFromServletContext() { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java index 177f975971..c5756fadd6 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java @@ -2,7 +2,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; @@ -125,10 +125,9 @@ public class AuthenticationResourceTest { when(accessTokenBuilderFactory.create()).thenReturn(accessTokenBuilder); HttpServletRequest servletRequest = mock(HttpServletRequest.class); - ResteasyProviderFactory.getContextDataMap().put(HttpServletRequest.class, servletRequest); - + dispatcher.getDefaultContextObjects().put(HttpServletRequest.class, servletRequest); HttpServletResponse servletResponse = mock(HttpServletResponse.class); - ResteasyProviderFactory.getContextDataMap().put(HttpServletResponse.class, servletResponse); + dispatcher.getDefaultContextObjects().put(HttpServletResponse.class, servletResponse); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java index ac89d02bfb..f8b4236b41 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java @@ -5,7 +5,7 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import org.apache.shiro.util.ThreadContext; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java index 32eadf7af0..99190d942d 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java @@ -4,7 +4,7 @@ import de.otto.edison.hal.HalRepresentation; import org.apache.shiro.ShiroException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java index 2c83d5e3e1..45a2d1613c 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java @@ -7,10 +7,9 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; +import org.jboss.resteasy.spi.Dispatcher; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -32,6 +31,7 @@ import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.web.VndMediaType; +import javax.ws.rs.core.MediaType; import java.net.URI; import java.time.Instant; import java.util.Date; @@ -39,13 +39,8 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.Silent.class) @Slf4j @@ -129,7 +124,8 @@ public class BranchRootResourceTest extends RepositoryTestBase { dispatcher.invoke(request, response); assertEquals(404, response.getStatus()); - assertEquals("application/vnd.scmm-error+json;v=2", response.getOutputHeaders().getFirst("Content-Type")); + MediaType contentType = (MediaType) response.getOutputHeaders().getFirst("Content-Type"); + assertEquals("application/vnd.scmm-error+json;v=2", contentType.toString()); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java index 952c8504f6..601a4a4652 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java @@ -8,7 +8,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java index 15c23dbd3c..74bb0ab38a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java @@ -4,7 +4,7 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java index 33d4d7e9e1..c3d4b2fffa 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java @@ -7,7 +7,7 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; 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 fe205e88a1..40b2ac54b7 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 @@ -1,6 +1,6 @@ package sonia.scm.api.v2.resources; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import sonia.scm.api.rest.AlreadyExistsExceptionMapper; import sonia.scm.api.rest.AuthorizationExceptionMapper; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java index a8b3c15158..b5b903508a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java @@ -7,7 +7,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index 09236c0e19..bb024eb67c 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -4,7 +4,7 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import com.google.inject.util.Providers; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java index 0c1f4235b9..de0eaeb992 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java @@ -8,7 +8,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java index e2a23f0d52..8c9ed5ef2a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java @@ -3,7 +3,7 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java index 7a3d1b4304..7aeabe6bec 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java @@ -7,7 +7,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.credential.PasswordService; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.Subject; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java index fc4598081d..8e84f9d1bb 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java @@ -7,7 +7,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java index da6e1b65d7..3613069d63 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java @@ -4,7 +4,7 @@ import com.google.inject.util.Providers; import org.apache.shiro.ShiroException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java index f2b835a0a1..a2e63dd50e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java @@ -13,7 +13,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.jboss.resteasy.spi.HttpRequest; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java index af968efd1f..d60a32f5dc 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java @@ -3,7 +3,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.inject.util.Providers; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index af1e91344a..fcd34334b2 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -6,7 +6,7 @@ import com.google.common.io.Resources; import com.google.inject.util.Providers; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java index 2476785d70..17ea3248c2 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java @@ -3,7 +3,7 @@ package sonia.scm.api.v2.resources; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.util.Providers; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java index 1a45d3b233..a25aabaca1 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java @@ -1,7 +1,7 @@ package sonia.scm.api.v2.resources; import com.google.inject.util.Providers; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java index 803f2b106c..e97f6c726f 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java @@ -7,7 +7,7 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java index 4987dec644..0391e43c81 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java @@ -3,7 +3,7 @@ package sonia.scm.api.v2.resources; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.util.Providers; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java index 06d9b89120..e055bbf3b5 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java @@ -5,7 +5,7 @@ import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import com.google.inject.util.Providers; import org.apache.shiro.authc.credential.PasswordService; -import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; From cf17e07cea26b852d2a09d0390e1f20a569729cc Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 11:12:22 +0100 Subject: [PATCH 046/144] Do not overwrite existing headers in applyFetchOptions --- scm-ui/ui-components/src/apiclient.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/scm-ui/ui-components/src/apiclient.ts b/scm-ui/ui-components/src/apiclient.ts index 4c1bad8ac1..473bf3b925 100644 --- a/scm-ui/ui-components/src/apiclient.ts +++ b/scm-ui/ui-components/src/apiclient.ts @@ -27,13 +27,17 @@ const extractXsrfToken = () => { }; const applyFetchOptions: (p: RequestInit) => RequestInit = o => { - const headers: { [key: string]: string } = { - Cache: "no-cache", - // identify the request as ajax request - "X-Requested-With": "XMLHttpRequest", - // identify the web interface - "X-SCM-Client": "WUI" - }; + if (!o.headers) { + o.headers = {}; + } + + // @ts-ignore We are sure that here we only get headers of type Record + const headers: Record = o.headers; + headers["Cache"] = "no-cache"; + // identify the request as ajax request + headers["X-Requested-With"] = "XMLHttpRequest"; + // identify the web interface + headers["X-SCM-Client"] = "WUI"; const xsrf = extractXsrfToken(); if (xsrf) { @@ -159,7 +163,7 @@ class ApiClient { options = applyFetchOptions(options); if (contentType) { if (!options.headers) { - options.headers = new Headers(); + options.headers = {}; } // @ts-ignore We are sure that here we only get headers of type Record options.headers["Content-Type"] = contentType; From 4f43bce90eef4986ecc3a74ed2fb9e092df1eccf Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 11:14:58 +0100 Subject: [PATCH 047/144] Reduce visibility of misleading install function This install function might be mistaken to really install this plugin, whereas it only sets its internal status and does not really do smth. --- scm-core/src/main/java/sonia/scm/plugin/AvailablePlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-core/src/main/java/sonia/scm/plugin/AvailablePlugin.java b/scm-core/src/main/java/sonia/scm/plugin/AvailablePlugin.java index db8d96ca15..c05e970e50 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/AvailablePlugin.java +++ b/scm-core/src/main/java/sonia/scm/plugin/AvailablePlugin.java @@ -25,7 +25,7 @@ public class AvailablePlugin implements Plugin { return pending; } - public AvailablePlugin install() { + AvailablePlugin install() { Preconditions.checkState(!pending, "installation is already pending"); return new AvailablePlugin(pluginDescriptor, true); } From e0fa0d09d943852f47721d347dd3cab3074af957 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 20 Nov 2019 11:15:36 +0100 Subject: [PATCH 048/144] resolve fetch-loop for users and groups --- scm-ui/ui-webapp/src/groups/containers/Groups.tsx | 11 ++++++++++- scm-ui/ui-webapp/src/users/containers/Users.tsx | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/scm-ui/ui-webapp/src/groups/containers/Groups.tsx b/scm-ui/ui-webapp/src/groups/containers/Groups.tsx index 23defa8e49..4661eb57a5 100644 --- a/scm-ui/ui-webapp/src/groups/containers/Groups.tsx +++ b/scm-ui/ui-webapp/src/groups/containers/Groups.tsx @@ -49,13 +49,22 @@ class Groups extends React.Component { componentDidUpdate = (prevProps: Props) => { const { loading, list, page, groupLink, location, fetchGroupsByPage } = this.props; if (list && page && !loading) { - const statePage: number = list.page + 1; + const statePage: number = this.resolveStatePage(); if (page !== statePage || prevProps.location.search !== location.search) { fetchGroupsByPage(groupLink, page, urls.getQueryStringFromLocation(location)); } } }; + resolveStatePage = () => { + const { list } = this.props; + if (list.page) { + return list.page + 1; + } + // set page to 1 if undefined, because if groups couldn't be fetched it would lead to an fetch-loop otherwise + return 1; + }; + render() { const { groups, loading, error, canAddGroups, t } = this.props; return ( diff --git a/scm-ui/ui-webapp/src/users/containers/Users.tsx b/scm-ui/ui-webapp/src/users/containers/Users.tsx index bb97eab1b4..d634ed5ca7 100644 --- a/scm-ui/ui-webapp/src/users/containers/Users.tsx +++ b/scm-ui/ui-webapp/src/users/containers/Users.tsx @@ -49,13 +49,22 @@ class Users extends React.Component { componentDidUpdate = (prevProps: Props) => { const { loading, list, page, usersLink, location, fetchUsersByPage } = this.props; if (list && page && !loading) { - const statePage: number = list.page + 1; + const statePage: number = this.resolveStatePage(); if (page !== statePage || prevProps.location.search !== location.search) { fetchUsersByPage(usersLink, page, urls.getQueryStringFromLocation(location)); } } }; + resolveStatePage = (props = this.props) => { + const { list } = props; + if (list.page) { + return list.page + 1; + } + // set page to 1 if undefined, because if users couldn't be fetched it would lead to a fetch-loop otherwise + return 1; + }; + render() { const { users, loading, error, canAddUsers, t } = this.props; return ( From 906c27ebba86e4ef622edb9e5708fabd9af1001b Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 20 Nov 2019 11:42:32 +0100 Subject: [PATCH 049/144] create scmadmin also if only _anonymous user exists --- .../sonia/scm/lifecycle/SetupContextListener.java | 10 +++++++--- .../scm/lifecycle/SetupContextListenerTest.java | 14 +++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java index 512a4fc534..07e7d0409b 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java @@ -61,7 +61,7 @@ public class SetupContextListener implements ServletContextListener { @Override public void run() { - if (isFirstStart()) { + if (shouldCreateAdminAccount()) { createAdminAccount(); } if (anonymousUserRequiredButNotExists()) { @@ -73,8 +73,12 @@ public class SetupContextListener implements ServletContextListener { return scmConfiguration.isAnonymousAccessEnabled() && !userManager.contains(SCMContext.USER_ANONYMOUS); } - private boolean isFirstStart() { - return userManager.getAll().isEmpty(); + private boolean shouldCreateAdminAccount() { + return userManager.getAll().isEmpty() || onlyAnonymousUserExists(); + } + + private boolean onlyAnonymousUserExists() { + return userManager.getAll().size() == 1 && userManager.contains(SCMContext.USER_ANONYMOUS); } private void createAdminAccount() { diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java index 27ddd42cc1..efacbd3594 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java @@ -70,7 +70,19 @@ class SetupContextListenerTest { } @Test - void shouldCreateAdminAccountAndAssignPermissions() { + void shouldCreateAdminAccountIfNoUserExistsAndAssignPermissions() { + when(passwordService.encryptPassword("scmadmin")).thenReturn("secret"); + + setupContextListener.contextInitialized(null); + + verifyAdminCreated(); + verifyAdminPermissionsAssigned(); + } + + @Test + void shouldCreateAdminAccountIfOnlyAnonymousUserExistsAndAssignPermissions() { + when(userManager.getAll()).thenReturn(Lists.newArrayList(SCMContext.ANONYMOUS)); + when(userManager.contains(SCMContext.USER_ANONYMOUS)).thenReturn(true); when(passwordService.encryptPassword("scmadmin")).thenReturn("secret"); setupContextListener.contextInitialized(null); From 5de7d5df94c41b2db572c048f97e1147c4d26674 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 20 Nov 2019 13:40:40 +0100 Subject: [PATCH 050/144] show notification if diff is empty --- scm-ui/ui-components/src/repos/Diff.tsx | 23 +++++++++++-------- .../ui-components/src/repos/LoadingDiff.tsx | 1 + .../main/resources/locales/de/plugins.json | 3 ++- .../main/resources/locales/en/plugins.json | 9 ++++---- .../main/resources/locales/es/plugins.json | 3 ++- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/scm-ui/ui-components/src/repos/Diff.tsx b/scm-ui/ui-components/src/repos/Diff.tsx index cb4ad30f9f..b34c5ae68e 100644 --- a/scm-ui/ui-components/src/repos/Diff.tsx +++ b/scm-ui/ui-components/src/repos/Diff.tsx @@ -1,11 +1,14 @@ import React from "react"; import DiffFile from "./DiffFile"; import { DiffObjectProps, File } from "./DiffTypes"; +import Notification from "../Notification"; +import { WithTranslation, withTranslation } from "react-i18next"; -type Props = DiffObjectProps & { - diff: File[]; - defaultCollapse?: boolean; -}; +type Props = WithTranslation & + DiffObjectProps & { + diff: File[]; + defaultCollapse?: boolean; + }; class Diff extends React.Component { static defaultProps: Partial = { @@ -13,15 +16,17 @@ class Diff extends React.Component { }; render() { - const { diff, ...fileProps } = this.props; + const { diff, t, ...fileProps } = this.props; return ( <> - {diff.map((file, index) => ( - - ))} + {diff.length === 0 ? ( + {t("noDiffFound")} + ) : ( + diff.map((file, index) => ) + )} ); } } -export default Diff; +export default withTranslation("plugins")(Diff); diff --git a/scm-ui/ui-components/src/repos/LoadingDiff.tsx b/scm-ui/ui-components/src/repos/LoadingDiff.tsx index 1cfbc00b14..45b62f9b35 100644 --- a/scm-ui/ui-components/src/repos/LoadingDiff.tsx +++ b/scm-ui/ui-components/src/repos/LoadingDiff.tsx @@ -43,6 +43,7 @@ class LoadingDiff extends React.Component { fetchDiff = () => { const { url } = this.props; + this.setState({loading: true}); apiClient .get(url) .then(response => response.text()) diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index 3cb6522922..a2cd4530dd 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -202,5 +202,6 @@ "CustomNamespaceStrategy": "Benutzerdefiniert", "CurrentYearNamespaceStrategy": "Aktuelles Jahr", "RepositoryTypeNamespaceStrategy": "Repository Typ" - } + }, + "noDiffFound": "Kein Diff zwischen den ausgewählten Branches gefunden." } diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index 0be1c1f803..271d7e8c20 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -198,9 +198,10 @@ } }, "namespaceStrategies": { - "UsernameNamespaceStrategy": "Username", - "CustomNamespaceStrategy": "Custom", - "CurrentYearNamespaceStrategy": "Current year", + "UsernameNamespaceStrategy": "Username", + "CustomNamespaceStrategy": "Custom", + "CurrentYearNamespaceStrategy": "Current year", "RepositoryTypeNamespaceStrategy": "Repository type" - } + }, + "noDiffFound": "No Diff between the selected branches found." } diff --git a/scm-webapp/src/main/resources/locales/es/plugins.json b/scm-webapp/src/main/resources/locales/es/plugins.json index e56973946b..042a6ebc63 100644 --- a/scm-webapp/src/main/resources/locales/es/plugins.json +++ b/scm-webapp/src/main/resources/locales/es/plugins.json @@ -182,5 +182,6 @@ "CustomNamespaceStrategy": "Personalizar", "CurrentYearNamespaceStrategy": "Año actual", "RepositoryTypeNamespaceStrategy": "Tipo de repositorio" - } + }, + "noDiffFound": "No se encontraron diferencias entre las ramas seleccionadas." } From d962265d8dc0423c591f428948bb91e8b467da8a Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 14:47:47 +0100 Subject: [PATCH 051/144] Correct order of exports Without this `yarn run serve` will run on port 8080 serving the scss --- scm-ui/ui-scripts/src/webpack.config.js | 70 ++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/scm-ui/ui-scripts/src/webpack.config.js b/scm-ui/ui-scripts/src/webpack.config.js index 639872c6b8..2dd5b4c470 100644 --- a/scm-ui/ui-scripts/src/webpack.config.js +++ b/scm-ui/ui-scripts/src/webpack.config.js @@ -7,41 +7,6 @@ const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const root = path.resolve(process.cwd(), "scm-ui"); module.exports = [ - { - context: root, - entry: "./ui-styles/src/scm.scss", - module: { - rules: [ - { - test: /\.(css|scss|sass)$/i, - use: [ - { - loader: MiniCssExtractPlugin.loader - }, - "css-loader", - "sass-loader" - ] - }, - { - test: /\.(png|svg|jpg|gif|woff2?|eot|ttf)$/, - use: ["file-loader"] - } - ] - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: "ui-styles.css", - ignoreOrder: false - }) - ], - optimization: { - minimizer: [new OptimizeCSSAssetsPlugin({})] - }, - output: { - path: path.join(root, "target", "assets"), - filename: "ui-styles.bundle.js" - } - }, { context: root, entry: { @@ -142,6 +107,41 @@ module.exports = [ } } }, + { + context: root, + entry: "./ui-styles/src/scm.scss", + module: { + rules: [ + { + test: /\.(css|scss|sass)$/i, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + "css-loader", + "sass-loader" + ] + }, + { + test: /\.(png|svg|jpg|gif|woff2?|eot|ttf)$/, + use: ["file-loader"] + } + ] + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "ui-styles.css", + ignoreOrder: false + }) + ], + optimization: { + minimizer: [new OptimizeCSSAssetsPlugin({})] + }, + output: { + path: path.join(root, "target", "assets"), + filename: "ui-styles.bundle.js" + } + }, { context: path.resolve(root), entry: { From a04e05bf9bcd09004b0bf96047d456490045bbeb Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Wed, 20 Nov 2019 16:14:50 +0100 Subject: [PATCH 052/144] Move Button to right side (and remove doubled note) --- .../src/forms/AddEntryToTableField.tsx | 16 ++++++++++------ .../forms/AutocompleteAddEntryToTableField.tsx | 7 +++---- scm-ui/ui-webapp/public/locales/de/admin.json | 5 ++--- scm-ui/ui-webapp/public/locales/de/groups.json | 3 +-- scm-ui/ui-webapp/public/locales/de/repos.json | 5 ++--- scm-ui/ui-webapp/public/locales/de/users.json | 3 +-- scm-ui/ui-webapp/public/locales/en/admin.json | 11 +++++------ scm-ui/ui-webapp/public/locales/en/groups.json | 3 +-- scm-ui/ui-webapp/public/locales/en/repos.json | 7 +++---- scm-ui/ui-webapp/public/locales/en/users.json | 7 +++---- scm-ui/ui-webapp/public/locales/es/admin.json | 3 +-- scm-ui/ui-webapp/public/locales/es/groups.json | 3 +-- scm-ui/ui-webapp/public/locales/es/repos.json | 7 +++---- scm-ui/ui-webapp/public/locales/es/users.json | 3 +-- .../roles/containers/DeleteRepositoryRole.tsx | 12 ++++-------- .../roles/containers/EditRepositoryRole.tsx | 1 - .../src/containers/ChangeUserPassword.tsx | 7 ++----- .../src/groups/components/GroupForm.tsx | 4 ++-- .../src/groups/containers/DeleteGroup.tsx | 10 +++------- .../src/groups/containers/EditGroup.tsx | 1 - .../src/repos/components/form/RepositoryForm.tsx | 5 ++--- .../src/repos/containers/DeleteRepo.tsx | 9 ++------- .../containers/CreatePermissionForm.tsx | 13 +++++++------ .../src/users/components/SetUserPassword.tsx | 10 +++++----- .../ui-webapp/src/users/components/UserForm.tsx | 7 ++----- .../src/users/containers/DeleteUser.tsx | 10 +++------- .../ui-webapp/src/users/containers/EditUser.tsx | 1 - 27 files changed, 69 insertions(+), 104 deletions(-) diff --git a/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx b/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx index d1e1b77cb6..8f76956c47 100644 --- a/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx +++ b/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx @@ -1,7 +1,7 @@ import React, { MouseEvent } from "react"; - -import { AddButton } from "../buttons"; import InputField from "./InputField"; +import Level from "../layout/Level"; +import { AddButton } from "../buttons"; type Props = { addEntry: (p: string) => void; @@ -48,10 +48,14 @@ class AddEntryToTableField extends React.Component { disabled={disabled} helpText={helpText} /> - + } /> ); diff --git a/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx b/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx index e09b0d1ef2..19042bb2ac 100644 --- a/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx +++ b/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx @@ -1,7 +1,7 @@ import React, { MouseEvent } from "react"; - -import { AutocompleteObject, SelectValue } from "@scm-manager/ui-types"; +import { SelectValue } from "@scm-manager/ui-types"; import Autocomplete from "../Autocomplete"; +import Level from "../layout/Level"; import AddButton from "../buttons/AddButton"; type Props = { @@ -53,8 +53,7 @@ class AutocompleteAddEntryToTableField extends React.Component { noOptionsMessage={noOptionsMessage} creatable={true} /> - - + } /> ); } diff --git a/scm-ui/ui-webapp/public/locales/de/admin.json b/scm-ui/ui-webapp/public/locales/de/admin.json index af34c5b759..364fa5a5b7 100644 --- a/scm-ui/ui-webapp/public/locales/de/admin.json +++ b/scm-ui/ui-webapp/public/locales/de/admin.json @@ -6,7 +6,7 @@ "settingsNavLink": "Einstellungen", "generalNavLink": "Generell" }, - "info": { + "info": { "currentAppVersion": "Aktuelle Software-Versionsnummer", "communityTitle": "Community Support", "communityIconAlt": "Community Support Icon", @@ -91,8 +91,7 @@ "submit": "Speichern" }, "delete": { - "button": "Löschen", - "subtitle": "Berechtigungsrolle löschen", + "button": "Berechtigungsrolle löschen", "confirmAlert": { "title": "Berechtigungsrolle löschen?", "message": "Wollen Sie diese Rolle wirklich löschen? Alle Benutzer mit dieser Rolle verlieren die entsprechenden Berechtigungen.", diff --git a/scm-ui/ui-webapp/public/locales/de/groups.json b/scm-ui/ui-webapp/public/locales/de/groups.json index 04b368c56b..2e8c7aeb88 100644 --- a/scm-ui/ui-webapp/public/locales/de/groups.json +++ b/scm-ui/ui-webapp/public/locales/de/groups.json @@ -60,8 +60,7 @@ } }, "deleteGroup": { - "subtitle": "Gruppe löschen", - "button": "Löschen", + "button": "Gruppe löschen", "confirmAlert": { "title": "Gruppe löschen", "message": "Soll die Gruppe wirklich gelöscht werden?", diff --git a/scm-ui/ui-webapp/public/locales/de/repos.json b/scm-ui/ui-webapp/public/locales/de/repos.json index e156cc903e..bafb590ecd 100644 --- a/scm-ui/ui-webapp/public/locales/de/repos.json +++ b/scm-ui/ui-webapp/public/locales/de/repos.json @@ -114,7 +114,7 @@ "size": "Größe" }, "noSources": "Keine Sources in diesem Branch gefunden.", - "extension" : { + "extension": { "notBound": "Keine Erweiterung angebunden." } }, @@ -166,8 +166,7 @@ } }, "deleteRepo": { - "subtitle": "Repository löschen", - "button": "Löschen", + "button": "Repository löschen", "confirmAlert": { "title": "Repository löschen", "message": "Soll das Repository wirklich gelöscht werden?", diff --git a/scm-ui/ui-webapp/public/locales/de/users.json b/scm-ui/ui-webapp/public/locales/de/users.json index 25b6858c8b..60f9f64423 100644 --- a/scm-ui/ui-webapp/public/locales/de/users.json +++ b/scm-ui/ui-webapp/public/locales/de/users.json @@ -45,8 +45,7 @@ "subtitle": "Erstellen eines neuen Benutzers" }, "deleteUser": { - "subtitle": "Benutzer löschen", - "button": "Löschen", + "button": "Benutzer löschen", "confirmAlert": { "title": "Benutzer löschen", "message": "Soll der Benutzer wirklich gelöscht werden?", diff --git a/scm-ui/ui-webapp/public/locales/en/admin.json b/scm-ui/ui-webapp/public/locales/en/admin.json index c315d1d142..d1360846f7 100644 --- a/scm-ui/ui-webapp/public/locales/en/admin.json +++ b/scm-ui/ui-webapp/public/locales/en/admin.json @@ -11,7 +11,7 @@ "communityTitle": "Community Support", "communityIconAlt": "Community Support Icon", "communityInfo": "Contact the SCM-Manager support team for questions about SCM-Manager, to report bugs or to request features through the official channels.", - "communityButton": "Contact our team", + "communityButton": "Contact our Team", "enterpriseTitle": "Enterprise Support", "enterpriseIconAlt": "Enterprise Support Icon", "enterpriseInfo": "You require support with the integration of SCM-Manager into your processes, with the customization of the tool or simply a service level agreement (SLA)?", @@ -76,8 +76,8 @@ "createSubtitle": "Create Permission Role", "editSubtitle": "Edit Permission Role", "overview": { - "title": "Overview of all permission roles", - "noPermissionRoles": "No permission roles found.", + "title": "Overview of all Permission Roles", + "noPermissionRoles": "No Permission Roles found.", "createButton": "Create Permission Role" }, "editButton": "Edit", @@ -91,10 +91,9 @@ "submit": "Save" }, "delete": { - "button": "Delete", - "subtitle": "Delete permission role", + "button": "Delete Permission Role", "confirmAlert": { - "title": "Delete permission role", + "title": "Delete Permission Role", "message": "Do you really want to delete this permission role? All users will lose their corresponding permissions.", "submit": "Yes", "cancel": "No" diff --git a/scm-ui/ui-webapp/public/locales/en/groups.json b/scm-ui/ui-webapp/public/locales/en/groups.json index 0153f30d30..6911f897f8 100644 --- a/scm-ui/ui-webapp/public/locales/en/groups.json +++ b/scm-ui/ui-webapp/public/locales/en/groups.json @@ -60,8 +60,7 @@ } }, "deleteGroup": { - "subtitle": "Delete Group", - "button": "Delete", + "button": "Delete Group", "confirmAlert": { "title": "Delete Group", "message": "Do you really want to delete the group?", diff --git a/scm-ui/ui-webapp/public/locales/en/repos.json b/scm-ui/ui-webapp/public/locales/en/repos.json index 0466bab77f..6dbbe7fd5a 100644 --- a/scm-ui/ui-webapp/public/locales/en/repos.json +++ b/scm-ui/ui-webapp/public/locales/en/repos.json @@ -114,7 +114,7 @@ "size": "Size" }, "noSources": "No sources found for this branch.", - "extension" : { + "extension": { "notBound": "No extension bound." } }, @@ -166,8 +166,7 @@ } }, "deleteRepo": { - "subtitle": "Delete Repository", - "button": "Delete", + "button": "Delete Repository", "confirmAlert": { "title": "Delete repository", "message": "Do you really want to delete the repository?", @@ -178,7 +177,7 @@ "diff": { "changes": { "add": "added", - "delete": "deleted", + "delete": "deleted", "modify": "modified", "rename": "renamed", "copy": "copied" diff --git a/scm-ui/ui-webapp/public/locales/en/users.json b/scm-ui/ui-webapp/public/locales/en/users.json index b492923a3f..0fab330e6f 100644 --- a/scm-ui/ui-webapp/public/locales/en/users.json +++ b/scm-ui/ui-webapp/public/locales/en/users.json @@ -45,17 +45,16 @@ "subtitle": "Create a new user" }, "deleteUser": { - "subtitle": "Delete User", - "button": "Delete", + "button": "Delete User", "confirmAlert": { - "title": "Delete user", + "title": "Delete User", "message": "Do you really want to delete the user?", "submit": "Yes", "cancel": "No" } }, "singleUserPassword": { - "button": "Set password", + "button": "Set Password", "setPasswordSuccessful": "Password successfully set" }, "userForm": { diff --git a/scm-ui/ui-webapp/public/locales/es/admin.json b/scm-ui/ui-webapp/public/locales/es/admin.json index 155313ed99..4c78d32620 100644 --- a/scm-ui/ui-webapp/public/locales/es/admin.json +++ b/scm-ui/ui-webapp/public/locales/es/admin.json @@ -86,8 +86,7 @@ "submit": "Guardar" }, "delete": { - "button": "Borrar", - "subtitle": "Eliminar el rol", + "button": "Eliminar el rol", "confirmAlert": { "title": "Eliminar el rol", "message": "¿Realmente desea borrar el rol? Todos los usuarios de este rol perderń sus permisos.", diff --git a/scm-ui/ui-webapp/public/locales/es/groups.json b/scm-ui/ui-webapp/public/locales/es/groups.json index 0ce3e7765a..f62cfc62cb 100644 --- a/scm-ui/ui-webapp/public/locales/es/groups.json +++ b/scm-ui/ui-webapp/public/locales/es/groups.json @@ -60,8 +60,7 @@ } }, "deleteGroup": { - "subtitle": "Borrar grupo", - "button": "Borrar", + "button": "Borrar grupo", "confirmAlert": { "title": "Borrar grupo", "message": "¿Realmente desea borrar el grupo?", diff --git a/scm-ui/ui-webapp/public/locales/es/repos.json b/scm-ui/ui-webapp/public/locales/es/repos.json index ef9bd2badc..94c99c44b1 100644 --- a/scm-ui/ui-webapp/public/locales/es/repos.json +++ b/scm-ui/ui-webapp/public/locales/es/repos.json @@ -114,7 +114,7 @@ "size": "tamaño" }, "noSources": "No se han encontrado fuentes para esta rama.", - "extension" : { + "extension": { "notBound": "Sin extensión conectada." } }, @@ -166,8 +166,7 @@ } }, "deleteRepo": { - "subtitle": "Borrar repositorio", - "button": "Borrar", + "button": "Borrar repositorio", "confirmAlert": { "title": "Borrar repositorio", "message": "¿Realmente desea borrar el repositorio?", @@ -178,7 +177,7 @@ "diff": { "changes": { "add": "añadido", - "delete": "borrado", + "delete": "borrado", "modify": "modificado", "rename": "renombrado", "copy": "copiado" diff --git a/scm-ui/ui-webapp/public/locales/es/users.json b/scm-ui/ui-webapp/public/locales/es/users.json index d5ea97b95a..7c8fa4d35e 100644 --- a/scm-ui/ui-webapp/public/locales/es/users.json +++ b/scm-ui/ui-webapp/public/locales/es/users.json @@ -45,8 +45,7 @@ "subtitle": "Crear un nuevo usuario" }, "deleteUser": { - "subtitle": "Borrar usuario", - "button": "Borrar", + "button": "Borrar usuario", "confirmAlert": { "title": "Borrar usuario", "message": "¿Realmente desea borrar el usuario?", diff --git a/scm-ui/ui-webapp/src/admin/roles/containers/DeleteRepositoryRole.tsx b/scm-ui/ui-webapp/src/admin/roles/containers/DeleteRepositoryRole.tsx index 059b110429..93efa5b3dc 100644 --- a/scm-ui/ui-webapp/src/admin/roles/containers/DeleteRepositoryRole.tsx +++ b/scm-ui/ui-webapp/src/admin/roles/containers/DeleteRepositoryRole.tsx @@ -4,7 +4,7 @@ import { withRouter } from "react-router-dom"; import { WithTranslation, withTranslation } from "react-i18next"; import { History } from "history"; import { RepositoryRole } from "@scm-manager/ui-types"; -import { Subtitle, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; +import { Level, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; import { deleteRole, getDeleteRoleFailure, isDeleteRolePending } from "../modules/roles"; type Props = WithTranslation & { @@ -64,13 +64,9 @@ class DeleteRepositoryRole extends React.Component { return ( <> - -
    -
    - - -
    -
    +
    + + } /> ); } diff --git a/scm-ui/ui-webapp/src/admin/roles/containers/EditRepositoryRole.tsx b/scm-ui/ui-webapp/src/admin/roles/containers/EditRepositoryRole.tsx index f09d5c603e..7114a8efc7 100644 --- a/scm-ui/ui-webapp/src/admin/roles/containers/EditRepositoryRole.tsx +++ b/scm-ui/ui-webapp/src/admin/roles/containers/EditRepositoryRole.tsx @@ -44,7 +44,6 @@ class EditRepositoryRole extends React.Component { <> this.updateRepositoryRole(role)} /> -
    ); diff --git a/scm-ui/ui-webapp/src/containers/ChangeUserPassword.tsx b/scm-ui/ui-webapp/src/containers/ChangeUserPassword.tsx index 9b8275aa0e..46682d6183 100644 --- a/scm-ui/ui-webapp/src/containers/ChangeUserPassword.tsx +++ b/scm-ui/ui-webapp/src/containers/ChangeUserPassword.tsx @@ -4,6 +4,7 @@ import { InputField, Notification, PasswordConfirmation, + Level, SubmitButton } from "@scm-manager/ui-components"; import { WithTranslation, withTranslation } from "react-i18next"; @@ -124,11 +125,7 @@ class ChangeUserPassword extends React.Component { passwordChanged={this.passwordChanged} key={this.state.passwordChanged ? "changed" : "unchanged"} /> -
    -
    - -
    -
    + } /> ); } diff --git a/scm-ui/ui-webapp/src/groups/components/GroupForm.tsx b/scm-ui/ui-webapp/src/groups/components/GroupForm.tsx index b0c41df5c8..47c4414190 100644 --- a/scm-ui/ui-webapp/src/groups/components/GroupForm.tsx +++ b/scm-ui/ui-webapp/src/groups/components/GroupForm.tsx @@ -8,9 +8,9 @@ import { InputField, SubmitButton, Textarea, + Level, Checkbox } from "@scm-manager/ui-components"; - import * as validator from "./groupValidation"; type Props = WithTranslation & { @@ -154,7 +154,7 @@ class GroupForm extends React.Component { /> {this.renderExternalField(group)} {this.renderMemberfields(group)} - + } /> ); diff --git a/scm-ui/ui-webapp/src/groups/containers/DeleteGroup.tsx b/scm-ui/ui-webapp/src/groups/containers/DeleteGroup.tsx index 8c2034f09e..d9e8e4e6b5 100644 --- a/scm-ui/ui-webapp/src/groups/containers/DeleteGroup.tsx +++ b/scm-ui/ui-webapp/src/groups/containers/DeleteGroup.tsx @@ -4,7 +4,7 @@ import { withRouter } from "react-router-dom"; import { WithTranslation, withTranslation } from "react-i18next"; import { History } from "history"; import { Group } from "@scm-manager/ui-types"; -import { Subtitle, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; +import { Level, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; import { deleteGroup, getDeleteGroupFailure, isDeleteGroupPending } from "../modules/groups"; type Props = WithTranslation & { @@ -64,13 +64,9 @@ export class DeleteGroup extends React.Component { return ( <> - +
    -
    -
    - -
    -
    + } /> ); } diff --git a/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx b/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx index 9a70bfefa4..57fcc9b75f 100644 --- a/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx +++ b/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx @@ -61,7 +61,6 @@ class EditGroup extends React.Component { loading={loading} loadUserSuggestions={this.loadUserAutocompletion} /> -
    ); diff --git a/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx b/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx index 681b2c91f2..a99fc14524 100644 --- a/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx +++ b/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx @@ -2,7 +2,7 @@ import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { ExtensionPoint } from "@scm-manager/ui-extensions"; import { Repository, RepositoryType } from "@scm-manager/ui-types"; -import { Subtitle, InputField, Select, SubmitButton, Textarea } from "@scm-manager/ui-components"; +import { Subtitle, InputField, Select, Textarea, Level, SubmitButton } from "@scm-manager/ui-components"; import * as validator from "./repositoryValidation"; type Props = WithTranslation & { @@ -54,7 +54,6 @@ class RepositoryForm extends React.Component { isFalsy(value) { return !value; - } isValid = () => { @@ -91,7 +90,7 @@ class RepositoryForm extends React.Component { const disabled = !this.isModifiable() && !this.isCreateMode(); const submitButton = disabled ? null : ( - + } /> ); let subtitle = null; diff --git a/scm-ui/ui-webapp/src/repos/containers/DeleteRepo.tsx b/scm-ui/ui-webapp/src/repos/containers/DeleteRepo.tsx index 83220b97b8..a8b8c97f84 100644 --- a/scm-ui/ui-webapp/src/repos/containers/DeleteRepo.tsx +++ b/scm-ui/ui-webapp/src/repos/containers/DeleteRepo.tsx @@ -4,7 +4,7 @@ import { withRouter } from "react-router-dom"; import { WithTranslation, withTranslation } from "react-i18next"; import { History } from "history"; import { Repository } from "@scm-manager/ui-types"; -import { Subtitle, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; +import { Level, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; import { deleteRepo, getDeleteRepoFailure, isDeleteRepoPending } from "../modules/repos"; type Props = WithTranslation & { @@ -65,13 +65,8 @@ class DeleteRepo extends React.Component { return ( <>
    - -
    -
    - -
    -
    + } /> ); } diff --git a/scm-ui/ui-webapp/src/repos/permissions/containers/CreatePermissionForm.tsx b/scm-ui/ui-webapp/src/repos/permissions/containers/CreatePermissionForm.tsx index ed9c79b65f..447ef5ec68 100644 --- a/scm-ui/ui-webapp/src/repos/permissions/containers/CreatePermissionForm.tsx +++ b/scm-ui/ui-webapp/src/repos/permissions/containers/CreatePermissionForm.tsx @@ -6,6 +6,7 @@ import { GroupAutocomplete, LabelWithHelpIcon, Radio, + Level, SubmitButton, Subtitle, UserAutocomplete @@ -141,8 +142,8 @@ class CreatePermissionForm extends React.Component {
    -
    {this.renderAutocompletionField()}
    -
    +
    {this.renderAutocompletionField()}
    +
    {
    -
    -
    + -
    -
    + } + /> ); diff --git a/scm-ui/ui-webapp/src/users/components/SetUserPassword.tsx b/scm-ui/ui-webapp/src/users/components/SetUserPassword.tsx index f060c7494d..e5e3861fac 100644 --- a/scm-ui/ui-webapp/src/users/components/SetUserPassword.tsx +++ b/scm-ui/ui-webapp/src/users/components/SetUserPassword.tsx @@ -1,7 +1,7 @@ import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { User } from "@scm-manager/ui-types"; -import { SubmitButton, Notification, ErrorNotification, PasswordConfirmation } from "@scm-manager/ui-components"; +import { Level, SubmitButton, Notification, ErrorNotification, PasswordConfirmation } from "@scm-manager/ui-components"; import { setPassword } from "./setPassword"; type Props = WithTranslation & { @@ -98,15 +98,15 @@ class SetUserPassword extends React.Component { passwordChanged={this.passwordChanged} key={this.state.passwordChanged ? "changed" : "unchanged"} /> -
    -
    + -
    -
    + } + /> ); } diff --git a/scm-ui/ui-webapp/src/users/components/UserForm.tsx b/scm-ui/ui-webapp/src/users/components/UserForm.tsx index db1fc50ea1..1efd2558cd 100644 --- a/scm-ui/ui-webapp/src/users/components/UserForm.tsx +++ b/scm-ui/ui-webapp/src/users/components/UserForm.tsx @@ -6,6 +6,7 @@ import { Checkbox, InputField, PasswordConfirmation, + Level, SubmitButton, validation as validator } from "@scm-manager/ui-components"; @@ -166,11 +167,7 @@ class UserForm extends React.Component { />
    -
    -
    - -
    -
    + } /> ); diff --git a/scm-ui/ui-webapp/src/users/containers/DeleteUser.tsx b/scm-ui/ui-webapp/src/users/containers/DeleteUser.tsx index 15beba3c49..6feafaaf91 100644 --- a/scm-ui/ui-webapp/src/users/containers/DeleteUser.tsx +++ b/scm-ui/ui-webapp/src/users/containers/DeleteUser.tsx @@ -4,7 +4,7 @@ import { withRouter } from "react-router-dom"; import { WithTranslation, withTranslation } from "react-i18next"; import { History } from "history"; import { User } from "@scm-manager/ui-types"; -import { Subtitle, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; +import { Level, DeleteButton, confirmAlert, ErrorNotification } from "@scm-manager/ui-components"; import { deleteUser, getDeleteUserFailure, isDeleteUserPending } from "../modules/users"; type Props = WithTranslation & { @@ -64,13 +64,9 @@ class DeleteUser extends React.Component { return ( <> - +
    -
    -
    - -
    -
    + } /> ); } diff --git a/scm-ui/ui-webapp/src/users/containers/EditUser.tsx b/scm-ui/ui-webapp/src/users/containers/EditUser.tsx index e2594caa44..81f639535c 100644 --- a/scm-ui/ui-webapp/src/users/containers/EditUser.tsx +++ b/scm-ui/ui-webapp/src/users/containers/EditUser.tsx @@ -41,7 +41,6 @@ class EditUser extends React.Component {
    this.modifyUser(user)} user={user} loading={loading} /> -
    ); From 6d80f78cfd1af1c4d0a475d67e46ff217800850e Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Wed, 20 Nov 2019 16:15:08 +0100 Subject: [PATCH 053/144] Replace internal/external group icon --- scm-ui/ui-webapp/src/groups/components/table/GroupRow.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-ui/ui-webapp/src/groups/components/table/GroupRow.tsx b/scm-ui/ui-webapp/src/groups/components/table/GroupRow.tsx index 2674811ae1..dbc54fbf35 100644 --- a/scm-ui/ui-webapp/src/groups/components/table/GroupRow.tsx +++ b/scm-ui/ui-webapp/src/groups/components/table/GroupRow.tsx @@ -17,9 +17,9 @@ class GroupRow extends React.Component { const { group, t } = this.props; const to = `/group/${group.name}`; const iconType = group.external ? ( - + ) : ( - + ); return ( From ba8c2f4ce734122132ed581daa9412e3d40de012 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 Nov 2019 15:23:10 +0000 Subject: [PATCH 054/144] Close branch feature/add_optional_headers_in_apiclient From 793233146b549ac92849dedd5abdeb1572f461fa Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 15:37:42 +0000 Subject: [PATCH 055/144] Close branch bugfix/new_pr_undefined_on_diff From 67c21b18e32f456d269c939526e0ddff33d93275 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 20 Nov 2019 16:50:18 +0100 Subject: [PATCH 056/144] Move translation key to correct file --- scm-ui/ui-components/src/repos/Diff.tsx | 4 ++-- scm-ui/ui-webapp/public/locales/de/repos.json | 3 ++- scm-ui/ui-webapp/public/locales/en/repos.json | 3 ++- scm-ui/ui-webapp/public/locales/es/repos.json | 3 ++- scm-webapp/src/main/resources/locales/de/plugins.json | 3 +-- scm-webapp/src/main/resources/locales/en/plugins.json | 3 +-- scm-webapp/src/main/resources/locales/es/plugins.json | 3 +-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scm-ui/ui-components/src/repos/Diff.tsx b/scm-ui/ui-components/src/repos/Diff.tsx index b34c5ae68e..d7123903a3 100644 --- a/scm-ui/ui-components/src/repos/Diff.tsx +++ b/scm-ui/ui-components/src/repos/Diff.tsx @@ -20,7 +20,7 @@ class Diff extends React.Component { return ( <> {diff.length === 0 ? ( - {t("noDiffFound")} + {t("diff.noDiffFound")} ) : ( diff.map((file, index) => ) )} @@ -29,4 +29,4 @@ class Diff extends React.Component { } } -export default withTranslation("plugins")(Diff); +export default withTranslation("repos")(Diff); diff --git a/scm-ui/ui-webapp/public/locales/de/repos.json b/scm-ui/ui-webapp/public/locales/de/repos.json index e156cc903e..4dfba695ab 100644 --- a/scm-ui/ui-webapp/public/locales/de/repos.json +++ b/scm-ui/ui-webapp/public/locales/de/repos.json @@ -177,7 +177,8 @@ }, "diff": { "sideBySide": "Zweispaltig", - "combined": "Kombiniert" + "combined": "Kombiniert", + "noDiffFound": "Kein Diff zwischen den ausgewählten Branches gefunden." }, "fileUpload": { "clickHere": "Klicken Sie hier um Ihre Datei hochzuladen.", diff --git a/scm-ui/ui-webapp/public/locales/en/repos.json b/scm-ui/ui-webapp/public/locales/en/repos.json index 0466bab77f..e2ccf8326e 100644 --- a/scm-ui/ui-webapp/public/locales/en/repos.json +++ b/scm-ui/ui-webapp/public/locales/en/repos.json @@ -184,7 +184,8 @@ "copy": "copied" }, "sideBySide": "side-by-side", - "combined": "combined" + "combined": "combined", + "noDiffFound": "No Diff between the selected branches found." }, "fileUpload": { "clickHere": "Click here to select your file", diff --git a/scm-ui/ui-webapp/public/locales/es/repos.json b/scm-ui/ui-webapp/public/locales/es/repos.json index ef9bd2badc..c3bf57c630 100644 --- a/scm-ui/ui-webapp/public/locales/es/repos.json +++ b/scm-ui/ui-webapp/public/locales/es/repos.json @@ -184,7 +184,8 @@ "copy": "copiado" }, "sideBySide": "dos columnas", - "combined": "combinado" + "combined": "combinado", + "noDiffFound": "No se encontraron diferencias entre las ramas seleccionadas." }, "fileUpload": { "clickHere": "Haga click aquí para seleccionar su fichero", diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index a2cd4530dd..3cb6522922 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -202,6 +202,5 @@ "CustomNamespaceStrategy": "Benutzerdefiniert", "CurrentYearNamespaceStrategy": "Aktuelles Jahr", "RepositoryTypeNamespaceStrategy": "Repository Typ" - }, - "noDiffFound": "Kein Diff zwischen den ausgewählten Branches gefunden." + } } diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index 271d7e8c20..83b463b8b6 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -202,6 +202,5 @@ "CustomNamespaceStrategy": "Custom", "CurrentYearNamespaceStrategy": "Current year", "RepositoryTypeNamespaceStrategy": "Repository type" - }, - "noDiffFound": "No Diff between the selected branches found." + } } diff --git a/scm-webapp/src/main/resources/locales/es/plugins.json b/scm-webapp/src/main/resources/locales/es/plugins.json index 042a6ebc63..e56973946b 100644 --- a/scm-webapp/src/main/resources/locales/es/plugins.json +++ b/scm-webapp/src/main/resources/locales/es/plugins.json @@ -182,6 +182,5 @@ "CustomNamespaceStrategy": "Personalizar", "CurrentYearNamespaceStrategy": "Año actual", "RepositoryTypeNamespaceStrategy": "Tipo de repositorio" - }, - "noDiffFound": "No se encontraron diferencias entre las ramas seleccionadas." + } } From 0144d4cc7d37f91ef2c268d1a88b980d20c8037b Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 21 Nov 2019 10:05:47 +0000 Subject: [PATCH 057/144] Close branch feature/public_flag_migration From 83e50156ded29df243adc34edf85959ba08a07d9 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 21 Nov 2019 10:18:30 +0000 Subject: [PATCH 058/144] Close branch bugfix/fetch_loop From 9cf55b83356700340c8821bdccbe6de272ddd1ab Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 21 Nov 2019 13:06:22 +0100 Subject: [PATCH 059/144] Use api client for auto complete --- scm-ui/ui-components/src/UserGroupAutocomplete.tsx | 4 +++- scm-ui/ui-webapp/src/groups/containers/CreateGroup.tsx | 4 +++- scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/scm-ui/ui-components/src/UserGroupAutocomplete.tsx b/scm-ui/ui-components/src/UserGroupAutocomplete.tsx index 5c047b9353..f4e445eba9 100644 --- a/scm-ui/ui-components/src/UserGroupAutocomplete.tsx +++ b/scm-ui/ui-components/src/UserGroupAutocomplete.tsx @@ -1,6 +1,7 @@ import React from "react"; import { SelectValue, AutocompleteObject } from "@scm-manager/ui-types"; import Autocomplete from "./Autocomplete"; +import { apiClient } from "./apiclient"; export type AutocompleteProps = { autocompleteLink?: string; @@ -19,7 +20,8 @@ export default class UserGroupAutocomplete extends React.Component { loadSuggestions = (inputValue: string): Promise => { const url = this.props.autocompleteLink; const link = url + "?q="; - return fetch(link + inputValue) + return apiClient + .get(link + inputValue) .then(response => response.json()) .then((json: AutocompleteObject[]) => { return json.map(element => { diff --git a/scm-ui/ui-webapp/src/groups/containers/CreateGroup.tsx b/scm-ui/ui-webapp/src/groups/containers/CreateGroup.tsx index 5d50de99cf..0a1ee6bf6b 100644 --- a/scm-ui/ui-webapp/src/groups/containers/CreateGroup.tsx +++ b/scm-ui/ui-webapp/src/groups/containers/CreateGroup.tsx @@ -7,6 +7,7 @@ import { Page } from "@scm-manager/ui-components"; import { getGroupsLink, getUserAutoCompleteLink } from "../../modules/indexResource"; import { createGroup, isCreateGroupPending, getCreateGroupFailure, createGroupReset } from "../modules/groups"; import GroupForm from "../components/GroupForm"; +import { apiClient } from "@scm-manager/ui-components/src"; type Props = WithTranslation & { createGroup: (link: string, group: Group, callback?: () => void) => void; @@ -40,7 +41,8 @@ class CreateGroup extends React.Component { loadUserAutocompletion = (inputValue: string) => { const url = this.props.autocompleteLink + "?q="; - return fetch(url + inputValue) + return apiClient + .get(url + inputValue) .then(response => response.json()) .then(json => { return json.map(element => { diff --git a/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx b/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx index 9a70bfefa4..e3307274bd 100644 --- a/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx +++ b/scm-ui/ui-webapp/src/groups/containers/EditGroup.tsx @@ -8,6 +8,7 @@ import { Group } from "@scm-manager/ui-types"; import { ErrorNotification } from "@scm-manager/ui-components"; import { getUserAutoCompleteLink } from "../../modules/indexResource"; import DeleteGroup from "./DeleteGroup"; +import { apiClient } from "@scm-manager/ui-components/src"; type Props = { group: Group; @@ -36,7 +37,8 @@ class EditGroup extends React.Component { loadUserAutocompletion = (inputValue: string) => { const url = this.props.autocompleteLink + "?q="; - return fetch(url + inputValue) + return apiClient + .get(url + inputValue) .then(response => response.json()) .then(json => { return json.map(element => { From c944f234472a891d7f72b66d8d034043fb4f9508 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:13:25 +0100 Subject: [PATCH 060/144] update legman to version 1.6.1, in order to fix a ExecutorService leak --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fa7045684..98ddfde58a 100644 --- a/pom.xml +++ b/pom.xml @@ -845,7 +845,7 @@ 2.3.0 - 1.6.0 + 1.6.1 9.4.22.v20191022 From ff7b8ca842097dd0e4a5de0a6cde847ed910d85e Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:16:15 +0100 Subject: [PATCH 061/144] make ClassLoaderLeakPreventorFactory configurable and mark BootstrapClassLoader as shutdown --- .../classloading/BootstrapClassLoader.java | 22 +++++ .../classloading/ClassLoaderLifeCycle.java | 97 ++++++++++++++++--- .../ClassLoaderLifeCycleTest.java | 7 +- 3 files changed, 111 insertions(+), 15 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/BootstrapClassLoader.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/BootstrapClassLoader.java index 64d9b75d36..a274dbb33c 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/BootstrapClassLoader.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/BootstrapClassLoader.java @@ -5,7 +5,29 @@ package sonia.scm.lifecycle.classloading; * find it in a heap dump. */ class BootstrapClassLoader extends ClassLoader { + + /** + * Marker to find a BootstrapClassLoader, which is already shutdown. + */ + private boolean shutdown = false; + BootstrapClassLoader(ClassLoader webappClassLoader) { super(webappClassLoader); } + + /** + * Returns {@code true} if the classloader was shutdown. + * + * @return {@code true} if the classloader was shutdown + */ + boolean isShutdown() { + return shutdown; + } + + /** + * Mark the class loader as shutdown. + */ + void markAsShutdown() { + shutdown = true; + } } diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java index 24d1c239b4..a64ed6fa43 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java @@ -5,7 +5,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor; import se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventorFactory; +import se.jiderhamn.classloader.leak.prevention.cleanup.IIOServiceProviderCleanUp; import se.jiderhamn.classloader.leak.prevention.cleanup.MBeanCleanUp; +import se.jiderhamn.classloader.leak.prevention.cleanup.ShutdownHookCleanUp; +import se.jiderhamn.classloader.leak.prevention.cleanup.StopThreadsCleanUp; +import se.jiderhamn.classloader.leak.prevention.preinit.AwtToolkitInitiator; +import se.jiderhamn.classloader.leak.prevention.preinit.Java2dDisposerInitiator; +import se.jiderhamn.classloader.leak.prevention.preinit.Java2dRenderQueueInitiator; import se.jiderhamn.classloader.leak.prevention.preinit.SunAwtAppContextInitiator; import sonia.scm.lifecycle.LifeCycle; import sonia.scm.plugin.ChildFirstPluginClassLoader; @@ -16,9 +22,9 @@ import java.io.IOException; import java.net.URL; import java.util.ArrayDeque; import java.util.Deque; -import java.util.function.UnaryOperator; import static com.google.common.base.Preconditions.checkState; +import static se.jiderhamn.classloader.leak.prevention.cleanup.ShutdownHookCleanUp.SHUTDOWN_HOOK_WAIT_MS_DEFAULT; /** * Creates and shutdown SCM-Manager ClassLoaders. @@ -27,23 +33,25 @@ public final class ClassLoaderLifeCycle implements LifeCycle { private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderLifeCycle.class); - private final Deque classLoaders = new ArrayDeque<>(); + private Deque classLoaders = new ArrayDeque<>(); private final ClassLoaderLeakPreventorFactory classLoaderLeakPreventorFactory; private final ClassLoader webappClassLoader; - private ClassLoader bootstrapClassLoader; - private UnaryOperator classLoaderAppendListener = c -> c; + private BootstrapClassLoader bootstrapClassLoader; + + private ClassLoaderAppendListener classLoaderAppendListener = new ClassLoaderAppendListener() { + @Override + public C apply(C classLoader) { + return classLoader; + } + }; @VisibleForTesting public static ClassLoaderLifeCycle create() { - ClassLoaderLeakPreventorFactory classLoaderLeakPreventorFactory = new ClassLoaderLeakPreventorFactory(); - classLoaderLeakPreventorFactory.setLogger(new LoggingAdapter()); - // the SunAwtAppContextInitiator causes a lot of exceptions and we use no awt - classLoaderLeakPreventorFactory.removePreInitiator(SunAwtAppContextInitiator.class); - // the MBeanCleanUp causes a Exception and we use no mbeans - classLoaderLeakPreventorFactory.removeCleanUp(MBeanCleanUp.class); - return new ClassLoaderLifeCycle(Thread.currentThread().getContextClassLoader(), classLoaderLeakPreventorFactory); + ClassLoader webappClassLoader = Thread.currentThread().getContextClassLoader(); + ClassLoaderLeakPreventorFactory classLoaderLeakPreventorFactory = createClassLoaderLeakPreventorFactory(webappClassLoader); + return new ClassLoaderLifeCycle(webappClassLoader, classLoaderLeakPreventorFactory); } ClassLoaderLifeCycle(ClassLoader webappClassLoader, ClassLoaderLeakPreventorFactory classLoaderLeakPreventorFactory) { @@ -51,12 +59,64 @@ public final class ClassLoaderLifeCycle implements LifeCycle { this.webappClassLoader = initAndAppend(webappClassLoader); } + private static ClassLoaderLeakPreventorFactory createClassLoaderLeakPreventorFactory(ClassLoader webappClassLoader) { + // Should threads tied to the web app classloader be forced to stop at application shutdown? + boolean stopThreads = Boolean.getBoolean("ClassLoaderLeakPreventor.stopThreads"); + + // Should Timer threads tied to the web app classloader be forced to stop at application shutdown? + boolean stopTimerThreads = Boolean.getBoolean("ClassLoaderLeakPreventor.stopTimerThreads"); + + // Should shutdown hooks registered from the application be executed at application shutdown? + boolean executeShutdownHooks = Boolean.getBoolean("ClassLoaderLeakPreventor.executeShutdownHooks"); + + // No of milliseconds to wait for threads to finish execution, before stopping them. + int threadWaitMs = Integer.getInteger("ClassLoaderLeakPreventor.threadWaitMs", ClassLoaderLeakPreventor.THREAD_WAIT_MS_DEFAULT); + + /* + * No of milliseconds to wait for shutdown hooks to finish execution, before stopping them. + * If set to -1 there will be no waiting at all, but Thread is allowed to run until finished. + */ + int shutdownHookWaitMs = Integer.getInteger("ClassLoaderLeakPreventor.shutdownHookWaitMs", SHUTDOWN_HOOK_WAIT_MS_DEFAULT); + + LOG.info("Settings for {} (CL: 0x{}):", ClassLoaderLifeCycle.class.getName(), Integer.toHexString(System.identityHashCode(webappClassLoader)) ); + LOG.info(" stopThreads = {}", stopThreads); + LOG.info(" stopTimerThreads = {}", stopTimerThreads); + LOG.info(" executeShutdownHooks = {}", executeShutdownHooks); + LOG.info(" threadWaitMs = {} ms", threadWaitMs); + LOG.info(" shutdownHookWaitMs = {} ms", shutdownHookWaitMs); + + // use webapp classloader as safe base? or system? + ClassLoaderLeakPreventorFactory classLoaderLeakPreventorFactory = new ClassLoaderLeakPreventorFactory(webappClassLoader); + classLoaderLeakPreventorFactory.setLogger(new LoggingAdapter()); + + final ShutdownHookCleanUp shutdownHookCleanUp = classLoaderLeakPreventorFactory.getCleanUp(ShutdownHookCleanUp.class); + shutdownHookCleanUp.setExecuteShutdownHooks(executeShutdownHooks); + shutdownHookCleanUp.setShutdownHookWaitMs(shutdownHookWaitMs); + + final StopThreadsCleanUp stopThreadsCleanUp = classLoaderLeakPreventorFactory.getCleanUp(StopThreadsCleanUp.class); + stopThreadsCleanUp.setStopThreads(stopThreads); + stopThreadsCleanUp.setStopTimerThreads(stopTimerThreads); + stopThreadsCleanUp.setThreadWaitMs(threadWaitMs); + + // remove awt and imageio cleanup + classLoaderLeakPreventorFactory.removePreInitiator(AwtToolkitInitiator.class); + classLoaderLeakPreventorFactory.removePreInitiator(SunAwtAppContextInitiator.class); + classLoaderLeakPreventorFactory.removeCleanUp(IIOServiceProviderCleanUp.class); + classLoaderLeakPreventorFactory.removePreInitiator(Java2dRenderQueueInitiator.class); + classLoaderLeakPreventorFactory.removePreInitiator(Java2dDisposerInitiator.class); + + // the MBeanCleanUp causes a Exception and we use no mbeans + classLoaderLeakPreventorFactory.removeCleanUp(MBeanCleanUp.class); + + return classLoaderLeakPreventorFactory; + } + public void initialize() { bootstrapClassLoader = initAndAppend(new BootstrapClassLoader(webappClassLoader)); } @VisibleForTesting - void setClassLoaderAppendListener(UnaryOperator classLoaderAppendListener) { + void setClassLoaderAppendListener(ClassLoaderAppendListener classLoaderAppendListener) { this.classLoaderAppendListener = classLoaderAppendListener; } @@ -84,12 +144,17 @@ public final class ClassLoaderLifeCycle implements LifeCycle { clap.shutdown(); clap = classLoaders.poll(); } + // be sure it is realy empty + classLoaders.clear(); + classLoaders = new ArrayDeque<>(); + + bootstrapClassLoader.markAsShutdown(); bootstrapClassLoader = null; } - private ClassLoader initAndAppend(ClassLoader originalClassLoader) { + private T initAndAppend(T originalClassLoader) { LOG.debug("init classloader {}", originalClassLoader); - ClassLoader classLoader = classLoaderAppendListener.apply(originalClassLoader); + T classLoader = classLoaderAppendListener.apply(originalClassLoader); ClassLoaderLeakPreventor preventor = classLoaderLeakPreventorFactory.newLeakPreventor(classLoader); preventor.runPreClassLoaderInitiators(); @@ -98,6 +163,10 @@ public final class ClassLoaderLifeCycle implements LifeCycle { return classLoader; } + interface ClassLoaderAppendListener { + C apply(C classLoader); + } + private class ClassLoaderAndPreventor { private final ClassLoader classLoader; diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java index 0ab98039d1..a8f37777d7 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java @@ -70,7 +70,12 @@ class ClassLoaderLifeCycleTest { URLClassLoader webappClassLoader = spy(new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader())); ClassLoaderLifeCycle lifeCycle = createMockedLifeCycle(webappClassLoader); - lifeCycle.setClassLoaderAppendListener(c -> spy(c)); + lifeCycle.setClassLoaderAppendListener(new ClassLoaderLifeCycle.ClassLoaderAppendListener() { + @Override + public C apply(C classLoader) { + return spy(classLoader); + } + }); lifeCycle.initialize(); ClassLoader pluginA = lifeCycle.createChildFirstPluginClassLoader(new URL[0], null, "a"); From 755b99f52447d2879cd4612c82b2ee2ba0b60a1b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:17:30 +0100 Subject: [PATCH 062/144] close CronThreadFactory to avoid thread leak --- .../src/main/java/sonia/scm/schedule/CronScheduler.java | 5 ++++- .../src/main/java/sonia/scm/schedule/CronThreadFactory.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/schedule/CronScheduler.java b/scm-webapp/src/main/java/sonia/scm/schedule/CronScheduler.java index 7899697746..8577768495 100644 --- a/scm-webapp/src/main/java/sonia/scm/schedule/CronScheduler.java +++ b/scm-webapp/src/main/java/sonia/scm/schedule/CronScheduler.java @@ -17,15 +17,17 @@ public class CronScheduler implements Scheduler { private final ScheduledExecutorService executorService; private final CronTaskFactory taskFactory; + private final CronThreadFactory threadFactory; @Inject public CronScheduler(CronTaskFactory taskFactory) { this.taskFactory = taskFactory; + this.threadFactory = new CronThreadFactory(); this.executorService = createExecutor(); } private ScheduledExecutorService createExecutor() { - return Executors.newScheduledThreadPool(2, new CronThreadFactory()); + return Executors.newScheduledThreadPool(2, threadFactory); } @Override @@ -52,6 +54,7 @@ public class CronScheduler implements Scheduler { @Override public void close() { LOG.debug("shutdown underlying executor service"); + threadFactory.close(); executorService.shutdown(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/schedule/CronThreadFactory.java b/scm-webapp/src/main/java/sonia/scm/schedule/CronThreadFactory.java index 6519f500fa..bb732b4512 100644 --- a/scm-webapp/src/main/java/sonia/scm/schedule/CronThreadFactory.java +++ b/scm-webapp/src/main/java/sonia/scm/schedule/CronThreadFactory.java @@ -1,5 +1,6 @@ package sonia.scm.schedule; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.shiro.util.ThreadContext; import java.util.concurrent.ExecutionException; @@ -19,7 +20,10 @@ class CronThreadFactory implements ThreadFactory, AutoCloseable { private static final AtomicLong FACTORY_COUNTER = new AtomicLong(); - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutorService executorService = Executors.newSingleThreadExecutor( + new ThreadFactoryBuilder().setNameFormat("CronThreadFactory-%d").build() + ); + private final long factoryId = FACTORY_COUNTER.incrementAndGet(); private final AtomicLong threadCounter = new AtomicLong(); From d1a5f6f24b33405f5882f8761e63dfa974b208fa Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:20:55 +0100 Subject: [PATCH 063/144] fix wrong ClassLoader for Delayed-Restart Thread, which has caused an ClassLoader leak. Also added system properties to configure shutdown only, wait between stop and start and possibility to disable gc. --- .../sonia/scm/event/LegmanScmEventBus.java | 52 +++++++++++++------ .../scm/event/ShutdownEventBusEvent.java | 4 ++ .../scm/lifecycle/BootstrapContextFilter.java | 7 ++- .../InjectionContextRestartStrategy.java | 49 +++++++++++++++-- .../sonia/scm/lifecycle/RestartStrategy.java | 5 +- .../InjectionContextRestartStrategyTest.java | 5 +- 6 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/event/ShutdownEventBusEvent.java diff --git a/scm-webapp/src/main/java/sonia/scm/event/LegmanScmEventBus.java b/scm-webapp/src/main/java/sonia/scm/event/LegmanScmEventBus.java index 85f760a71f..52b80679d9 100644 --- a/scm-webapp/src/main/java/sonia/scm/event/LegmanScmEventBus.java +++ b/scm-webapp/src/main/java/sonia/scm/event/LegmanScmEventBus.java @@ -90,8 +90,12 @@ public class LegmanScmEventBus extends ScmEventBus @Override public void post(Object event) { - logger.debug("post {} to event bus {}", event, name); - eventBus.post(event); + if (eventBus != null) { + logger.debug("post {} to event bus {}", event, name); + eventBus.post(event); + } else { + logger.error("failed to post event {}, because event bus is shutdown", event); + } } /** @@ -104,9 +108,12 @@ public class LegmanScmEventBus extends ScmEventBus @Override public void register(Object object) { - logger.trace("register {} to event bus {}", object, name); - eventBus.register(object); - + if (eventBus != null) { + logger.trace("register {} to event bus {}", object, name); + eventBus.register(object); + } else { + logger.error("failed to register {}, because eventbus is shutdown", object); + } } /** @@ -118,22 +125,37 @@ public class LegmanScmEventBus extends ScmEventBus @Override public void unregister(Object object) { - logger.trace("unregister {} from event bus {}", object, name); - - try - { - eventBus.unregister(object); + if (eventBus != null) { + logger.trace("unregister {} from event bus {}", object, name); + + try { + eventBus.unregister(object); + } catch (IllegalArgumentException ex) { + logger.trace("object {} was not registered", object); + } + } else { + logger.error("failed to unregister object {}, because event bus is shutdown", object); } - catch (IllegalArgumentException ex) - { - logger.trace("object {} was not registered", object); + } + + @Subscribe(async = false) + public void shutdownEventBus(ShutdownEventBusEvent shutdownEventBusEvent) { + if (eventBus != null) { + logger.info("shutdown event bus executor for {}, because of received ShutdownEventBusEvent", name); + eventBus.shutdown(); + eventBus = null; + } else { + logger.warn("event bus was already shutdown"); } } @Subscribe(async = false) public void recreateEventBus(RecreateEventBusEvent recreateEventBusEvent) { - logger.info("shutdown event bus executor for {}", name); - eventBus.shutdown(); + if (eventBus != null) { + logger.info("shutdown event bus executor for {}, because of received RecreateEventBusEvent", name); + eventBus.shutdown(); + } + logger.info("recreate event bus because of received RecreateEventBusEvent"); eventBus = create(); } diff --git a/scm-webapp/src/main/java/sonia/scm/event/ShutdownEventBusEvent.java b/scm-webapp/src/main/java/sonia/scm/event/ShutdownEventBusEvent.java new file mode 100644 index 0000000000..5e5ab9ca5c --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/event/ShutdownEventBusEvent.java @@ -0,0 +1,4 @@ +package sonia.scm.event; + +public class ShutdownEventBusEvent { +} diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextFilter.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextFilter.java index ffb7631922..1d642d9c66 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextFilter.java @@ -58,13 +58,16 @@ public class BootstrapContextFilter extends GuiceFilter { private final BootstrapContextListener listener = new BootstrapContextListener(); + private ClassLoader webAppClassLoader; + /** Field description */ private FilterConfig filterConfig; @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; - + // store webapp classloader for delayed restarts + webAppClassLoader = Thread.currentThread().getContextClassLoader(); initializeContext(); } @@ -97,7 +100,7 @@ public class BootstrapContextFilter extends GuiceFilter { if (filterConfig == null) { LOG.error("filter config is null, scm-manager is not initialized"); } else { - RestartStrategy restartStrategy = RestartStrategy.get(); + RestartStrategy restartStrategy = RestartStrategy.get(webAppClassLoader); restartStrategy.restart(new GuiceInjectionContext()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java index 683507c563..2db60580b1 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.event.RecreateEventBusEvent; import sonia.scm.event.ScmEventBus; +import sonia.scm.event.ShutdownEventBusEvent; import java.util.concurrent.atomic.AtomicLong; @@ -13,20 +14,47 @@ import java.util.concurrent.atomic.AtomicLong; */ public class InjectionContextRestartStrategy implements RestartStrategy { + private static final String DISABLE_RESTART_PROPERTY = "sonia.scm.restart.disable"; + private static final String WAIT_PROPERTY = "sonia.scm.restart.wait"; + private static final String DISABLE_GC_PROPERTY = "sonia.scm.restart.disable-gc"; + private static final AtomicLong INSTANCE_COUNTER = new AtomicLong(); private static final Logger LOG = LoggerFactory.getLogger(InjectionContextRestartStrategy.class); - private long waitInMs = 250L; + private boolean restartEnabled = !Boolean.getBoolean(DISABLE_RESTART_PROPERTY); + private long waitInMs = Integer.getInteger(WAIT_PROPERTY, 250); + private boolean gcEnabled = !Boolean.getBoolean(DISABLE_GC_PROPERTY); + + private final ClassLoader webAppClassLoader; + + InjectionContextRestartStrategy(ClassLoader webAppClassLoader) { + this.webAppClassLoader = webAppClassLoader; + } @VisibleForTesting void setWaitInMs(long waitInMs) { this.waitInMs = waitInMs; } + @VisibleForTesting + void setGcEnabled(boolean gcEnabled) { + this.gcEnabled = gcEnabled; + } + @Override public void restart(InjectionContext context) { - LOG.warn("destroy injection context"); - context.destroy(); + stop(context); + if (restartEnabled) { + start(context); + } else { + LOG.warn("restarting context is disabled"); + } + } + + @SuppressWarnings("squid:S1215") // suppress explicit gc call warning + private void start(InjectionContext context) { + LOG.debug("use WebAppClassLoader as ContextClassLoader, to avoid ClassLoader leaks"); + Thread.currentThread().setContextClassLoader(webAppClassLoader); LOG.warn("send recreate eventbus event"); ScmEventBus.getInstance().post(new RecreateEventBusEvent()); @@ -34,6 +62,12 @@ public class InjectionContextRestartStrategy implements RestartStrategy { // restart context delayed, to avoid timing problems new Thread(() -> { try { + if (gcEnabled){ + LOG.info("call gc to clean up memory from old instances"); + System.gc(); + } + + LOG.info("wait {}ms before re starting the context", waitInMs); Thread.sleep(waitInMs); LOG.warn("reinitialize injection context"); @@ -45,6 +79,15 @@ public class InjectionContextRestartStrategy implements RestartStrategy { LOG.error("failed to restart", ex); } }, "Delayed-Restart-" + INSTANCE_COUNTER.incrementAndGet()).start(); + } + private void stop(InjectionContext context) { + LOG.warn("destroy injection context"); + context.destroy(); + + if (!restartEnabled) { + // shutdown eventbus, but do this only if restart is disabled + ScmEventBus.getInstance().post(new ShutdownEventBusEvent()); + } } } diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/RestartStrategy.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/RestartStrategy.java index 769351a850..6c7dd69259 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/RestartStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/RestartStrategy.java @@ -13,7 +13,6 @@ public interface RestartStrategy { * Initialize the injection context. */ void initialize(); - /** * Destroys the injection context. */ @@ -31,8 +30,8 @@ public interface RestartStrategy { * * @return configured strategy */ - static RestartStrategy get() { - return new InjectionContextRestartStrategy(); + static RestartStrategy get(ClassLoader webAppClassLoader) { + return new InjectionContextRestartStrategy(webAppClassLoader); } } diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/InjectionContextRestartStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/InjectionContextRestartStrategyTest.java index 355dca4a16..ddd691e5da 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/InjectionContextRestartStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/InjectionContextRestartStrategyTest.java @@ -18,11 +18,13 @@ class InjectionContextRestartStrategyTest { @Mock private RestartStrategy.InjectionContext context; - private InjectionContextRestartStrategy strategy = new InjectionContextRestartStrategy(); + private InjectionContextRestartStrategy strategy = new InjectionContextRestartStrategy(Thread.currentThread().getContextClassLoader()); @BeforeEach void setWaitToZero() { strategy.setWaitInMs(0L); + // disable gc during tests + strategy.setGcEnabled(false); } @Test @@ -47,7 +49,6 @@ class InjectionContextRestartStrategyTest { @Test void shouldRegisterContextAfterRestart() throws InterruptedException { TestingInjectionContext ctx = new TestingInjectionContext(); - strategy.restart(ctx); Thread.sleep(50L); From 571f5aa4212536900b90f6101affe679feb7fdc9 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:21:52 +0100 Subject: [PATCH 064/144] destroy guice context from BootstrapContextListener --- .../java/sonia/scm/lifecycle/BootstrapContextListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextListener.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextListener.java index 223e3cf65b..5b9f40dbc2 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/BootstrapContextListener.java @@ -66,7 +66,7 @@ public class BootstrapContextListener extends GuiceServletContextListener { private static final Logger LOG = LoggerFactory.getLogger(BootstrapContextListener.class); - private final ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create(); + private ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create(); private ServletContext context; private InjectionLifeCycle injectionLifeCycle; @@ -110,6 +110,8 @@ public class BootstrapContextListener extends GuiceServletContextListener { injectionLifeCycle.shutdown(); injectionLifeCycle = null; classLoaderLifeCycle.shutdown(); + + super.contextDestroyed(sce); } private Injector createStageTwoInjector() { From 2fde62256063931de8c79726aa31ba1a4db1fa1b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:22:39 +0100 Subject: [PATCH 065/144] reset resteasy StatisticsController to avoid ClassLoader leaks --- .../modules/ResteasyAllInOneServletDispatcher.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java index 0cbb3cd671..8f602db766 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/ResteasyAllInOneServletDispatcher.java @@ -7,6 +7,7 @@ import org.jboss.resteasy.plugins.server.servlet.ListenerBootstrap; import org.jboss.resteasy.spi.Registry; import org.jboss.resteasy.spi.ResteasyDeployment; import org.jboss.resteasy.spi.ResteasyProviderFactory; +import org.jboss.resteasy.spi.statistics.StatisticsController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,6 +71,12 @@ public class ResteasyAllInOneServletDispatcher extends HttpServletDispatcher { super.destroy(); deployment.stop(); + // clear ResourceLocatorInvoker leaks + StatisticsController statisticsController = ResteasyProviderFactory.getInstance().getStatisticsController(); + if (statisticsController != null) { + statisticsController.reset(); + } + // ensure everything gets cleared, to avoid classloader leaks ResteasyProviderFactory.clearInstanceIfEqual(ResteasyProviderFactory.getInstance()); RuntimeDelegate.setInstance(null); From ca8d5956e0c3246f78e5930cf28587f17a451821 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 21 Nov 2019 16:23:04 +0100 Subject: [PATCH 066/144] shutdown executor on context destroy --- .../java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java index 8da159f3c0..fa8507c917 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java @@ -52,7 +52,7 @@ import javax.servlet.http.HttpServletResponse; * * @author Sebastian Sdorra */ -public class DefaultCGIExecutorFactory implements CGIExecutorFactory +public class DefaultCGIExecutorFactory implements CGIExecutorFactory, AutoCloseable { /** @@ -92,6 +92,11 @@ public class DefaultCGIExecutorFactory implements CGIExecutorFactory //~--- fields --------------------------------------------------------------- + @Override + public void close() { + executor.shutdown(); + } + /** Field description */ private final ExecutorService executor; } From 80545405442f97d369bd7346b722869767918c3a Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 21 Nov 2019 16:38:34 +0100 Subject: [PATCH 067/144] Extend timeout on restart after plugin installation --- scm-ui/ui-webapp/src/admin/plugins/components/waitForRestart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-ui/ui-webapp/src/admin/plugins/components/waitForRestart.ts b/scm-ui/ui-webapp/src/admin/plugins/components/waitForRestart.ts index 48fbc8002c..77e7520f17 100644 --- a/scm-ui/ui-webapp/src/admin/plugins/components/waitForRestart.ts +++ b/scm-ui/ui-webapp/src/admin/plugins/components/waitForRestart.ts @@ -1,7 +1,7 @@ import { apiClient } from "@scm-manager/ui-components"; const waitForRestart = () => { - const endTime = Number(new Date()) + 10000; + const endTime = Number(new Date()) + 60000; let started = false; const executor = (resolve, reject) => { From aedf34c5817b9b83bc9ef5caa313b2ad6c1d2aef Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 22 Nov 2019 15:43:58 +0100 Subject: [PATCH 068/144] Postpone restart after plugin (de)installation --- .../main/java/sonia/scm/plugin/DefaultPluginManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 07accbcc76..0c931ff7a6 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -243,7 +243,13 @@ public class DefaultPluginManager implements PluginManager { } private void restart(String cause) { - eventBus.post(new RestartEvent(PluginManager.class, cause)); + new Thread(() -> { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + eventBus.post(new RestartEvent(PluginManager.class, cause)); + }).start(); } private void cancelPending(List pendingInstallations) { From 450ed7bd4eb10518640d834814800ab08e36b065 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 25 Nov 2019 08:15:13 +0100 Subject: [PATCH 069/144] Fix unit test --- .../scm/plugin/DefaultPluginManager.java | 9 +++--- .../scm/plugin/DefaultPluginManagerTest.java | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 0c931ff7a6..b74b17cd88 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -187,7 +187,7 @@ public class DefaultPluginManager implements PluginManager { if (!pendingInstallations.isEmpty()) { if (restartAfterInstallation) { - restart("plugin installation"); + triggerRestart("plugin installation"); } else { pendingInstallQueue.addAll(pendingInstallations); updateMayUninstallFlag(); @@ -205,7 +205,7 @@ public class DefaultPluginManager implements PluginManager { markForUninstall(installed); if (restartAfterInstallation) { - restart("plugin installation"); + triggerRestart("plugin installation"); } else { updateMayUninstallFlag(); } @@ -238,11 +238,12 @@ public class DefaultPluginManager implements PluginManager { public void executePendingAndRestart() { PluginPermissions.manage().check(); if (!pendingInstallQueue.isEmpty() || getInstalled().stream().anyMatch(InstalledPlugin::isMarkedForUninstall)) { - restart("execute pending plugin changes"); + triggerRestart("execute pending plugin changes"); } } - private void restart(String cause) { + @VisibleForTesting + void triggerRestart(String cause) { new Thread(() -> { try { Thread.sleep(200); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java index f817476848..f6aa1d7301 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -12,13 +12,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.NotFoundException; import sonia.scm.ScmConstraintViolationException; -import sonia.scm.event.ScmEventBus; -import sonia.scm.lifecycle.RestartEvent; import java.io.IOException; import java.nio.file.Files; @@ -48,9 +45,6 @@ import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(TempDirectory.class) class DefaultPluginManagerTest { - @Mock - private ScmEventBus eventBus; - @Mock private PluginLoader loader; @@ -60,12 +54,13 @@ class DefaultPluginManagerTest { @Mock private PluginInstaller installer; - @InjectMocks private DefaultPluginManager manager; @Mock private Subject subject; + private boolean restartTriggered = false; + @BeforeEach void mockInstaller() { lenient().when(installer.install(any())).then(ic -> { @@ -74,6 +69,16 @@ class DefaultPluginManagerTest { }); } + @BeforeEach + void createPluginManagerToTestWithCapturedRestart() { + manager = new DefaultPluginManager(null, loader, center, installer) { // event bus is only used in restart and this is replaced here + @Override + void triggerRestart(String cause) { + restartTriggered = true; + } + }; + } + @Nested class WithAdminPermissions { @@ -180,7 +185,7 @@ class DefaultPluginManagerTest { manager.install("scm-git-plugin", false); verify(installer).install(git); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -258,7 +263,7 @@ class DefaultPluginManagerTest { manager.install("scm-git-plugin", true); verify(installer).install(git); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test @@ -267,7 +272,7 @@ class DefaultPluginManagerTest { when(loader.getInstalledPlugins()).thenReturn(ImmutableList.of(gitInstalled)); manager.install("scm-git-plugin", true); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -289,14 +294,14 @@ class DefaultPluginManagerTest { manager.install("scm-review-plugin", false); manager.executePendingAndRestart(); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test void shouldNotSendRestartEventWithoutPendingPlugins() { manager.executePendingAndRestart(); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -447,7 +452,7 @@ class DefaultPluginManagerTest { manager.executePendingAndRestart(); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test From fdef95f254454145af7cae1b245aabe5fea0ec6e Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 25 Nov 2019 07:43:39 +0000 Subject: [PATCH 070/144] Close branch bugfix/autocomplete_with_xsrf From f2d92c49d1518a29dce20eea6acea9fa916ec298 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 25 Nov 2019 11:37:23 +0100 Subject: [PATCH 071/144] show error messages on failed branch creation --- .../ui-webapp/src/repos/branches/containers/CreateBranch.tsx | 2 +- scm-ui/ui-webapp/src/repos/branches/modules/branches.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scm-ui/ui-webapp/src/repos/branches/containers/CreateBranch.tsx b/scm-ui/ui-webapp/src/repos/branches/containers/CreateBranch.tsx index 8ae8640c62..36fe6746e3 100644 --- a/scm-ui/ui-webapp/src/repos/branches/containers/CreateBranch.tsx +++ b/scm-ui/ui-webapp/src/repos/branches/containers/CreateBranch.tsx @@ -114,7 +114,7 @@ const mapDispatchToProps = dispatch => { const mapStateToProps = (state, ownProps) => { const { repository } = ownProps; const loading = isFetchBranchesPending(state, repository) || isCreateBranchPending(state, repository); - const error = getFetchBranchesFailure(state, repository) || getCreateBranchFailure(state); + const error = getFetchBranchesFailure(state, repository) || getCreateBranchFailure(state, repository); const branches = getBranches(state, repository); const createBranchesLink = getBranchCreateLink(state, repository); return { diff --git a/scm-ui/ui-webapp/src/repos/branches/modules/branches.ts b/scm-ui/ui-webapp/src/repos/branches/modules/branches.ts index 35c55aec42..a58f43c4c7 100644 --- a/scm-ui/ui-webapp/src/repos/branches/modules/branches.ts +++ b/scm-ui/ui-webapp/src/repos/branches/modules/branches.ts @@ -186,8 +186,8 @@ export function isCreateBranchPending(state: object, repository: Repository) { return isPending(state, CREATE_BRANCH, createKey(repository)); } -export function getCreateBranchFailure(state: object) { - return getFailure(state, CREATE_BRANCH); +export function getCreateBranchFailure(state: object, repository: Repository) { + return getFailure(state, CREATE_BRANCH, createKey(repository)); } export function createBranchPending(repository: Repository): Action { From 47fc883cab43f74f81361865014ba5b3c2cdd3e7 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 25 Nov 2019 12:24:54 +0100 Subject: [PATCH 072/144] fix unit tests --- .../ui-webapp/src/repos/branches/modules/branches.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scm-ui/ui-webapp/src/repos/branches/modules/branches.test.ts b/scm-ui/ui-webapp/src/repos/branches/modules/branches.test.ts index 2003477101..b23ccc640b 100644 --- a/scm-ui/ui-webapp/src/repos/branches/modules/branches.test.ts +++ b/scm-ui/ui-webapp/src/repos/branches/modules/branches.test.ts @@ -482,14 +482,14 @@ describe("branches", () => { it("should return error when create branch did fail", () => { const state = { failure: { - [CREATE_BRANCH]: error + [CREATE_BRANCH + `/${repository.namespace}/${repository.name}`]: error } }; - expect(getCreateBranchFailure(state)).toEqual(error); + expect(getCreateBranchFailure(state, repository)).toEqual(error); }); it("should return undefined when create branch did not fail", () => { - expect(getCreateBranchFailure({})).toBe(undefined); + expect(getCreateBranchFailure({}, repository)).toBe(undefined); }); }); }); From 34ab9104f21cc9c6f11e20fc01203a13dfa18d46 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 25 Nov 2019 12:12:47 +0000 Subject: [PATCH 073/144] Close branch bugfix/branch_error_messages From 04c004fedee0ad16c7d0805cf28c1a56c869f015 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 25 Nov 2019 12:25:10 +0000 Subject: [PATCH 074/144] Close branch feature/postpone_restart_for_plugin From 6c023f7d5695e3fa8d8c3bc63023ad2223cc2df1 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 25 Nov 2019 14:15:43 +0100 Subject: [PATCH 075/144] Fix sonar issue --- .../src/main/java/sonia/scm/plugin/DefaultPluginManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index b74b17cd88..f57d932e1e 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -248,6 +248,7 @@ public class DefaultPluginManager implements PluginManager { try { Thread.sleep(200); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } eventBus.post(new RestartEvent(PluginManager.class, cause)); }).start(); From 6bf86fab8d98ccd35afd5c00f2ace5e9730051ab Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 25 Nov 2019 17:04:58 +0100 Subject: [PATCH 076/144] Introduce abstraction layer for RESTeasy mock dispatcher --- .../v2/resources/GitConfigResourceTest.java | 25 ++-- ...HgConfigAutoConfigurationResourceTest.java | 25 ++-- .../HgConfigInstallationsResourceTest.java | 21 ++-- .../HgConfigPackageResourceTest.java | 21 ++-- .../v2/resources/HgConfigResourceTest.java | 25 ++-- .../v2/resources/SvnConfigResourceTest.java | 25 ++-- scm-test/pom.xml | 14 +++ .../java/sonia/scm/web/ScmTestDispatcher.java | 109 ++++++++++++++++++ .../AuthorizationExceptionMapperTest.java | 5 + .../resources/AuthenticationResourceTest.java | 14 +-- .../resources/AutoCompleteResourceTest.java | 8 +- .../AvailablePluginResourceTest.java | 28 +++-- .../v2/resources/BranchRootResourceTest.java | 19 ++- .../resources/ChangesetRootResourceTest.java | 6 +- .../api/v2/resources/ConfigResourceTest.java | 23 ++-- .../api/v2/resources/DiffResourceTest.java | 16 ++- .../scm/api/v2/resources/DispatcherMock.java | 24 ---- .../v2/resources/FileHistoryResourceTest.java | 6 +- .../v2/resources/GroupRootResourceTest.java | 10 +- .../resources/IncomingRootResourceTest.java | 10 +- .../InstalledPluginResourceTest.java | 34 +++--- .../scm/api/v2/resources/MeResourceTest.java | 8 +- .../resources/ModificationsResourceTest.java | 6 +- .../resources/PendingPluginResourceTest.java | 19 +-- .../RepositoryPermissionRootResourceTest.java | 20 +--- .../RepositoryRoleRootResourceTest.java | 10 +- .../resources/RepositoryRootResourceTest.java | 8 +- .../RepositoryTypeRootResourceTest.java | 7 +- .../v2/resources/SourceRootResourceTest.java | 7 +- .../api/v2/resources/TagRootResourceTest.java | 12 +- .../api/v2/resources/UIRootResourceTest.java | 18 ++- .../v2/resources/UserRootResourceTest.java | 7 +- 32 files changed, 327 insertions(+), 263 deletions(-) create mode 100644 scm-test/src/main/java/sonia/scm/web/ScmTestDispatcher.java create mode 100644 scm-webapp/src/test/java/sonia/scm/api/rest/AuthorizationExceptionMapperTest.java delete mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java index 7cfc79835b..3d3987aca3 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/api/v2/resources/GitConfigResourceTest.java @@ -2,14 +2,11 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.ArgumentCaptor; @@ -27,6 +24,7 @@ import sonia.scm.repository.RepositoryManager; import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.web.GitVndMediaType; +import sonia.scm.web.ScmTestDispatcher; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; @@ -52,10 +50,7 @@ public class GitConfigResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); @@ -89,7 +84,7 @@ public class GitConfigResourceTest { when(repositoryHandler.getConfig()).thenReturn(gitConfig); GitRepositoryConfigResource gitRepositoryConfigResource = new GitRepositoryConfigResource(repositoryConfigMapper, repositoryManager, new GitRepositoryConfigStoreProvider(configurationStoreFactory)); GitConfigResource gitConfigResource = new GitConfigResource(dtoToConfigMapper, configToDtoMapper, repositoryHandler, of(gitRepositoryConfigResource)); - dispatcher.getRegistry().addSingletonResource(gitConfigResource); + dispatcher.addSingletonResource(gitConfigResource); when(scmPathInfoStore.get().getApiRestUri()).thenReturn(baseUri); } @@ -137,10 +132,11 @@ public class GitConfigResourceTest { @Test @SubjectAware(username = "writeOnly") - public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:read:git]"); + public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = get(); - get(); + assertEquals("Subject does not have permission [configuration:read:git]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -152,10 +148,11 @@ public class GitConfigResourceTest { @Test @SubjectAware(username = "readOnly") - public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:write:git]"); + public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = put(); - put(); + assertEquals("Subject does not have permission [configuration:write:git]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java index 21da84e7ec..fa2b559041 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigAutoConfigurationResourceTest.java @@ -2,14 +2,11 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; @@ -18,12 +15,15 @@ import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.web.HgVndMediaType; +import sonia.scm.web.ScmTestDispatcher; import javax.inject.Provider; import javax.servlet.http.HttpServletResponse; import java.net.URISyntaxException; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,10 +37,7 @@ public class HgConfigAutoConfigurationResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @InjectMocks private HgConfigDtoToHgConfigMapperImpl dtoToConfigMapper; @@ -57,7 +54,7 @@ public class HgConfigAutoConfigurationResourceTest { new HgConfigAutoConfigurationResource(dtoToConfigMapper, repositoryHandler); when(resourceProvider.get()).thenReturn(resource); - dispatcher.getRegistry().addSingletonResource( + dispatcher.addSingletonResource( new HgConfigResource(null, null, null, null, resourceProvider, null)); } @@ -76,9 +73,10 @@ public class HgConfigAutoConfigurationResourceTest { @Test @SubjectAware(username = "readOnly") public void shouldNotSetDefaultConfigAndInstallHgWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:write:hg]"); + MockHttpResponse response = put(null); - put(null); + assertEquals("Subject does not have permission [configuration:write:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -95,9 +93,10 @@ public class HgConfigAutoConfigurationResourceTest { @Test @SubjectAware(username = "readOnly") public void shouldNotUpdateConfigAndInstallHgWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:write:hg]"); + MockHttpResponse response = put("{\"disabled\":true}"); - put("{\"disabled\":true}"); + assertEquals("Subject does not have permission [configuration:write:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } private MockHttpResponse put(String content) throws URISyntaxException { diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java index 2293d1ddb7..827c69d57f 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigInstallationsResourceTest.java @@ -2,19 +2,17 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import sonia.scm.web.ScmTestDispatcher; import javax.inject.Provider; import javax.servlet.http.HttpServletResponse; @@ -35,10 +33,7 @@ public class HgConfigInstallationsResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); @@ -57,7 +52,7 @@ public class HgConfigInstallationsResourceTest { HgConfigInstallationsResource resource = new HgConfigInstallationsResource(mapper); when(resourceProvider.get()).thenReturn(resource); - dispatcher.getRegistry().addSingletonResource( + dispatcher.addSingletonResource( new HgConfigResource(null, null, null, null, null, resourceProvider)); @@ -82,9 +77,10 @@ public class HgConfigInstallationsResourceTest { @Test @SubjectAware(username = "writeOnly") public void shouldNotGetHgInstallationsWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:read:hg]"); + MockHttpResponse response = get("hg"); - get("hg"); + assertEquals("Subject does not have permission [configuration:read:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -104,9 +100,10 @@ public class HgConfigInstallationsResourceTest { @Test @SubjectAware(username = "writeOnly") public void shouldNotGetPythonInstallationsWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:read:hg]"); + MockHttpResponse response = get("python"); - get("python"); + assertEquals("Subject does not have permission [configuration:read:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } private MockHttpResponse get(String path) throws URISyntaxException { diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java index 29032ac8de..6b77b7a0fc 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigPackageResourceTest.java @@ -5,14 +5,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.InjectMocks; @@ -23,6 +20,7 @@ import sonia.scm.installer.HgPackageReader; import sonia.scm.net.ahc.AdvancedHttpClient; import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.web.ScmTestDispatcher; import javax.inject.Provider; import javax.servlet.http.HttpServletResponse; @@ -49,10 +47,7 @@ public class HgConfigPackageResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = java.net.URI.create("/"); @@ -113,9 +108,10 @@ public class HgConfigPackageResourceTest { @Test @SubjectAware(username = "writeOnly") public void shouldNotGetPackagesWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:read:hg]"); + MockHttpResponse response = get(); - get(); + assertEquals("Subject does not have permission [configuration:read:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -158,9 +154,10 @@ public class HgConfigPackageResourceTest { @Test @SubjectAware(username = "readOnly") public void shouldNotInstallPackageWhenNotAuthorized() throws Exception { - thrown.expectMessage("Subject does not have permission [configuration:write:hg]"); + MockHttpResponse response = put("don-t-care"); - put("don-t-care"); + assertEquals("Subject does not have permission [configuration:write:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } private List createPackages() { @@ -191,7 +188,7 @@ public class HgConfigPackageResourceTest { new HgConfigPackageResource(hgPackageReader, advancedHttpClient, repositoryHandler, mapper); when(hgConfigPackageResourceProvider.get()).thenReturn(hgConfigPackageResource); - dispatcher.getRegistry().addSingletonResource( + dispatcher.addSingletonResource( new HgConfigResource(null, null, null, hgConfigPackageResourceProvider, null, null)); } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java index 910f5721e9..f03c894b13 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java @@ -4,14 +4,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.InjectMocks; @@ -20,6 +17,7 @@ import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.web.HgVndMediaType; +import sonia.scm.web.ScmTestDispatcher; import javax.inject.Provider; import javax.servlet.http.HttpServletResponse; @@ -43,10 +41,7 @@ public class HgConfigResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); @@ -78,7 +73,7 @@ public class HgConfigResourceTest { HgConfigResource gitConfigResource = new HgConfigResource(dtoToConfigMapper, configToDtoMapper, repositoryHandler, packagesResource, autoconfigResource, installationsResource); - dispatcher.getRegistry().addSingletonResource(gitConfigResource); + dispatcher.addSingletonResource(gitConfigResource); when(scmPathInfoStore.get().getApiRestUri()).thenReturn(baseUri); } @@ -120,10 +115,11 @@ public class HgConfigResourceTest { @Test @SubjectAware(username = "writeOnly") - public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:read:hg]"); + public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = get(); - get(); + assertEquals("Subject does not have permission [configuration:read:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -135,10 +131,11 @@ public class HgConfigResourceTest { @Test @SubjectAware(username = "readOnly") - public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:write:hg]"); + public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = put(); - put(); + assertEquals("Subject does not have permission [configuration:write:hg]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } private MockHttpResponse get() throws URISyntaxException { diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java index 6a854471dd..225c838a6c 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java @@ -4,14 +4,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.InjectMocks; @@ -19,6 +16,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.SvnConfig; import sonia.scm.repository.SvnRepositoryHandler; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.SvnVndMediaType; import javax.servlet.http.HttpServletResponse; @@ -42,10 +40,7 @@ public class SvnConfigResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); @@ -66,7 +61,7 @@ public class SvnConfigResourceTest { SvnConfig gitConfig = createConfiguration(); when(repositoryHandler.getConfig()).thenReturn(gitConfig); SvnConfigResource gitConfigResource = new SvnConfigResource(dtoToConfigMapper, configToDtoMapper, repositoryHandler); - dispatcher.getRegistry().addSingletonResource(gitConfigResource); + dispatcher.addSingletonResource(gitConfigResource); when(scmPathInfoStore.get().getApiRestUri()).thenReturn(baseUri); } @@ -108,10 +103,11 @@ public class SvnConfigResourceTest { @Test @SubjectAware(username = "writeOnly") - public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:read:svn]"); + public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = get(); - get(); + assertEquals("Subject does not have permission [configuration:read:svn]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -123,10 +119,11 @@ public class SvnConfigResourceTest { @Test @SubjectAware(username = "readOnly") - public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException { - thrown.expectMessage("Subject does not have permission [configuration:write:svn]"); + public void shouldNotUpdateConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { + MockHttpResponse response = put(); - put(); + assertEquals("Subject does not have permission [configuration:write:svn]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } private MockHttpResponse get() throws URISyntaxException { diff --git a/scm-test/pom.xml b/scm-test/pom.xml index bddbcf2c85..d36b8c55f8 100644 --- a/scm-test/pom.xml +++ b/scm-test/pom.xml @@ -42,6 +42,20 @@ ${mockito.version}
    + + org.jboss.resteasy + resteasy-core-spi + + + org.jboss.resteasy + resteasy-core + + + org.jboss.resteasy + resteasy-jackson2-provider + ${resteasy.version} + + org.slf4j slf4j-simple diff --git a/scm-test/src/main/java/sonia/scm/web/ScmTestDispatcher.java b/scm-test/src/main/java/sonia/scm/web/ScmTestDispatcher.java new file mode 100644 index 0000000000..f8b3040f73 --- /dev/null +++ b/scm-test/src/main/java/sonia/scm/web/ScmTestDispatcher.java @@ -0,0 +1,109 @@ +package sonia.scm.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.shiro.authz.AuthorizationException; +import org.apache.shiro.authz.UnauthorizedException; +import org.jboss.resteasy.mock.MockDispatcherFactory; +import org.jboss.resteasy.spi.Dispatcher; +import org.jboss.resteasy.spi.HttpRequest; +import org.jboss.resteasy.spi.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; +import sonia.scm.BadRequestException; +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; + +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import java.util.HashMap; +import java.util.Map; + +public class ScmTestDispatcher { + + private static final Logger LOG = LoggerFactory.getLogger(ScmTestDispatcher.class); + + private final Dispatcher dispatcher; + private final EnhanceableExceptionMapper exceptionMapper; + + public ScmTestDispatcher() { + dispatcher = MockDispatcherFactory.createDispatcher(); + exceptionMapper = new EnhanceableExceptionMapper(); + dispatcher.getProviderFactory().register(exceptionMapper); + dispatcher.getProviderFactory().registerProviderInstance(new JacksonProducer()); + } + + public void addSingletonResource(Object resource) { + dispatcher.getRegistry().addSingletonResource(resource); + } + + public void invoke(HttpRequest in, HttpResponse response) { + dispatcher.invoke(in, response); + } + + public void registerException(Class exceptionClass, Status status) { + exceptionMapper.registerException(exceptionClass, status); + } + + public void putDefaultContextObject(Class clazz, T object) { + dispatcher.getDefaultContextObjects().put(clazz, object); + } + + private static class EnhanceableExceptionMapper implements ExceptionMapper { + + private final Map, Integer> statusCodes = new HashMap<>(); + + public EnhanceableExceptionMapper() { + registerException(NotFoundException.class, Status.NOT_FOUND); + registerException(AlreadyExistsException.class, Status.CONFLICT); + registerException(ConcurrentModificationException.class, Status.CONFLICT); + registerException(UnauthorizedException.class, Status.FORBIDDEN); + registerException(AuthorizationException.class, Status.FORBIDDEN); + registerException(BadRequestException.class, Status.BAD_REQUEST); + } + + private void registerException(Class exceptionClass, Status status) { + statusCodes.put(exceptionClass, status.getStatusCode()); + } + + @Override + public Response toResponse(Exception e) { + return Response.status(getStatus(e)).entity(e.getMessage()).build(); + } + + private Integer getStatus(Exception ex) { + return statusCodes + .entrySet() + .stream() + .filter(e -> e.getKey().isAssignableFrom(ex.getClass())) + .map(Map.Entry::getValue) + .findAny() + .orElse(handleUnknownException(ex)); + } + + private Integer handleUnknownException(Exception ex) { + LOG.info("got unknown exception in rest api test", ex); + return 500; + } + } + + @Provider + @Produces("application/*+json") + public static class JacksonProducer implements ContextResolver { + public JacksonProducer() { + this.json + = new ObjectMapper().findAndRegisterModules(); + } + + @Override + public ObjectMapper getContext(Class objectType) { + return json; + } + + private final ObjectMapper json; + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/rest/AuthorizationExceptionMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/rest/AuthorizationExceptionMapperTest.java new file mode 100644 index 0000000000..f546a7cf34 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/rest/AuthorizationExceptionMapperTest.java @@ -0,0 +1,5 @@ +package sonia.scm.api.rest; + +class AuthorizationExceptionMapperTest { +// TODO verify differentiation between normal user and anonymous +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java index c5756fadd6..e96301ad2a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java @@ -2,11 +2,8 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; -import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -19,18 +16,17 @@ import sonia.scm.security.AccessTokenBuilder; import sonia.scm.security.AccessTokenBuilderFactory; import sonia.scm.security.AccessTokenCookieIssuer; import sonia.scm.security.DefaultAccessTokenCookieIssuer; +import sonia.scm.web.ScmTestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; import java.io.UnsupportedEncodingException; -import java.net.URI; import java.net.URISyntaxException; import java.util.Date; import java.util.Optional; import static java.net.URI.create; -import static java.util.Optional.empty; import static java.util.Optional.of; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; @@ -47,7 +43,7 @@ public class AuthenticationResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock private AccessTokenBuilderFactory accessTokenBuilderFactory; @@ -116,7 +112,7 @@ public class AuthenticationResourceTest { @Before public void prepareEnvironment() { authenticationResource = new AuthenticationResource(accessTokenBuilderFactory, cookieIssuer); - dispatcher.getRegistry().addSingletonResource(authenticationResource); + dispatcher.addSingletonResource(authenticationResource); AccessToken accessToken = mock(AccessToken.class); when(accessToken.getExpiration()).thenReturn(new Date(Long.MAX_VALUE)); @@ -125,9 +121,9 @@ public class AuthenticationResourceTest { when(accessTokenBuilderFactory.create()).thenReturn(accessTokenBuilder); HttpServletRequest servletRequest = mock(HttpServletRequest.class); - dispatcher.getDefaultContextObjects().put(HttpServletRequest.class, servletRequest); + dispatcher.putDefaultContextObject(HttpServletRequest.class, servletRequest); HttpServletResponse servletResponse = mock(HttpServletResponse.class); - dispatcher.getDefaultContextObjects().put(HttpServletResponse.class, servletResponse); + dispatcher.putDefaultContextObject(HttpServletResponse.class, servletResponse); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java index f8b4236b41..7356feafe1 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java @@ -5,7 +5,6 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import org.apache.shiro.util.ThreadContext; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -23,6 +22,7 @@ import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.user.DefaultUserDisplayManager; import sonia.scm.user.User; import sonia.scm.user.xml.XmlUserDAO; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import sonia.scm.xml.XmlDatabase; @@ -39,7 +39,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware(configuration = "classpath:sonia/scm/shiro-002.ini") @RunWith(MockitoJUnitRunner.Silent.class) @@ -50,7 +49,8 @@ public class AutoCompleteResourceTest { public static final String URL = "/" + AutoCompleteResource.PATH; private final Integer defaultLimit = DisplayManager.DEFAULT_LIMIT; - private Dispatcher dispatcher; + + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private XmlUserDAO userDao; private XmlGroupDAO groupDao; @@ -74,7 +74,7 @@ public class AutoCompleteResourceTest { DefaultUserDisplayManager userManager = new DefaultUserDisplayManager(this.userDao); DefaultGroupDisplayManager groupManager = new DefaultGroupDisplayManager(groupDao); AutoCompleteResource autoCompleteResource = new AutoCompleteResource(mapper, userManager, groupManager); - dispatcher = createDispatcher(autoCompleteResource); + dispatcher.addSingletonResource(autoCompleteResource); } @After diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java index 99190d942d..fd8b8b9fe9 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AvailablePluginResourceTest.java @@ -1,14 +1,11 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; -import org.apache.shiro.ShiroException; +import org.apache.shiro.authz.UnauthorizedException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; -import org.jboss.resteasy.spi.UnhandledException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -24,6 +21,7 @@ import sonia.scm.plugin.InstalledPluginDescriptor; import sonia.scm.plugin.PluginCondition; import sonia.scm.plugin.PluginInformation; import sonia.scm.plugin.PluginManager; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.inject.Provider; @@ -34,7 +32,7 @@ import java.util.Collections; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -46,7 +44,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class AvailablePluginResourceTest { - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock Provider availablePluginResourceProvider; @@ -71,10 +69,9 @@ class AvailablePluginResourceTest { @BeforeEach void prepareEnvironment() { - dispatcher = MockDispatcherFactory.createDispatcher(); pluginRootResource = new PluginRootResource(null, availablePluginResourceProvider, null); when(availablePluginResourceProvider.get()).thenReturn(availablePluginResource); - dispatcher.getRegistry().addSingletonResource(pluginRootResource); + dispatcher.addSingletonResource(pluginRootResource); } @Nested @@ -195,20 +192,23 @@ class AvailablePluginResourceTest { @BeforeEach void bindSubject() { ThreadContext.bind(subject); - doThrow(new ShiroException()).when(subject).checkPermission(any(String.class)); + doThrow(new UnauthorizedException()).when(subject).checkPermission(any(String.class)); } @AfterEach public void unbindSubject() { ThreadContext.unbindSubject(); } + @Test void shouldNotGetAvailablePluginsIfMissingPermission() throws URISyntaxException { MockHttpRequest request = MockHttpRequest.get("/v2/plugins/available"); request.accept(VndMediaType.PLUGIN_COLLECTION); MockHttpResponse response = new MockHttpResponse(); - assertThrows(UnhandledException.class, () -> dispatcher.invoke(request, response)); + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); verify(subject).checkPermission(any(String.class)); } @@ -218,7 +218,9 @@ class AvailablePluginResourceTest { request.accept(VndMediaType.PLUGIN); MockHttpResponse response = new MockHttpResponse(); - assertThrows(UnhandledException.class, () -> dispatcher.invoke(request, response)); + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); verify(subject).checkPermission(any(String.class)); } @@ -228,7 +230,9 @@ class AvailablePluginResourceTest { request.accept(VndMediaType.PLUGIN); MockHttpResponse response = new MockHttpResponse(); - assertThrows(UnhandledException.class, () -> dispatcher.invoke(request, response)); + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); verify(subject).checkPermission(any(String.class)); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java index 45a2d1613c..43f3d9f74e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java @@ -6,10 +6,10 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; +import org.assertj.core.api.Assertions; import org.assertj.core.util.Lists; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; -import org.jboss.resteasy.spi.Dispatcher; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -29,6 +29,7 @@ import sonia.scm.repository.api.BranchesCommandBuilder; import sonia.scm.repository.api.LogCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.ws.rs.core.MediaType; @@ -39,8 +40,13 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.Silent.class) @Slf4j @@ -49,7 +55,8 @@ public class BranchRootResourceTest extends RepositoryTestBase { public static final String BRANCH_PATH = "space/repo/branches/master"; public static final String BRANCH_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + BRANCH_PATH; public static final String REVISION = "revision"; - private Dispatcher dispatcher; + + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -96,7 +103,7 @@ public class BranchRootResourceTest extends RepositoryTestBase { BranchCollectionToDtoMapper branchCollectionToDtoMapper = new BranchCollectionToDtoMapper(branchToDtoMapper, resourceLinks); branchRootResource = new BranchRootResource(serviceFactory, branchToDtoMapper, branchCollectionToDtoMapper, changesetCollectionToDtoMapper, resourceLinks); super.branchRootResource = Providers.of(branchRootResource); - dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(service); when(serviceFactory.create(any(Repository.class))).thenReturn(service); when(service.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); @@ -125,7 +132,7 @@ public class BranchRootResourceTest extends RepositoryTestBase { assertEquals(404, response.getStatus()); MediaType contentType = (MediaType) response.getOutputHeaders().getFirst("Content-Type"); - assertEquals("application/vnd.scmm-error+json;v=2", contentType.toString()); + Assertions.assertThat(response.getContentAsString()).contains("branch", "master", "space/repo"); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java index 601a4a4652..5e890e36e6 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java @@ -8,7 +8,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -26,6 +25,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.api.LogCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import java.net.URI; @@ -48,7 +48,7 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { public static final String CHANGESET_PATH = "space/repo/changesets/"; public static final String CHANGESET_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + CHANGESET_PATH; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -79,7 +79,7 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { changesetCollectionToDtoMapper = new ChangesetCollectionToDtoMapper(changesetToChangesetDtoMapper, resourceLinks); changesetRootResource = new ChangesetRootResource(serviceFactory, changesetCollectionToDtoMapper, changesetToChangesetDtoMapper); super.changesetRootResource = Providers.of(changesetRootResource); - dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(repositoryService); when(serviceFactory.create(any(Repository.class))).thenReturn(repositoryService); when(repositoryService.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java index 74bb0ab38a..68a743dab3 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ConfigResourceTest.java @@ -4,18 +4,16 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.NamespaceStrategyValidator; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -41,10 +39,7 @@ public class ConfigResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); @SuppressWarnings("unused") // Is injected @@ -71,7 +66,7 @@ public class ConfigResourceTest { ConfigResource configResource = new ConfigResource(dtoToConfigMapper, configToDtoMapper, createConfiguration(), namespaceStrategyValidator); - dispatcher.getRegistry().addSingletonResource(configResource); + dispatcher.addSingletonResource(configResource); } @Test @@ -88,13 +83,14 @@ public class ConfigResourceTest { @Test @SubjectAware(username = "writeOnly") - public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException { + public void shouldNotGetConfigWhenNotAuthorized() throws URISyntaxException, UnsupportedEncodingException { MockHttpRequest request = MockHttpRequest.get("/" + ConfigResource.CONFIG_PATH_V2); MockHttpResponse response = new MockHttpResponse(); - thrown.expectMessage("Subject does not have permission [configuration:read:global]"); - dispatcher.invoke(request, response); + + assertEquals("Subject does not have permission [configuration:read:global]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -120,9 +116,10 @@ public class ConfigResourceTest { MockHttpRequest request = post("sonia/scm/api/v2/config-test-update.json"); MockHttpResponse response = new MockHttpResponse(); - thrown.expectMessage("Subject does not have permission [configuration:write:global]"); - dispatcher.invoke(request, response); + + assertEquals("Subject does not have permission [configuration:write:global]", response.getContentAsString()); + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java index c3d4b2fffa..fd41150aa8 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResourceTest.java @@ -7,8 +7,6 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -18,16 +16,17 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.NotFoundException; -import sonia.scm.api.rest.AuthorizationExceptionMapper; -import sonia.scm.api.v2.NotFoundExceptionMapper; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; import sonia.scm.repository.api.DiffCommandBuilder; import sonia.scm.repository.api.DiffFormat; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.util.CRLFInjectionException; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; +import javax.ws.rs.core.Response; import java.net.URISyntaxException; import java.util.Arrays; @@ -46,7 +45,8 @@ public class DiffResourceTest extends RepositoryTestBase { public static final String DIFF_PATH = "space/repo/diff/"; public static final String DIFF_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + DIFF_PATH; - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock private RepositoryServiceFactory serviceFactory; @@ -68,14 +68,12 @@ public class DiffResourceTest extends RepositoryTestBase { public void prepareEnvironment() { diffRootResource = new DiffRootResource(serviceFactory); super.diffRootResource = Providers.of(diffRootResource); - dispatcher.getRegistry().addSingletonResource(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(service); when(serviceFactory.create(any(Repository.class))).thenReturn(service); when(service.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); ExceptionWithContextToErrorDtoMapperImpl mapper = new ExceptionWithContextToErrorDtoMapperImpl(); - dispatcher.getProviderFactory().register(new NotFoundExceptionMapper(mapper)); - dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(CRLFInjectionExceptionMapper.class); + dispatcher.registerException(CRLFInjectionException.class, Response.Status.BAD_REQUEST); when(service.getDiffCommand()).thenReturn(diffCommandBuilder); subjectThreadState.bind(); ThreadContext.bind(subject); 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 deleted file mode 100644 index 40b2ac54b7..0000000000 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java +++ /dev/null @@ -1,24 +0,0 @@ -package sonia.scm.api.v2.resources; - -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; -import sonia.scm.api.rest.AlreadyExistsExceptionMapper; -import sonia.scm.api.rest.AuthorizationExceptionMapper; -import sonia.scm.api.rest.BadRequestExceptionMapper; -import sonia.scm.api.rest.ConcurrentModificationExceptionMapper; -import sonia.scm.api.v2.NotFoundExceptionMapper; - -public class DispatcherMock { - public static Dispatcher createDispatcher(Object resource) { - Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); - dispatcher.getRegistry().addSingletonResource(resource); - ExceptionWithContextToErrorDtoMapperImpl mapper = new ExceptionWithContextToErrorDtoMapperImpl(); - dispatcher.getProviderFactory().register(new NotFoundExceptionMapper(mapper)); - dispatcher.getProviderFactory().register(new AlreadyExistsExceptionMapper(mapper)); - dispatcher.getProviderFactory().register(new ConcurrentModificationExceptionMapper(mapper)); - dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); - dispatcher.getProviderFactory().register(new InternalRepositoryExceptionMapper(mapper)); - dispatcher.getProviderFactory().register(new BadRequestExceptionMapper(mapper)); - return dispatcher; - } -} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java index b5b903508a..907729d161 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java @@ -7,7 +7,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -28,6 +27,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.api.LogCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import java.net.URI; @@ -70,7 +70,7 @@ public class FileHistoryResourceTest extends RepositoryTestBase { private FileHistoryRootResource fileHistoryRootResource; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final Subject subject = mock(Subject.class); private final ThreadState subjectThreadState = new SubjectThreadState(subject); @@ -80,7 +80,7 @@ public class FileHistoryResourceTest extends RepositoryTestBase { fileHistoryCollectionToDtoMapper = new FileHistoryCollectionToDtoMapper(changesetToChangesetDtoMapper, resourceLinks); fileHistoryRootResource = new FileHistoryRootResource(serviceFactory, fileHistoryCollectionToDtoMapper); super.fileHistoryRootResource = Providers.of(fileHistoryRootResource); - dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(service); when(serviceFactory.create(any(Repository.class))).thenReturn(service); when(service.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index bb024eb67c..97088f9d6f 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -4,7 +4,6 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import com.google.inject.util.Providers; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -15,12 +14,11 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.PageResult; -import sonia.scm.api.rest.JSONContextResolver; -import sonia.scm.api.rest.ObjectMapperProvider; import sonia.scm.group.Group; import sonia.scm.group.GroupManager; import sonia.scm.security.PermissionAssigner; import sonia.scm.security.PermissionDescriptor; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -43,7 +41,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -55,7 +52,7 @@ public class GroupRootResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(URI.create("/")); @@ -91,8 +88,7 @@ public class GroupRootResourceTest { GroupResource groupResource = new GroupResource(groupManager, groupToDtoMapper, dtoToGroupMapper, groupPermissionResource); GroupRootResource groupRootResource = new GroupRootResource(Providers.of(groupCollectionResource), Providers.of(groupResource)); - dispatcher = createDispatcher(groupRootResource); - dispatcher.getProviderFactory().registerProviderInstance(new JSONContextResolver(new ObjectMapperProvider().get())); + dispatcher.addSingletonResource(groupRootResource); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java index de0eaeb992..481960e8c7 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java @@ -8,7 +8,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -28,8 +27,11 @@ import sonia.scm.repository.api.DiffCommandBuilder; import sonia.scm.repository.api.LogCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.util.CRLFInjectionException; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; +import javax.ws.rs.core.Response; import java.net.URI; import java.net.URISyntaxException; import java.time.Instant; @@ -53,7 +55,7 @@ public class IncomingRootResourceTest extends RepositoryTestBase { public static final String INCOMING_CHANGESETS_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + INCOMING_PATH; public static final String INCOMING_DIFF_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + INCOMING_PATH; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -88,13 +90,13 @@ public class IncomingRootResourceTest extends RepositoryTestBase { incomingChangesetCollectionToDtoMapper = new IncomingChangesetCollectionToDtoMapper(changesetToChangesetDtoMapper, resourceLinks); incomingRootResource = new IncomingRootResource(serviceFactory, incomingChangesetCollectionToDtoMapper); super.incomingRootResource = Providers.of(incomingRootResource); - dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(repositoryService); when(serviceFactory.create(any(Repository.class))).thenReturn(repositoryService); when(repositoryService.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); when(repositoryService.getLogCommand()).thenReturn(logCommandBuilder); when(repositoryService.getDiffCommand()).thenReturn(diffCommandBuilder); - dispatcher.getProviderFactory().registerProvider(CRLFInjectionExceptionMapper.class); + dispatcher.registerException(CRLFInjectionException.class, Response.Status.BAD_REQUEST); subjectThreadState.bind(); ThreadContext.bind(subject); when(subject.isPermitted(any(String.class))).thenReturn(true); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java index 8c9ed5ef2a..5319725c9d 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java @@ -1,13 +1,11 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; +import org.apache.shiro.authz.UnauthorizedException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; -import org.jboss.resteasy.spi.UnhandledException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -17,9 +15,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.plugin.InstalledPlugin; -import sonia.scm.plugin.InstalledPluginDescriptor; import sonia.scm.plugin.PluginInformation; import sonia.scm.plugin.PluginManager; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.inject.Provider; @@ -31,15 +29,17 @@ import java.util.Optional; import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(MockitoExtension.class) class InstalledPluginResourceTest { - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock Provider installedPluginResourceProvider; @@ -65,10 +65,9 @@ class InstalledPluginResourceTest { @BeforeEach void prepareEnvironment() { - dispatcher = MockDispatcherFactory.createDispatcher(); pluginRootResource = new PluginRootResource(installedPluginResourceProvider, null, null); when(installedPluginResourceProvider.get()).thenReturn(installedPluginResource); - dispatcher.getRegistry().addSingletonResource(pluginRootResource); + dispatcher.addSingletonResource(pluginRootResource); } @Nested @@ -77,7 +76,6 @@ class InstalledPluginResourceTest { @BeforeEach void bindSubject() { ThreadContext.bind(subject); - when(subject.isPermitted(any(String.class))).thenReturn(true); } @AfterEach @@ -129,7 +127,13 @@ class InstalledPluginResourceTest { class WithoutAuthorization { @BeforeEach - void unbindSubject() { + void bindSubject() { + ThreadContext.bind(subject); + doThrow(new UnauthorizedException()).when(subject).checkPermission(any(String.class)); + } + + @AfterEach + public void unbindSubject() { ThreadContext.unbindSubject(); } @@ -139,7 +143,9 @@ class InstalledPluginResourceTest { request.accept(VndMediaType.PLUGIN_COLLECTION); MockHttpResponse response = new MockHttpResponse(); - assertThrows(UnhandledException.class, () -> dispatcher.invoke(request, response)); + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } @Test @@ -148,7 +154,9 @@ class InstalledPluginResourceTest { request.accept(VndMediaType.PLUGIN); MockHttpResponse response = new MockHttpResponse(); - assertThrows(UnhandledException.class, () -> dispatcher.invoke(request, response)); + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java index 7aeabe6bec..1c876755a6 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java @@ -7,7 +7,6 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.credential.PasswordService; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.Subject; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -21,6 +20,7 @@ import sonia.scm.group.GroupCollector; import sonia.scm.user.InvalidPasswordException; import sonia.scm.user.User; import sonia.scm.user.UserManager; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -37,7 +37,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -49,9 +48,10 @@ public class MeResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(URI.create("/")); + @Mock private ScmPathInfo uriInfo; @Mock @@ -85,7 +85,7 @@ public class MeResourceTest { MeResource meResource = new MeResource(meDtoFactory, userManager, passwordService); when(uriInfo.getApiRestUri()).thenReturn(URI.create("/")); when(scmPathInfoStore.get()).thenReturn(uriInfo); - dispatcher = createDispatcher(meResource); + dispatcher.addSingletonResource(meResource); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java index 8e84f9d1bb..6806dd248e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java @@ -7,7 +7,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -24,6 +23,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.api.ModificationsCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import java.net.URI; @@ -45,7 +45,7 @@ public class ModificationsResourceTest extends RepositoryTestBase { public static final String MODIFICATIONS_PATH = "space/repo/modifications/"; public static final String MODIFICATIONS_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + MODIFICATIONS_PATH; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -73,7 +73,7 @@ public class ModificationsResourceTest extends RepositoryTestBase { public void prepareEnvironment() { modificationsRootResource = new ModificationsRootResource(serviceFactory, modificationsToDtoMapper); super.modificationsRootResource = Providers.of(modificationsRootResource); - dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(repositoryService); when(serviceFactory.create(any(Repository.class))).thenReturn(repositoryService); when(repositoryService.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java index 3613069d63..be5374472f 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PendingPluginResourceTest.java @@ -4,8 +4,6 @@ import com.google.inject.util.Providers; import org.apache.shiro.ShiroException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.jupiter.api.AfterEach; @@ -22,10 +20,10 @@ import sonia.scm.plugin.InstalledPlugin; import sonia.scm.plugin.InstalledPluginDescriptor; import sonia.scm.plugin.PluginInformation; import sonia.scm.plugin.PluginManager; +import sonia.scm.web.ScmTestDispatcher; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; @@ -42,7 +40,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class PendingPluginResourceTest { - Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); ResourceLinks resourceLinks = ResourceLinksMock.createMock(create("/")); @@ -61,10 +59,9 @@ class PendingPluginResourceTest { @BeforeEach void prepareEnvironment() { - dispatcher = MockDispatcherFactory.createDispatcher(); - dispatcher.getProviderFactory().register(new PermissionExceptionMapper()); + dispatcher.registerException(ShiroException.class, Response.Status.UNAUTHORIZED); PluginRootResource pluginRootResource = new PluginRootResource(null, null, Providers.of(pendingPluginResource)); - dispatcher.getRegistry().addSingletonResource(pluginRootResource); + dispatcher.addSingletonResource(pluginRootResource); } @BeforeEach @@ -207,14 +204,6 @@ class PendingPluginResourceTest { } } - static class PermissionExceptionMapper implements ExceptionMapper { - - @Override - public Response toResponse(ShiroException exception) { - return Response.status(401).entity(exception.getMessage()).build(); - } - } - private AvailablePlugin createAvailablePlugin(String name) { PluginInformation pluginInformation = new PluginInformation(); pluginInformation.setName(name); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java index a2e63dd50e..8ad4522b4d 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResourceTest.java @@ -13,7 +13,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.jboss.resteasy.spi.HttpRequest; @@ -30,6 +29,7 @@ import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryPermission; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.ws.rs.HttpMethod; @@ -58,7 +58,6 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; import static sonia.scm.api.v2.resources.RepositoryPermissionDto.GROUP_PREFIX; @Slf4j @@ -105,7 +104,7 @@ public class RepositoryPermissionRootResourceTest extends RepositoryTestBase { .content(PERMISSION_TEST_PAYLOAD) .path(PATH_OF_ONE_PERMISSION); - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock private RepositoryManager repositoryManager; @@ -133,7 +132,7 @@ public class RepositoryPermissionRootResourceTest extends RepositoryTestBase { repositoryPermissionCollectionToDtoMapper = new RepositoryPermissionCollectionToDtoMapper(permissionToPermissionDtoMapper, resourceLinks); repositoryPermissionRootResource = new RepositoryPermissionRootResource(permissionDtoToPermissionMapper, permissionToPermissionDtoMapper, repositoryPermissionCollectionToDtoMapper, resourceLinks, repositoryManager); super.permissionRootResource = Providers.of(repositoryPermissionRootResource); - dispatcher = createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); subjectThreadState.bind(); ThreadContext.bind(subject); } @@ -180,19 +179,6 @@ public class RepositoryPermissionRootResourceTest extends RepositoryTestBase { requestPUTPermission.expectedResponseStatus(403)); } - @TestFactory - @DisplayName("test endpoints on missing permissions and is _anonymous") - Stream missedPermissionAnonymousUnauthorizedTestFactory() { - when(subject.getPrincipal()).thenReturn("_anonymous"); - doThrow(AuthorizationException.class).when(repositoryManager).get(any(NamespaceAndName.class)); - return createDynamicTestsToAssertResponses( - requestGETPermission.expectedResponseStatus(401), - requestPOSTPermission.expectedResponseStatus(401), - requestGETAllPermissions.expectedResponseStatus(401), - requestDELETEPermission.expectedResponseStatus(401), - requestPUTPermission.expectedResponseStatus(401)); - } - @Test public void userWithPermissionWritePermissionShouldGetAllPermissionsWithCreateAndUpdateLinks() throws URISyntaxException { createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java index d60a32f5dc..e458af6a11 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRoleRootResourceTest.java @@ -3,7 +3,6 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.inject.util.Providers; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -16,10 +15,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.PageResult; -import sonia.scm.api.rest.JSONContextResolver; -import sonia.scm.api.rest.ObjectMapperProvider; import sonia.scm.repository.RepositoryRole; import sonia.scm.repository.RepositoryRoleManager; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -36,7 +34,6 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -66,7 +63,7 @@ public class RepositoryRoleRootResourceTest { private RepositoryRoleCollectionToDtoMapper collectionToDtoMapper; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Captor private ArgumentCaptor modifyCaptor; @@ -87,8 +84,7 @@ public class RepositoryRoleRootResourceTest { when(repositoryRoleManager.create(createCaptor.capture())).thenAnswer(invocation -> invocation.getArguments()[0]); doNothing().when(repositoryRoleManager).delete(deleteCaptor.capture()); - dispatcher = createDispatcher(rootResource); - dispatcher.getProviderFactory().registerProviderInstance(new JSONContextResolver(new ObjectMapperProvider().get())); + dispatcher.addSingletonResource(rootResource); when(repositoryRoleManager.get(CUSTOM_ROLE)).thenReturn(CUSTOM_REPOSITORY_ROLE); when(repositoryRoleManager.get(SYSTEM_ROLE)).thenReturn(SYSTEM_REPOSITORY_ROLE); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index fcd34334b2..206f7713a3 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -6,7 +6,6 @@ import com.google.common.io.Resources; import com.google.inject.util.Providers; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -23,6 +22,7 @@ import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.user.User; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -47,12 +47,10 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyObject; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -63,7 +61,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { private static final String REALM = "AdminRealm"; - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Rule public ShiroRule shiro = new ShiroRule(); @@ -98,7 +96,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { super.manager = repositoryManager; RepositoryCollectionToDtoMapper repositoryCollectionToDtoMapper = new RepositoryCollectionToDtoMapper(repositoryToDtoMapper, resourceLinks); super.repositoryCollectionResource = Providers.of(new RepositoryCollectionResource(repositoryManager, repositoryCollectionToDtoMapper, dtoToRepositoryMapper, resourceLinks)); - dispatcher = createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(any(Repository.class))).thenReturn(service); when(scmPathInfoStore.get()).thenReturn(uriInfo); when(uriInfo.getApiRestUri()).thenReturn(URI.create("/x/y")); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java index 17ea3248c2..3dd30e21c0 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryTypeRootResourceTest.java @@ -3,8 +3,6 @@ package sonia.scm.api.v2.resources; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.util.Providers; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -15,6 +13,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryType; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import java.net.URI; @@ -32,7 +31,7 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.Silent.class) public class RepositoryTypeRootResourceTest { - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock private RepositoryManager repositoryManager; @@ -56,7 +55,7 @@ public class RepositoryTypeRootResourceTest { RepositoryTypeCollectionResource collectionResource = new RepositoryTypeCollectionResource(repositoryManager, collectionMapper); RepositoryTypeResource resource = new RepositoryTypeResource(repositoryManager, mapper); RepositoryTypeRootResource rootResource = new RepositoryTypeRootResource(Providers.of(collectionResource), Providers.of(resource)); - dispatcher.getRegistry().addSingletonResource(rootResource); + dispatcher.addSingletonResource(rootResource); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java index a25aabaca1..4dd694c092 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java @@ -1,7 +1,6 @@ package sonia.scm.api.v2.resources; import com.google.inject.util.Providers; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -18,6 +17,7 @@ import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.api.BrowseCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.web.ScmTestDispatcher; import java.io.IOException; import java.net.URI; @@ -25,13 +25,12 @@ import java.net.URISyntaxException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @RunWith(MockitoJUnitRunner.Silent.class) public class SourceRootResourceTest extends RepositoryTestBase { - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -58,7 +57,7 @@ public class SourceRootResourceTest extends RepositoryTestBase { SourceRootResource sourceRootResource = new SourceRootResource(serviceFactory, browserResultToFileObjectDtoMapper); super.sourceRootResource = Providers.of(sourceRootResource); - dispatcher = createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java index e97f6c726f..29616db703 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/TagRootResourceTest.java @@ -7,7 +7,6 @@ import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -17,8 +16,6 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import sonia.scm.api.rest.AuthorizationExceptionMapper; -import sonia.scm.api.v2.NotFoundExceptionMapper; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; import sonia.scm.repository.Tag; @@ -26,6 +23,7 @@ import sonia.scm.repository.Tags; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.repository.api.TagsCommandBuilder; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import java.net.URI; @@ -36,7 +34,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @Slf4j @RunWith(MockitoJUnitRunner.Silent.class) @@ -44,7 +41,8 @@ public class TagRootResourceTest extends RepositoryTestBase { public static final String TAG_PATH = "space/repo/tags/"; public static final String TAG_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + TAG_PATH; - private Dispatcher dispatcher ; + + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -74,12 +72,10 @@ public class TagRootResourceTest extends RepositoryTestBase { tagCollectionToDtoMapper = new TagCollectionToDtoMapper(resourceLinks, tagToTagDtoMapper); tagRootResource = new TagRootResource(serviceFactory, tagCollectionToDtoMapper, tagToTagDtoMapper); super.tagRootResource = Providers.of(tagRootResource); - dispatcher = createDispatcher(getRepositoryRootResource()); + dispatcher.addSingletonResource(getRepositoryRootResource()); when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(repositoryService); when(serviceFactory.create(any(Repository.class))).thenReturn(repositoryService); when(repositoryService.getRepository()).thenReturn(new Repository("repoId", "git", "space", "repo")); - dispatcher.getProviderFactory().registerProvider(NotFoundExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); when(repositoryService.getTagsCommand()).thenReturn(tagsCommandBuilder); subjectThreadState.bind(); ThreadContext.bind(subject); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java index 0391e43c81..da0c862168 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UIRootResourceTest.java @@ -3,8 +3,6 @@ package sonia.scm.api.v2.resources; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.util.Providers; -import org.jboss.resteasy.spi.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -12,7 +10,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import sonia.scm.plugin.*; +import sonia.scm.plugin.InstalledPlugin; +import sonia.scm.plugin.InstalledPluginDescriptor; +import sonia.scm.plugin.PluginInformation; +import sonia.scm.plugin.PluginLoader; +import sonia.scm.plugin.PluginResources; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletRequest; @@ -24,14 +27,17 @@ import java.util.HashSet; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static javax.servlet.http.HttpServletResponse.SC_OK; import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.Silent.class) public class UIRootResourceTest { - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); @Mock private PluginLoader pluginLoader; @@ -50,7 +56,7 @@ public class UIRootResourceTest { UIPluginResource pluginResource = new UIPluginResource(pluginLoader, collectionMapper, mapper); UIRootResource rootResource = new UIRootResource(Providers.of(pluginResource)); - dispatcher.getRegistry().addSingletonResource(rootResource); + dispatcher.addSingletonResource(rootResource); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java index e055bbf3b5..6426007556 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java @@ -5,7 +5,6 @@ import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import com.google.inject.util.Providers; import org.apache.shiro.authc.credential.PasswordService; -import org.jboss.resteasy.spi.Dispatcher; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -23,6 +22,7 @@ import sonia.scm.security.PermissionDescriptor; import sonia.scm.user.ChangePasswordNotAllowedException; import sonia.scm.user.User; import sonia.scm.user.UserManager; +import sonia.scm.web.ScmTestDispatcher; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; @@ -45,7 +45,6 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -57,7 +56,7 @@ public class UserRootResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher; + private ScmTestDispatcher dispatcher = new ScmTestDispatcher(); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(URI.create("/")); @@ -99,7 +98,7 @@ public class UserRootResourceTest { UserRootResource userRootResource = new UserRootResource(Providers.of(userCollectionResource), Providers.of(userResource)); - dispatcher = createDispatcher(userRootResource); + dispatcher.addSingletonResource(userRootResource); } @Test From d4afbd6a0a8811ae1b97ad43fd9e135e28fffb21 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 26 Nov 2019 15:20:44 +0100 Subject: [PATCH 077/144] Make DownloadButton props optional (an disabled DownloadButton has no link, disabled should be false by default) --- scm-ui/ui-components/src/buttons/DownloadButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-ui/ui-components/src/buttons/DownloadButton.tsx b/scm-ui/ui-components/src/buttons/DownloadButton.tsx index 0e63d34073..98860cecc6 100644 --- a/scm-ui/ui-components/src/buttons/DownloadButton.tsx +++ b/scm-ui/ui-components/src/buttons/DownloadButton.tsx @@ -2,8 +2,8 @@ import React from "react"; type Props = { displayName: string; - url: string; - disabled: boolean; + url?: string; + disabled?: boolean; onClick?: () => void; }; From 702cca59ed5e174f1951bf9f252a70c6f73a85db Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 26 Nov 2019 15:22:22 +0100 Subject: [PATCH 078/144] Move Button to right side --- scm-ui/ui-components/src/config/Configuration.tsx | 9 +++++---- .../src/admin/components/form/ConfigForm.tsx | 14 +++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/scm-ui/ui-components/src/config/Configuration.tsx b/scm-ui/ui-components/src/config/Configuration.tsx index 967feabb2b..453fac421e 100644 --- a/scm-ui/ui-components/src/config/Configuration.tsx +++ b/scm-ui/ui-components/src/config/Configuration.tsx @@ -1,8 +1,7 @@ -import React from "react"; +import React, { FormEvent } from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { Links, Link } from "@scm-manager/ui-types"; -import { apiClient, SubmitButton, Loading, ErrorNotification } from "../"; -import { FormEvent } from "react"; +import { apiClient, Level, SubmitButton, Loading, ErrorNotification } from "../"; type RenderProps = { readOnly: boolean; @@ -179,7 +178,9 @@ class Configuration extends React.Component {
    {this.props.render(renderProps)}
    - + } + /> ); diff --git a/scm-ui/ui-webapp/src/admin/components/form/ConfigForm.tsx b/scm-ui/ui-webapp/src/admin/components/form/ConfigForm.tsx index f7f8f67659..6c87f4359b 100644 --- a/scm-ui/ui-webapp/src/admin/components/form/ConfigForm.tsx +++ b/scm-ui/ui-webapp/src/admin/components/form/ConfigForm.tsx @@ -1,7 +1,7 @@ import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { NamespaceStrategies, Config } from "@scm-manager/ui-types"; -import { SubmitButton, Notification } from "@scm-manager/ui-components"; +import { Level, SubmitButton, Notification } from "@scm-manager/ui-components"; import ProxySettings from "./ProxySettings"; import GeneralSettings from "./GeneralSettings"; import BaseUrlSettings from "./BaseUrlSettings"; @@ -151,10 +151,14 @@ class ConfigForm extends React.Component { hasUpdatePermission={configUpdatePermission} />
    - + } /> ); From b17f03247b51d89eebae732488bbddcb00b32bf2 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 26 Nov 2019 15:59:38 +0100 Subject: [PATCH 079/144] Change AddEntryTo... to single-line component, add className prop to InputField and Autocomplete --- scm-ui/ui-components/src/Autocomplete.tsx | 7 ++- .../src/forms/AddEntryToTableField.tsx | 55 +++++++++++++------ .../AutocompleteAddEntryToTableField.tsx | 42 +++++++++----- scm-ui/ui-components/src/forms/InputField.tsx | 15 ++++- scm-ui/ui-components/src/layout/Level.tsx | 9 ++- 5 files changed, 90 insertions(+), 38 deletions(-) diff --git a/scm-ui/ui-components/src/Autocomplete.tsx b/scm-ui/ui-components/src/Autocomplete.tsx index 7618464b57..814be20aa2 100644 --- a/scm-ui/ui-components/src/Autocomplete.tsx +++ b/scm-ui/ui-components/src/Autocomplete.tsx @@ -1,4 +1,5 @@ import React from "react"; +import classNames from "classnames"; import { Async, AsyncCreatable } from "react-select"; import { SelectValue } from "@scm-manager/ui-types"; import LabelWithHelpIcon from "./forms/LabelWithHelpIcon"; @@ -14,6 +15,7 @@ type Props = { loadingMessage: string; noOptionsMessage: string; creatable?: boolean; + className?: string; }; type State = {}; @@ -53,10 +55,11 @@ class Autocomplete extends React.Component { loadingMessage, noOptionsMessage, loadSuggestions, - creatable + creatable, + className } = this.props; return ( -
    +
    {creatable ? ( diff --git a/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx b/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx index 8f76956c47..3e18674244 100644 --- a/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx +++ b/scm-ui/ui-components/src/forms/AddEntryToTableField.tsx @@ -1,7 +1,8 @@ import React, { MouseEvent } from "react"; -import InputField from "./InputField"; +import styled from "styled-components"; import Level from "../layout/Level"; -import { AddButton } from "../buttons"; +import InputField from "./InputField"; +import AddButton from "../buttons/AddButton"; type Props = { addEntry: (p: string) => void; @@ -17,6 +18,22 @@ type State = { entryToAdd: string; }; +const StyledLevel = styled(Level)` + align-items: stretch; + margin-bottom: 1rem !important; // same margin as field +`; + +const StyledInputField = styled(InputField)` + width: 100%; + margin-right: 1.5rem; +`; + +const StyledField = styled.div.attrs(props => ({ + className: "field" +}))` + align-self: flex-end; +`; + class AddEntryToTableField extends React.Component { constructor(props: Props) { super(props); @@ -37,27 +54,29 @@ class AddEntryToTableField extends React.Component { render() { const { disabled, buttonLabel, fieldLabel, errorMessage, helpText } = this.props; return ( - <> - - + } + right={ + - } - /> - + + } + /> ); } diff --git a/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx b/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx index 19042bb2ac..8287249858 100644 --- a/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx +++ b/scm-ui/ui-components/src/forms/AutocompleteAddEntryToTableField.tsx @@ -1,7 +1,8 @@ import React, { MouseEvent } from "react"; +import styled from "styled-components"; import { SelectValue } from "@scm-manager/ui-types"; -import Autocomplete from "../Autocomplete"; import Level from "../layout/Level"; +import Autocomplete from "../Autocomplete"; import AddButton from "../buttons/AddButton"; type Props = { @@ -20,6 +21,11 @@ type State = { selectedValue?: SelectValue; }; +const StyledAutocomplete = styled(Autocomplete)` + width: 100%; + margin-right: 1.5rem; +`; + class AutocompleteAddEntryToTableField extends React.Component { constructor(props: Props) { super(props); @@ -41,20 +47,26 @@ class AutocompleteAddEntryToTableField extends React.Component { const { selectedValue } = this.state; return ( -
    - - } /> -
    + + } + right={ +
    + +
    + } + /> ); } diff --git a/scm-ui/ui-components/src/forms/InputField.tsx b/scm-ui/ui-components/src/forms/InputField.tsx index a0fd1c631c..d832d8a7d6 100644 --- a/scm-ui/ui-components/src/forms/InputField.tsx +++ b/scm-ui/ui-components/src/forms/InputField.tsx @@ -15,6 +15,7 @@ type Props = { errorMessage?: string; disabled?: boolean; helpText?: string; + className?: string; }; class InputField extends React.Component { @@ -47,11 +48,21 @@ class InputField extends React.Component { }; render() { - const { type, placeholder, value, validationError, errorMessage, disabled, label, helpText } = this.props; + const { + type, + placeholder, + value, + validationError, + errorMessage, + disabled, + label, + helpText, + className + } = this.props; const errorView = validationError ? "is-danger" : ""; const helper = validationError ?

    {errorMessage}

    : ""; return ( -
    +
    { render() { - const { className, left, right } = this.props; + const { className, left, children, right } = this.props; + let child = null; + if (children) { + child =
    {children}
    ; + } + return (
    {left}
    + {child}
    {right}
    ); From 111465f85317f50293914e6778e18409154c9129 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 26 Nov 2019 16:04:42 +0100 Subject: [PATCH 080/144] Make input .help texts position absolute so that it does not affect level negative when pop up, it also saves some space underneath --- scm-ui/ui-styles/src/scm.scss | 4 ++++ .../repos/sources/components/content/FileButtonAddons.tsx | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/scm-ui/ui-styles/src/scm.scss b/scm-ui/ui-styles/src/scm.scss index 01d8d3e55a..cc62fa5dd6 100644 --- a/scm-ui/ui-styles/src/scm.scss +++ b/scm-ui/ui-styles/src/scm.scss @@ -622,6 +622,10 @@ form .field:not(.is-grouped) { } } +.help { + position: absolute; +} + // label with help-icon compensation .label-icon-spacing { margin-top: 30px; diff --git a/scm-ui/ui-webapp/src/repos/sources/components/content/FileButtonAddons.tsx b/scm-ui/ui-webapp/src/repos/sources/components/content/FileButtonAddons.tsx index dd52604611..dd0183d51d 100644 --- a/scm-ui/ui-webapp/src/repos/sources/components/content/FileButtonAddons.tsx +++ b/scm-ui/ui-webapp/src/repos/sources/components/content/FileButtonAddons.tsx @@ -18,7 +18,7 @@ class FileButtonAddons extends React.Component { }; color = (selected: boolean) => { - return selected ? "link is-selected" : null; + return selected ? "link is-selected" : ""; }; render() { @@ -27,14 +27,14 @@ class FileButtonAddons extends React.Component { return (
    -
    - + ); }; From cae4f6abb47ac83866b77a0286e14af0f942fd1d Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 28 Nov 2019 01:57:56 +0100 Subject: [PATCH 083/144] Remove doubled , add key --- .../admin/roles/components/AvailableVerbs.tsx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/scm-ui/ui-webapp/src/admin/roles/components/AvailableVerbs.tsx b/scm-ui/ui-webapp/src/admin/roles/components/AvailableVerbs.tsx index b230444de5..ec0e1fda29 100644 --- a/scm-ui/ui-webapp/src/admin/roles/components/AvailableVerbs.tsx +++ b/scm-ui/ui-webapp/src/admin/roles/components/AvailableVerbs.tsx @@ -13,15 +13,13 @@ class AvailableVerbs extends React.Component { let verbs = null; if (role.verbs.length > 0) { verbs = ( - - -
      - {role.verbs.map(verb => { - return
    • {t("verbs.repository." + verb + ".displayName")}
    • ; - })} -
    - - + +
      + {role.verbs.map((verb, key) => { + return
    • {t("verbs.repository." + verb + ".displayName")}
    • ; + })} +
    + ); } return verbs; From 53147db0e20b5555b4dd2228d2c88cd0bc14b879 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 28 Nov 2019 02:01:49 +0100 Subject: [PATCH 084/144] Move button to right side and small fixes --- .../components/PermissionRoleDetails.tsx | 10 ++++-- .../repos/components/form/RepositoryForm.tsx | 2 +- .../sources/containers/SourceExtensions.tsx | 31 ++++++++++--------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/scm-ui/ui-webapp/src/admin/roles/components/PermissionRoleDetails.tsx b/scm-ui/ui-webapp/src/admin/roles/components/PermissionRoleDetails.tsx index e4a2a0f05c..f6e0bf35d6 100644 --- a/scm-ui/ui-webapp/src/admin/roles/components/PermissionRoleDetails.tsx +++ b/scm-ui/ui-webapp/src/admin/roles/components/PermissionRoleDetails.tsx @@ -2,7 +2,7 @@ import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { ExtensionPoint } from "@scm-manager/ui-extensions"; import { RepositoryRole } from "@scm-manager/ui-types"; -import { Button } from "@scm-manager/ui-components"; +import { Level, Button } from "@scm-manager/ui-components"; import PermissionRoleDetailsTable from "./PermissionRoleDetailsTable"; type Props = WithTranslation & { @@ -14,7 +14,12 @@ class PermissionRoleDetails extends React.Component { renderEditButton() { const { t, url } = this.props; if (!!this.props.role._links.update) { - return