From 41cc61277ff16ff8e98778aba09995d8a9abf4ca Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 16 Oct 2018 14:14:16 +0200 Subject: [PATCH 01/10] added system property to disable extraction of core plugins --- .../scm/boot/BootstrapContextListener.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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..bf7583b2a2 100644 --- a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java @@ -148,13 +148,15 @@ public class BootstrapContextListener implements ServletContextListener { context = sce.getServletContext(); - PluginIndex index = readCorePluginIndex(context); - File pluginDirectory = getPluginDirectory(); try { - extractCorePlugins(context, pluginDirectory, index); + if (!isCorePluginExtractionDisabled()) { + extractCorePlugins(context, pluginDirectory); + } else { + logger.info("core plugin extraction is disabled"); + } ClassLoader cl = ClassLoaders.getContextClassLoader(BootstrapContextListener.class); @@ -181,6 +183,10 @@ public class BootstrapContextListener implements ServletContextListener } } + private boolean isCorePluginExtractionDisabled() { + return Boolean.getBoolean("sonia.scm.boot.disable-core-plugin-extraction"); + } + /** * Restart the whole webapp context. * @@ -269,17 +275,15 @@ public class BootstrapContextListener implements ServletContextListener * * @param context * @param pluginDirectory - * @param lines - * @param index * * @throws IOException */ - private void extractCorePlugins(ServletContext context, File pluginDirectory, - PluginIndex index) - throws IOException + private void extractCorePlugins(ServletContext context, File pluginDirectory) throws IOException { IOUtil.mkdirs(pluginDirectory); + PluginIndex index = readCorePluginIndex(context); + for (PluginIndexEntry entry : index) { extractCorePlugin(context, pluginDirectory, entry); From f684a074042e44bfaff21214e8def4d88b40d7a8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 23 Oct 2018 15:47:20 +0200 Subject: [PATCH 02/10] update legman to version 1.4.0 to fix conflict with guava version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index df49023265..383ed6186d 100644 --- a/pom.xml +++ b/pom.xml @@ -757,7 +757,7 @@ 4.0 - 1.3.0 + 1.4.0 9.2.10.v20150310 From 4823232ff0eacc21912c1563ee2fe6a94fedb217 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 23 Oct 2018 16:28:53 +0200 Subject: [PATCH 03/10] added RestartServlet, which is able to trigger a complete restart of the context --- .../main/java/sonia/scm/ResteasyModule.java | 20 +++ .../java/sonia/scm/ScmContextListener.java | 1 + .../scm/boot/BootstrapContextFilter.java | 43 +++--- .../scm/boot/BootstrapContextListener.java | 28 ---- .../java/sonia/scm/boot/RestartServlet.java | 97 +++++++++++++ .../sonia/scm/boot/ServletContextCleaner.java | 59 ++++++++ .../src/main/resources/logback.default.xml | 7 +- scm-webapp/src/main/webapp/WEB-INF/web.xml | 23 --- .../sonia/scm/boot/RestartServletTest.java | 133 ++++++++++++++++++ .../scm/boot/ServletContextCleanerTest.java | 53 +++++++ 10 files changed, 389 insertions(+), 75 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/ResteasyModule.java create mode 100644 scm-webapp/src/main/java/sonia/scm/boot/RestartServlet.java create mode 100644 scm-webapp/src/main/java/sonia/scm/boot/ServletContextCleaner.java create mode 100644 scm-webapp/src/test/java/sonia/scm/boot/RestartServletTest.java create mode 100644 scm-webapp/src/test/java/sonia/scm/boot/ServletContextCleanerTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/ResteasyModule.java b/scm-webapp/src/main/java/sonia/scm/ResteasyModule.java new file mode 100644 index 0000000000..a85c3b6d06 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/ResteasyModule.java @@ -0,0 +1,20 @@ +package sonia.scm; + +import com.google.common.collect.ImmutableMap; +import com.google.inject.servlet.ServletModule; +import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher; +import org.jboss.resteasy.plugins.server.servlet.ResteasyContextParameters; + +import javax.inject.Singleton; +import java.util.Map; + +public class ResteasyModule extends ServletModule { + + @Override + protected void configureServlets() { + bind(HttpServletDispatcher.class).in(Singleton.class); + + Map initParams = ImmutableMap.of(ResteasyContextParameters.RESTEASY_SERVLET_MAPPING_PREFIX, "/api"); + serve("/api/*").with(HttpServletDispatcher.class, initParams); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 5a087a1c70..8ae005e826 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -126,6 +126,7 @@ public class ScmContextListener extends GuiceResteasyBootstrapServletContextList ClassOverrides overrides = ClassOverrides.findOverrides(pluginLoader.getUberClassLoader()); List moduleList = Lists.newArrayList(); + moduleList.add(new ResteasyModule()); moduleList.add(new ScmInitializerModule()); moduleList.add(new ScmEventBusModule()); moduleList.add(new EagerSingletonModule()); 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..aec8e2d653 100644 --- a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextFilter.java @@ -34,22 +34,19 @@ package sonia.scm.boot; //~--- non-JDK imports -------------------------------------------------------- import com.github.legman.Subscribe; - import com.google.inject.servlet.GuiceFilter; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.SCMContext; import sonia.scm.Stage; import sonia.scm.event.ScmEventBus; -//~--- JDK imports ------------------------------------------------------------ - import javax.servlet.FilterConfig; import javax.servlet.ServletContextEvent; import javax.servlet.ServletException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -65,6 +62,8 @@ public class BootstrapContextFilter extends GuiceFilter //~--- methods -------------------------------------------------------------- + private final BootstrapContextListener listener = new BootstrapContextListener(); + /** * Restart the whole webapp context. * @@ -85,29 +84,20 @@ public class BootstrapContextFilter extends GuiceFilter } else { - - logger.warn( - "destroy filter pipeline, because of a received restart event"); + logger.warn("destroy filter pipeline, because of a received restart event"); destroy(); - logger.warn( - "reinitialize filter pipeline, because of a received restart event"); - super.init(filterConfig); + + logger.warn("reinitialize filter pipeline, because of a received restart event"); + initGuice(); } } - /** - * Method description - * - * - * @param filterConfig - * - * @throws ServletException - */ @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; - super.init(filterConfig); + + initGuice(); if (SCMContext.getContext().getStage() == Stage.DEVELOPMENT) { @@ -116,6 +106,19 @@ public class BootstrapContextFilter extends GuiceFilter } } + public void initGuice() throws ServletException { + super.init(filterConfig); + + listener.contextInitialized(new ServletContextEvent(filterConfig.getServletContext())); + } + + @Override + public void destroy() { + super.destroy(); + listener.contextDestroyed(new ServletContextEvent(filterConfig.getServletContext())); + ServletContextCleaner.cleanup(filterConfig.getServletContext()); + } + //~--- fields --------------------------------------------------------------- /** Field description */ 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 bf7583b2a2..afaa28bfe8 100644 --- a/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/boot/BootstrapContextListener.java @@ -187,40 +187,12 @@ public class BootstrapContextListener implements ServletContextListener return Boolean.getBoolean("sonia.scm.boot.disable-core-plugin-extraction"); } - /** - * Restart the whole webapp context. - * - * - * @param event restart event - */ - @Subscribe - public void handleRestartEvent(RestartEvent event) - { - logger.warn("received restart event from {} with reason: {}", - event.getCause(), event.getReason()); - - if (context == null) - { - logger.error("context is null, scm-manager is not initialized"); - } - else - { - ServletContextEvent sce = new ServletContextEvent(context); - - logger.warn("destroy context, because of a received restart event"); - contextDestroyed(sce); - logger.warn("reinitialize context, because of a received restart event"); - contextInitialized(sce); - } - } - /** * Method description * * * @param context * @param pluginDirectory - * @param name * @param entry * * @throws IOException diff --git a/scm-webapp/src/main/java/sonia/scm/boot/RestartServlet.java b/scm-webapp/src/main/java/sonia/scm/boot/RestartServlet.java new file mode 100644 index 0000000000..c7177cc459 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/boot/RestartServlet.java @@ -0,0 +1,97 @@ +package sonia.scm.boot; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.Priority; +import sonia.scm.SCMContext; +import sonia.scm.Stage; +import sonia.scm.event.ScmEventBus; +import sonia.scm.filter.WebElement; + +import javax.inject.Inject; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * This servlet sends a {@link RestartEvent} to the {@link ScmEventBus} which causes scm-manager to restart the context. + * The {@link RestartServlet} can be used for reloading java code or for installing plugins without a complete restart. + * At the moment the Servlet accepts only request, if scm-manager was started in the {@link Stage#DEVELOPMENT} stage. + * + * @since 2.0.0 + */ +@Priority(0) +@WebElement("/restart") +public class RestartServlet extends HttpServlet { + + private static final Logger LOG = LoggerFactory.getLogger(RestartServlet.class); + + private final ObjectMapper objectMapper = new ObjectMapper(); + private final AtomicBoolean restarting = new AtomicBoolean(); + + private final ScmEventBus eventBus; + private final Stage stage; + + @Inject + public RestartServlet() { + this(ScmEventBus.getInstance(), SCMContext.getContext().getStage()); + } + + RestartServlet(ScmEventBus eventBus, Stage stage) { + this.eventBus = eventBus; + this.stage = stage; + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) { + LOG.info("received sendRestartEvent request"); + + if (isRestartAllowed()) { + + try (InputStream requestInput = req.getInputStream()) { + Reason reason = objectMapper.readValue(requestInput, Reason.class); + sendRestartEvent(resp, reason); + } catch (IOException ex) { + LOG.warn("failed to trigger sendRestartEvent event", ex); + resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + } else { + LOG.debug("received restart event in non development stage"); + resp.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE); + } + } + + private boolean isRestartAllowed() { + return stage == Stage.DEVELOPMENT; + } + + private void sendRestartEvent(HttpServletResponse response, Reason reason) { + if ( restarting.compareAndSet(false, true) ) { + LOG.info("trigger sendRestartEvent, because of {}", reason.getMessage()); + eventBus.post(new RestartEvent(RestartServlet.class, reason.getMessage())); + + response.setStatus(HttpServletResponse.SC_ACCEPTED); + } else { + LOG.warn("scm-manager restarts already"); + response.setStatus(HttpServletResponse.SC_CONFLICT); + } + } + + public static class Reason { + + private String message; + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/boot/ServletContextCleaner.java b/scm-webapp/src/main/java/sonia/scm/boot/ServletContextCleaner.java new file mode 100644 index 0000000000..8b152ce329 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/boot/ServletContextCleaner.java @@ -0,0 +1,59 @@ +package sonia.scm.boot; + +import com.google.common.collect.ImmutableSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletContext; +import java.util.Enumeration; +import java.util.Set; + +/** + * Remove cached resources from {@link ServletContext} to allow a clean restart of scm-manager without stale or + * duplicated data. + * + * @since 2.0.0 + */ +final class ServletContextCleaner { + + private static final Logger LOG = LoggerFactory.getLogger(ServletContextCleaner.class); + + private static final Set REMOVE_PREFIX = ImmutableSet.of( + "org.jboss.resteasy", + "resteasy", + "org.apache.shiro", + "sonia.scm" + ); + + private ServletContextCleaner() { + } + + /** + * Remove cached attributes from {@link ServletContext}. + * + * @param servletContext servlet context + */ + static void cleanup(ServletContext servletContext) { + LOG.info("remove cached attributes from context"); + + Enumeration attributeNames = servletContext.getAttributeNames(); + while( attributeNames.hasMoreElements()) { + String name = attributeNames.nextElement(); + if (shouldRemove(name)) { + LOG.info("remove attribute {} from servlet context", name); + servletContext.removeAttribute(name); + } else { + LOG.info("keep attribute {} in servlet context", name); + } + } + } + + private static boolean shouldRemove(String name) { + for (String prefix : REMOVE_PREFIX) { + if (name.startsWith(prefix)) { + return true; + } + } + return false; + } +} diff --git a/scm-webapp/src/main/resources/logback.default.xml b/scm-webapp/src/main/resources/logback.default.xml index 33e914d04d..b12b9e0890 100644 --- a/scm-webapp/src/main/resources/logback.default.xml +++ b/scm-webapp/src/main/resources/logback.default.xml @@ -65,9 +65,6 @@ - - - @@ -93,7 +90,9 @@ --> - + + + diff --git a/scm-webapp/src/main/webapp/WEB-INF/web.xml b/scm-webapp/src/main/webapp/WEB-INF/web.xml index 8abba66aa3..e69eb9fb2a 100644 --- a/scm-webapp/src/main/webapp/WEB-INF/web.xml +++ b/scm-webapp/src/main/webapp/WEB-INF/web.xml @@ -41,10 +41,6 @@ - - sonia.scm.boot.BootstrapContextListener - - BootstrapFilter sonia.scm.boot.BootstrapContextFilter @@ -55,25 +51,6 @@ /* - - - - resteasy.servlet.mapping.prefix - /api - - - - Resteasy - - org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher - - - - - Resteasy - /api/* - - - + + sonia.scm.maven + smp-maven-plugin + true + + true + + + + + org.apache.maven.plugins maven-jar-plugin @@ -61,33 +70,6 @@ - - com.github.sdorra - buildfrontend-maven-plugin - - - link-ui-types - process-sources - - install-link - - - @scm-manager/ui-types - - - - link-ui-components - process-sources - - install-link - - - @scm-manager/ui-components - - - - - diff --git a/scm-plugins/scm-git-plugin/yarn.lock b/scm-plugins/scm-git-plugin/yarn.lock index c1abfd6640..b85f672a8e 100644 --- a/scm-plugins/scm-git-plugin/yarn.lock +++ b/scm-plugins/scm-git-plugin/yarn.lock @@ -707,9 +707,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" diff --git a/scm-plugins/scm-hg-plugin/package.json b/scm-plugins/scm-hg-plugin/package.json index a2ebd0e6ad..1398432412 100644 --- a/scm-plugins/scm-hg-plugin/package.json +++ b/scm-plugins/scm-hg-plugin/package.json @@ -9,6 +9,6 @@ "@scm-manager/ui-extensions": "^0.0.7" }, "devDependencies": { - "@scm-manager/ui-bundler": "^0.0.17" + "@scm-manager/ui-bundler": "^0.0.19" } } diff --git a/scm-plugins/scm-hg-plugin/pom.xml b/scm-plugins/scm-hg-plugin/pom.xml index 3da97d09e8..8dcc653642 100644 --- a/scm-plugins/scm-hg-plugin/pom.xml +++ b/scm-plugins/scm-hg-plugin/pom.xml @@ -31,8 +31,6 @@ - - @@ -54,7 +52,18 @@ true - + + + sonia.scm.maven + smp-maven-plugin + true + + true + + + + + org.apache.maven.plugins maven-jar-plugin @@ -68,33 +77,6 @@ - - com.github.sdorra - buildfrontend-maven-plugin - - - link-ui-types - process-sources - - install-link - - - @scm-manager/ui-types - - - - link-ui-components - process-sources - - install-link - - - @scm-manager/ui-components - - - - - diff --git a/scm-plugins/scm-hg-plugin/yarn.lock b/scm-plugins/scm-hg-plugin/yarn.lock index c3e8cc476f..70d4169198 100644 --- a/scm-plugins/scm-hg-plugin/yarn.lock +++ b/scm-plugins/scm-hg-plugin/yarn.lock @@ -641,9 +641,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -660,6 +660,7 @@ browserify-css "^0.14.0" colors "^1.3.1" commander "^2.17.1" + connect-history-api-fallback "^1.5.0" eslint "^5.4.0" eslint-config-react-app "^2.1.0" eslint-plugin-flowtype "^2.50.0" diff --git a/scm-plugins/scm-legacy-plugin/pom.xml b/scm-plugins/scm-legacy-plugin/pom.xml index 31d8422fbf..52aff51dd2 100644 --- a/scm-plugins/scm-legacy-plugin/pom.xml +++ b/scm-plugins/scm-legacy-plugin/pom.xml @@ -23,4 +23,19 @@ - \ No newline at end of file + + + + + + sonia.scm.maven + smp-maven-plugin + true + + true + + + + + + diff --git a/scm-plugins/scm-svn-plugin/package.json b/scm-plugins/scm-svn-plugin/package.json index b05332e6ca..1798c0b2e5 100644 --- a/scm-plugins/scm-svn-plugin/package.json +++ b/scm-plugins/scm-svn-plugin/package.json @@ -9,6 +9,6 @@ "@scm-manager/ui-extensions": "^0.0.7" }, "devDependencies": { - "@scm-manager/ui-bundler": "^0.0.17" + "@scm-manager/ui-bundler": "^0.0.19" } } diff --git a/scm-plugins/scm-svn-plugin/pom.xml b/scm-plugins/scm-svn-plugin/pom.xml index 6d99ff713c..395def8c27 100644 --- a/scm-plugins/scm-svn-plugin/pom.xml +++ b/scm-plugins/scm-svn-plugin/pom.xml @@ -37,11 +37,19 @@ - - - + + + sonia.scm.maven + smp-maven-plugin + + true + + + + + org.apache.maven.plugins maven-jar-plugin @@ -55,34 +63,6 @@ - - com.github.sdorra - buildfrontend-maven-plugin - - - link-ui-types - process-sources - - install-link - - - @scm-manager/ui-types - - - - link-ui-components - process-sources - - install-link - - - @scm-manager/ui-components - - - - - - diff --git a/scm-plugins/scm-svn-plugin/yarn.lock b/scm-plugins/scm-svn-plugin/yarn.lock index c3e8cc476f..977d642f6f 100644 --- a/scm-plugins/scm-svn-plugin/yarn.lock +++ b/scm-plugins/scm-svn-plugin/yarn.lock @@ -641,9 +641,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" diff --git a/scm-ui-components/packages/ui-components/package.json b/scm-ui-components/packages/ui-components/package.json index 096a8636b3..3d52d16173 100644 --- a/scm-ui-components/packages/ui-components/package.json +++ b/scm-ui-components/packages/ui-components/package.json @@ -12,7 +12,7 @@ "eslint-fix": "eslint src --fix" }, "devDependencies": { - "@scm-manager/ui-bundler": "^0.0.17", + "@scm-manager/ui-bundler": "^0.0.19", "create-index": "^2.3.0", "enzyme": "^3.5.0", "enzyme-adapter-react-16": "^1.3.1", diff --git a/scm-ui-components/packages/ui-components/yarn.lock b/scm-ui-components/packages/ui-components/yarn.lock index b4b0cc32a8..0200fdd1bf 100644 --- a/scm-ui-components/packages/ui-components/yarn.lock +++ b/scm-ui-components/packages/ui-components/yarn.lock @@ -641,9 +641,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" diff --git a/scm-ui-components/packages/ui-types/package.json b/scm-ui-components/packages/ui-types/package.json index 0701870562..122b1ba504 100644 --- a/scm-ui-components/packages/ui-types/package.json +++ b/scm-ui-components/packages/ui-types/package.json @@ -14,7 +14,7 @@ "check": "flow check" }, "devDependencies": { - "@scm-manager/ui-bundler": "^0.0.17" + "@scm-manager/ui-bundler": "^0.0.19" }, "browserify": { "transform": [ diff --git a/scm-ui-components/packages/ui-types/yarn.lock b/scm-ui-components/packages/ui-types/yarn.lock index 58b579d6ae..4f7257e8bb 100644 --- a/scm-ui-components/packages/ui-types/yarn.lock +++ b/scm-ui-components/packages/ui-types/yarn.lock @@ -707,9 +707,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" diff --git a/scm-ui/package.json b/scm-ui/package.json index de42ff2a36..e21c2e4739 100644 --- a/scm-ui/package.json +++ b/scm-ui/package.json @@ -43,7 +43,7 @@ "pre-commit": "jest && flow && eslint src" }, "devDependencies": { - "@scm-manager/ui-bundler": "^0.0.17", + "@scm-manager/ui-bundler": "^0.0.19", "copyfiles": "^2.0.0", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", diff --git a/scm-ui/yarn.lock b/scm-ui/yarn.lock index 18b198622c..5e0fff1bd4 100644 --- a/scm-ui/yarn.lock +++ b/scm-ui/yarn.lock @@ -645,9 +645,9 @@ version "0.0.2" resolved "https://registry.yarnpkg.com/@scm-manager/eslint-config/-/eslint-config-0.0.2.tgz#94cc8c3fb4f51f870b235893dc134fc6c423ae85" -"@scm-manager/ui-bundler@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.17.tgz#949b90ca57e4268be28fcf4975bd9622f60278bb" +"@scm-manager/ui-bundler@^0.0.19": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@scm-manager/ui-bundler/-/ui-bundler-0.0.19.tgz#646ab1fa1e5389fad614542215c60678fb9816ae" dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" From 4f30644e7db2458d1b271cb1603ea45d18a1c3f9 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 1 Nov 2018 10:35:51 +0100 Subject: [PATCH 09/10] Use cache with size zero to avoid null checks --- .../scm/plugin/DefaultUberWebResourceLoader.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultUberWebResourceLoader.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultUberWebResourceLoader.java index 6b886dd5ce..25b8390e53 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultUberWebResourceLoader.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultUberWebResourceLoader.java @@ -81,9 +81,9 @@ public class DefaultUberWebResourceLoader implements UberWebResourceLoader this.cache = createCache(stage); } - private final Cache createCache(Stage stage) { + private Cache createCache(Stage stage) { if (stage == Stage.DEVELOPMENT) { - return null; + return CacheBuilder.newBuilder().maximumSize(0).build(); // Disable caching } return CacheBuilder.newBuilder().build(); } @@ -121,16 +121,11 @@ public class DefaultUberWebResourceLoader implements UberWebResourceLoader } private URL getFromCache(String path) { - if (cache != null) { - return cache.getIfPresent(path); - } - return null; + return cache.getIfPresent(path); } private void addToCache(String path, URL url) { - if (cache != null) { - cache.put(path, url); - } + cache.put(path, url); } /** From 59fccdb0f0c21924ca730bcb4e4db305b667a478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 1 Nov 2018 10:40:53 +0000 Subject: [PATCH 10/10] Close branch feature/lr-for-plugins