This is an automated email from the ASF dual-hosted git repository. mthl pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
commit 98bfafd1485574d849c24a22158f407578840d0e Author: Samuel Trégouët <samuel.trego...@nereide.fr> AuthorDate: Sat Dec 7 14:47:34 2019 +0100 Improved: Resolve classpath conflict on `freemarkerTransforms.properties` (OFBIZ-11161) All files in {compoment}/config directories are placed in jar root (cf. sourceSets definition in build.gradle) but there are 4 different `freemarkerTransforms.properties` in ofbiz (content, product, webapp, widget). This works fine because we are adding config directories in classpath (through classpath tag in ofbiz-component.xml), but this is not really intuitive. So to make things clearer this patch move `freemarkerTransforms.properties` into `src/main/resources` with a namespace package and `FreeMarkerWorker.java` is modified accordingly. --- .../ofbiz/content}/freemarkerTransforms.properties | 0 .../ofbiz/product}/freemarkerTransforms.properties | 0 .../ofbiz/base/util/template/FreeMarkerWorker.java | 39 +++++++++++++--------- .../ofbiz/webapp}/freemarkerTransforms.properties | 0 .../ofbiz/widget}/freemarkerTransforms.properties | 0 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/applications/content/config/freemarkerTransforms.properties b/applications/content/src/main/resources/org/apache/ofbiz/content/freemarkerTransforms.properties similarity index 100% rename from applications/content/config/freemarkerTransforms.properties rename to applications/content/src/main/resources/org/apache/ofbiz/content/freemarkerTransforms.properties diff --git a/applications/product/config/freemarkerTransforms.properties b/applications/product/src/main/resources/org/apache/ofbiz/product/freemarkerTransforms.properties similarity index 100% rename from applications/product/config/freemarkerTransforms.properties rename to applications/product/src/main/resources/org/apache/ofbiz/product/freemarkerTransforms.properties diff --git a/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java b/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java index 2b574f1..edc2c25 100644 --- a/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java +++ b/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java @@ -23,19 +23,21 @@ import java.io.IOException; import java.io.Writer; import java.net.URL; import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.TimeZone; +import java.util.stream.Stream; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.ofbiz.base.location.FlexibleLocation; +import org.apache.ofbiz.base.component.ComponentConfig; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.StringUtil; import org.apache.ofbiz.base.util.UtilGenerics; @@ -68,6 +70,8 @@ import freemarker.template.Version; * FreeMarkerWorker - Freemarker Template Engine Utilities. */ public final class FreeMarkerWorker { + /** The template used to retrieved Freemarker transforms from multiple component classpaths. */ + private static final String TRANSFORMS_PROPERTIES = "org/apache/ofbiz/%s/freemarkerTransforms.properties"; public static final String module = FreeMarkerWorker.class.getName(); @@ -122,27 +126,30 @@ public final class FreeMarkerWorker { } // Transforms properties file set up as key=transform name, property=transform class name ClassLoader loader = Thread.currentThread().getContextClassLoader(); - Enumeration<URL> resources; - try { - resources = loader.getResources("freemarkerTransforms.properties"); - } catch (IOException e) { - Debug.logError(e, "Could not load list of freemarkerTransforms.properties", module); - throw UtilMisc.initCause(new InternalError(e.getMessage()), e); - } - while (resources.hasMoreElements()) { - URL propertyURL = resources.nextElement(); - Debug.logInfo("loading properties: " + propertyURL, module); - Properties props = UtilProperties.getProperties(propertyURL); - if (UtilValidate.isEmpty(props)) { - Debug.logError("Unable to locate properties file " + propertyURL, module); + transformsURL(loader).forEach(url -> { + Properties props = UtilProperties.getProperties(url); + if (props == null) { + Debug.logError("Unable to load properties file " + url, module); } else { + Debug.logInfo("loading properties: " + url, module); loadTransforms(loader, props, newConfig); } - } - + }); return newConfig; } + /** + * Provides the sequence of existing {@code freemarkerTransforms.properties} files. + * + * @return a stream of resource location. + */ + private static Stream<URL> transformsURL(ClassLoader loader) { + return ComponentConfig.components() + .map(cc -> String.format(TRANSFORMS_PROPERTIES, cc.getComponentName())) + .map(loader::getResource) + .filter(Objects::nonNull); + } + private static void loadTransforms(ClassLoader loader, Properties props, Configuration config) { for (Object object : props.keySet()) { String key = (String) object; diff --git a/framework/webapp/config/freemarkerTransforms.properties b/framework/webapp/src/main/resources/org/apache/ofbiz/webapp/freemarkerTransforms.properties similarity index 100% rename from framework/webapp/config/freemarkerTransforms.properties rename to framework/webapp/src/main/resources/org/apache/ofbiz/webapp/freemarkerTransforms.properties diff --git a/framework/widget/config/freemarkerTransforms.properties b/framework/widget/src/main/resources/org/apache/ofbiz/widget/freemarkerTransforms.properties similarity index 100% rename from framework/widget/config/freemarkerTransforms.properties rename to framework/widget/src/main/resources/org/apache/ofbiz/widget/freemarkerTransforms.properties