Author: pauls Date: Tue Sep 12 23:06:41 2017 New Revision: 1808189 URL: http://svn.apache.org/viewvc?rev=1808189&view=rev Log: Use a util method to do variable substitution.
Modified: sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java Modified: sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java URL: http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java?rev=1808189&r1=1808188&r2=1808189&view=diff ============================================================================== --- sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java (original) +++ sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java Tue Sep 12 23:06:41 2017 @@ -44,6 +44,7 @@ import org.apache.sling.feature.KeyValue import org.apache.sling.feature.analyser.BundleDescriptor; import org.apache.sling.feature.scanner.FrameworkScanner; import org.apache.sling.feature.support.util.PackageInfo; +import org.apache.sling.feature.support.util.SubstVarUtil; import org.osgi.framework.Constants; public class FelixFrameworkScanner implements FrameworkScanner { @@ -172,137 +173,11 @@ public class FelixFrameworkScanner imple for(final Object name : defaultMap.keySet()) { if ( frameworkProps.get(name.toString()) == null ) { final String value = (String)defaultMap.get(name); - final String substValue = substVars(value, name.toString(), null, defaultMap); + final String substValue = SubstVarUtil.substVars(value, name.toString(), null, (Map) defaultMap); frameworkProps.put(name.toString(), substValue); } } return frameworkProps; } - - private static final String DELIM_START = "${"; - private static final String DELIM_STOP = "}"; - - /** - * <p> - * This method performs property variable substitution on the - * specified value. If the specified value contains the syntax - * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt> - * refers to either a configuration property or a system property, - * then the corresponding property value is substituted for the variable - * placeholder. Multiple variable place holders may exist in the - * specified value as well as nested variable place holders, which - * are substituted from inner most to outer most. Configuration - * properties override system properties. - * </p> - * @param val The string on which to perform property substitution. - * @param currentKey The key of the property being evaluated used to - * detect cycles. - * @param cycleMap Map of variable references used to detect nested cycles. - * @param configProps Set of configuration properties. - * @return The value of the specified string after system property substitution. - * @throws IllegalArgumentException If there was a syntax error in the - * property placeholder syntax or a recursive variable reference. - **/ - private static String substVars(String val, String currentKey, - Map<String, String> cycleMap, Properties configProps) - throws IllegalArgumentException - { - // If there is currently no cycle map, then create - // one for detecting cycles for this invocation. - if (cycleMap == null) - { - cycleMap = new HashMap<>(); - } - - // Put the current key in the cycle map. - cycleMap.put(currentKey, currentKey); - - // Assume we have a value that is something like: - // "leading ${foo.${bar}} middle ${baz} trailing" - - // Find the first ending '}' variable delimiter, which - // will correspond to the first deepest nested variable - // placeholder. - int stopDelim = -1; - int startDelim = -1; - - do - { - stopDelim = val.indexOf(DELIM_STOP, stopDelim + 1); - // If there is no stopping delimiter, then just return - // the value since there is no variable declared. - if (stopDelim < 0) - { - return val; - } - // Try to find the matching start delimiter by - // looping until we find a start delimiter that is - // greater than the stop delimiter we have found. - startDelim = val.indexOf(DELIM_START); - // If there is no starting delimiter, then just return - // the value since there is no variable declared. - if (startDelim < 0) - { - return val; - } - while (stopDelim >= 0) - { - int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length()); - if ((idx < 0) || (idx > stopDelim)) - { - break; - } - else if (idx < stopDelim) - { - startDelim = idx; - } - } - } - while ((startDelim > stopDelim) && (stopDelim >= 0)); - - // At this point, we have found a variable placeholder so - // we must perform a variable substitution on it. - // Using the start and stop delimiter indices, extract - // the first, deepest nested variable placeholder. - String variable = - val.substring(startDelim + DELIM_START.length(), stopDelim); - - // Verify that this is not a recursive variable reference. - if (cycleMap.get(variable) != null) - { - throw new IllegalArgumentException( - "recursive variable reference: " + variable); - } - - // Get the value of the deepest nested variable placeholder. - // Try to configuration properties first. - String substValue = (configProps != null) - ? configProps.getProperty(variable, null) - : null; - if (substValue == null) - { - // Ignore unknown property values. - substValue = System.getProperty(variable, ""); - } - - // Remove the found variable from the cycle map, since - // it may appear more than once in the value and we don't - // want such situations to appear as a recursive reference. - cycleMap.remove(variable); - - // Append the leading characters, the substituted value of - // the variable, and the trailing characters to get the new - // value. - val = val.substring(0, startDelim) - + substValue - + val.substring(stopDelim + DELIM_STOP.length(), val.length()); - - // Now perform substitution again, since there could still - // be substitutions to make. - val = substVars(val, currentKey, cycleMap, configProps); - - // Return the value. - return val; - } }