From a8faa94d154a2d4aa286fe57a61eff57e1dcd8b8 Mon Sep 17 00:00:00 2001 From: Damian Ujma <92095156+damianujma@users.noreply.github.com> Date: Fri, 13 Dec 2024 10:11:04 +0100 Subject: [PATCH] ACS-9074 Bump log4j to 2.24.2 (#3087) * ACS-9023 Bump log4j to 2.24.2 * ACS-9074 Update license header --- pom.xml | 2 +- .../repo/admin/Log4JHierarchyInit.java | 394 +++++++++--------- 2 files changed, 200 insertions(+), 196 deletions(-) diff --git a/pom.xml b/pom.xml index b7b6e35da4..75d1f5768e 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 3.1-HTTPCLIENT-1265 2.12.2 2.0.16 - 2.23.1 + 2.24.2 3.0.23 2.9.2 7.7.10 diff --git a/repository/src/main/java/org/alfresco/repo/admin/Log4JHierarchyInit.java b/repository/src/main/java/org/alfresco/repo/admin/Log4JHierarchyInit.java index 81d809f4dc..4ec6cb956c 100644 --- a/repository/src/main/java/org/alfresco/repo/admin/Log4JHierarchyInit.java +++ b/repository/src/main/java/org/alfresco/repo/admin/Log4JHierarchyInit.java @@ -1,195 +1,199 @@ -/* - * #%L - * Alfresco Repository - * %% - * Copyright (C) 2005 - 2022 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ -package org.alfresco.repo.admin; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration; -import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; - -/** - * Initialises Log4j's HierarchyDynamicMBean (refer to core-services-context.xml) and any overriding log4.properties files. - * The actual implementation uses introspection to avoid any hard-coded references to Log4J classes. If Log4J is - * not present, this class will do nothing. - *

- * Alfresco modules can provide their own log4j2.properties file, which augments/overrides the global log4j2.properties - * within the Alfresco webapp. Within the module's source tree, suppose you create: - *

- *      config/alfresco/module/{module.id}/log4j2.properties
- * 
- * At deployment time, this log4j2.properties file will be placed in: - *
- *      WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties
- * 
- * Where {module.id} is whatever value is set within the AMP's module.properties file. For details, see: Developing an Alfresco Module - *

- * For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have: - * - *

- * config / alfresco / module / org.alfresco.module.someModule / log4j2.properties
- * 
- *

- * This would be deployed to: - *

- * WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties
- * 
- */ -public class Log4JHierarchyInit implements ApplicationContextAware -{ - private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class); - private final List extraLog4jUrls; - private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - - public Log4JHierarchyInit() - { - extraLog4jUrls = new ArrayList<>(); - } - - /** - * Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS. - *

- * This function supports Spring's syntax for retrieving multiple class path resources with the same name, - * via the "classpath*:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}. - */ - public void setExtraLog4jUrls(List urls) - { - extraLog4jUrls.addAll(urls); - } - - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - this.resolver = applicationContext; - } - - public void init() - { - importLogSettings(); - } - - private void importLogSettings() - { - try - { - Properties mainProperties = new Properties(); - - importMainLogSettings(mainProperties); - for (String url : extraLog4jUrls) - { - importLogSettings(url, mainProperties); - } - - PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder() - .setConfigurationSource(null) - .setRootProperties(mainProperties) - .setLoggerContext((LoggerContext) LogManager.getContext(false)) - .build(); - - propertiesConfiguration.initialize(); - ((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration); - } - catch (Throwable t) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug("Failed to add extra Logger configuration: \n" + " Error: " + t.getMessage(), t); - } - } - - } - - private static void importMainLogSettings(Properties mainProperties) throws IOException - { - File file = ((LoggerContext) LogManager.getContext()).getConfiguration().getConfigurationSource().getFile(); - if (file != null) - { - try (FileInputStream fis = new FileInputStream(file)) - { - mainProperties.load(fis); - } - catch (FileNotFoundException e) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug("Failed to find initial configuration: \n" + " Error: " + e.getMessage(), e); - } - } - } - } - - private void importLogSettings(String springUrl, Properties mainProperties) - { - Resource[] resources = null; - - try - { - resources = resolver.getResources(springUrl); - } - catch (Exception e) - { - LOGGER.warn("Failed to find additional Logger configuration: " + springUrl); - } - - // Read each resource - for (Resource resource : resources) - { - try - { - InputStream inputStream = resource.getInputStream(); - Properties properties = new Properties(); - properties.load(inputStream); - mainProperties.putAll(properties); - } - catch (Throwable e) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n" - + " Error: " + e.getMessage(), e); - } - } - } - } - -} \ No newline at end of file +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2024 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.repo.admin; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration; +import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +/** + * Initialises Log4j's HierarchyDynamicMBean (refer to core-services-context.xml) and any overriding log4.properties files. The actual implementation uses introspection to avoid any hard-coded references to Log4J classes. If Log4J is not present, this class will do nothing. + *

+ * Alfresco modules can provide their own log4j2.properties file, which augments/overrides the global log4j2.properties within the Alfresco webapp. Within the module's source tree, suppose you create: + * + *

+ *      config/alfresco/module/{module.id}/log4j2.properties
+ * 
+ * + * At deployment time, this log4j2.properties file will be placed in: + * + *
+ *      WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties
+ * 
+ * + * Where {module.id} is whatever value is set within the AMP's module.properties file. For details, see: Developing an Alfresco Module + *

+ * For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have: + * + *

+ * config / alfresco / module / org.alfresco.module.someModule / log4j2.properties
+ * 
+ *

+ * This would be deployed to: + * + *

+ * WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties
+ * 
+ */ +public class Log4JHierarchyInit implements ApplicationContextAware +{ + private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class); + private final List extraLog4jUrls; + private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + + static + { + System.setProperty("log4j2.disableJmx", "false"); + } + + public Log4JHierarchyInit() + { + extraLog4jUrls = new ArrayList<>(); + } + + /** + * Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS. + *

+ * This function supports Spring's syntax for retrieving multiple class path resources with the same name, via the "classpath*:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}. + */ + public void setExtraLog4jUrls(List urls) + { + extraLog4jUrls.addAll(urls); + } + + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.resolver = applicationContext; + } + + public void init() + { + importLogSettings(); + } + + private void importLogSettings() + { + try + { + Properties mainProperties = new Properties(); + + importMainLogSettings(mainProperties); + for (String url : extraLog4jUrls) + { + importLogSettings(url, mainProperties); + } + + PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder() + .setConfigurationSource(null) + .setRootProperties(mainProperties) + .setLoggerContext((LoggerContext) LogManager.getContext(false)) + .build(); + + propertiesConfiguration.initialize(); + ((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration); + } + catch (Throwable t) + { + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug("Failed to add extra Logger configuration: \n" + " Error: " + t.getMessage(), t); + } + } + + } + + private static void importMainLogSettings(Properties mainProperties) throws IOException + { + File file = ((LoggerContext) LogManager.getContext()).getConfiguration().getConfigurationSource().getFile(); + if (file != null) + { + try (FileInputStream fis = new FileInputStream(file)) + { + mainProperties.load(fis); + } + catch (FileNotFoundException e) + { + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug("Failed to find initial configuration: \n" + " Error: " + e.getMessage(), e); + } + } + } + } + + private void importLogSettings(String springUrl, Properties mainProperties) + { + Resource[] resources = null; + + try + { + resources = resolver.getResources(springUrl); + } + catch (Exception e) + { + LOGGER.warn("Failed to find additional Logger configuration: " + springUrl); + } + + // Read each resource + for (Resource resource : resources) + { + try + { + InputStream inputStream = resource.getInputStream(); + Properties properties = new Properties(); + properties.load(inputStream); + mainProperties.putAll(properties); + } + catch (Throwable e) + { + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n" + + " Error: " + e.getMessage(), e); + } + } + } + } + +}