This is an automated email from the ASF dual-hosted git repository. jbonofre pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/main by this push: new 045165cdae Ensure jre and eecap config.properties properties can be computed for modern jvms new 0f2158af3a Merge pull request #1724 from rmannibucau/7696_dynamic-jre-and-eecap-props 045165cdae is described below commit 045165cdae3d7099bc2f892487f23d1a66e1d6df Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Wed Jun 14 21:09:02 2023 +0200 Ensure jre and eecap config.properties properties can be computed for modern jvms --- .../apache/karaf/util/config/PropertiesLoader.java | 93 ++++++++++++++++++---- 1 file changed, 79 insertions(+), 14 deletions(-) diff --git a/util/src/main/java/org/apache/karaf/util/config/PropertiesLoader.java b/util/src/main/java/org/apache/karaf/util/config/PropertiesLoader.java index cab78fb031..9c9d979dae 100644 --- a/util/src/main/java/org/apache/karaf/util/config/PropertiesLoader.java +++ b/util/src/main/java/org/apache/karaf/util/config/PropertiesLoader.java @@ -18,17 +18,19 @@ */ package org.apache.karaf.util.config; +import org.apache.felix.utils.properties.InterpolationHelper; +import org.apache.felix.utils.properties.Properties; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Enumeration; - -import org.apache.felix.utils.properties.InterpolationHelper; -import org.apache.felix.utils.properties.Properties; import java.util.StringTokenizer; +import java.util.stream.IntStream; +import static java.util.stream.Collectors.joining; import static org.apache.felix.utils.properties.InterpolationHelper.substVars; public class PropertiesLoader { @@ -63,15 +65,23 @@ public class PropertiesLoader { URL configPropURL; try { configPropURL = file.toURI().toURL(); - } - catch (MalformedURLException ex) { + } catch (MalformedURLException ex) { System.err.print("Main: " + ex); return null; } Properties configProps = loadPropertiesFile(configPropURL, false); copySystemProperties(configProps); - configProps.substitute(); + configProps.substitute(new InterpolationHelper.BundleContextSubstitutionCallback(null) { + @Override + public String getValue(final String key) { + final String value = super.getValue(key); + if (value == null) { + return lookupVirtualProperty(configProps, key); + } + return value; + } + }); // Perform variable substitution for system properties. // for (Enumeration<?> e = configProps.propertyNames(); e.hasMoreElements();) { @@ -103,16 +113,15 @@ public class PropertiesLoader { public static void loadSystemProperties(File file) throws IOException { Properties props = null; try { - URL configPropURL = file.toURI().toURL(); - props = loadPropertiesFile(configPropURL, true); - } - catch (Exception ex) { - // Ignore - return; + URL configPropURL = file.toURI().toURL(); + props = loadPropertiesFile(configPropURL, true); + } catch (Exception ex) { + // Ignore + return; } InterpolationHelper.SubstitutionCallback callback = new InterpolationHelper.BundleContextSubstitutionCallback(null); - for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements();) { + for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements(); ) { String name = (String) e.nextElement(); if (name.startsWith(OVERRIDE_PREFIX)) { String overrideName = name.substring(OVERRIDE_PREFIX.length()); @@ -127,7 +136,7 @@ public class PropertiesLoader { public static void copySystemProperties(Properties configProps) { for (Enumeration<?> e = System.getProperties().propertyNames(); - e.hasMoreElements();) { + e.hasMoreElements(); ) { String key = (String) e.nextElement(); if (key.startsWith("felix.") || key.startsWith("karaf.") || @@ -238,4 +247,60 @@ public class PropertiesLoader { return retVal; } + private static String lookupVirtualProperty(final Properties properties, final Object key) { + final String keyString = String.valueOf(key); + if (keyString.startsWith("jre-")) { + final String versionString = keyString.substring("jre-".length()); + final Integer versionInt = toJavaIntVersion(properties, versionString); + if (versionInt == null) { + return null; + } + + // for now jre-9 always had been ok but if we have a closer definition we prefer it + for (int i = versionInt - 1; i >= 9; i--) { + final String testedKey = "jre-" + i; + final String otherValue = properties.getProperty(testedKey); + if (otherValue != null) { + return otherValue; + } + } + } else if (keyString.startsWith("eecap-")) { // done in Felix.java but too late since karaf uses it in interpolations too early + final String versionString = keyString.substring("eecap-".length()); + final Integer versionInt = toJavaIntVersion(properties, versionString); + if (versionInt == null) { + return null; + } + + final String tenToLastVersion = IntStream.rangeClosed(10, versionInt) + .boxed() + .map(Object::toString) + .collect(joining(",", ",", "")); + return "osgi.ee; osgi.ee=\"OSGi/Minimum\"; version:List<Version>=\"1.0,1.1,1.2\"," + + "osgi.ee; osgi.ee=\"JavaSE\"; version:List<Version>=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9" + tenToLastVersion + "\"," + + "osgi.ee; osgi.ee=\"JavaSE/compact1\"; version:List<Version>=\"1.8,9" + tenToLastVersion + "\"," + + "osgi.ee; osgi.ee=\"JavaSE/compact2\"; version:List<Version>=\"1.8,9" + tenToLastVersion + "\"," + + "osgi.ee; osgi.ee=\"JavaSE/compact3\"; version:List<Version>=\"1.8,9" + tenToLastVersion + "\""; + } + return null; + } + + private static Integer toJavaIntVersion(final Properties properties, final String versionString) { + final String forcedVersion = properties.getProperty("java.specification.version"); + if (forcedVersion != null && !forcedVersion.equals(versionString)) { + return null; + } + + // fallback for future versions and avoid to have to define it, felix does it for eecap already + int versionInt; + try { + versionInt = Integer.parseInt(versionString); + } catch (final NumberFormatException nfe) { + return null; + } + + if (versionInt < 9) { // must be defined, no help there + return null; + } + return versionInt; + } }