1d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinpackage com.xtremelabs.robolectric.util;
2d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
3d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinimport java.util.Enumeration;
4d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinimport java.util.Properties;
5d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinimport java.util.regex.Matcher;
6d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinimport java.util.regex.Pattern;
7d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
8d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwinpublic class PropertiesHelper {
9d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
10d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin    public static String doSingleSubstitution(String originalValue, Properties properties) {
11d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        if (originalValue == null) {
12d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            return null;
13d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        }
14d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
15d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        Pattern variablePattern = Pattern.compile("([^$]*)\\$\\{(.*?)\\}(.*)");
16d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
17d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        String expandedValue = originalValue;
18d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        Matcher variableMatcher = variablePattern.matcher(expandedValue);
19d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        while (variableMatcher.matches()) {
20d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String propertyName = variableMatcher.group(2);
21d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String propertyValue = null;
22d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            if (properties != null) {
23d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin                propertyValue = properties.getProperty(propertyName);
24d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            }
25d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            if (propertyValue == null) {
26d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin                propertyValue = System.getProperty(propertyName);
27d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            }
28d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            if (propertyValue == null) {
29d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin                return originalValue;
30d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            }
31d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
32d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String sdkPathStart = variableMatcher.group(1);
33d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String sdkPathEnd = variableMatcher.group(3);
34d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            expandedValue = sdkPathStart + propertyValue + sdkPathEnd;
35d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            variableMatcher = variablePattern.matcher(expandedValue);
36d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        }
37d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
38d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        return expandedValue;
39d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin    }
40d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin
41d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin    public static void doSubstitutions(Properties properties) {
42d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        Enumeration<?> propertyNames = properties.propertyNames();
43d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        while (propertyNames.hasMoreElements()) {
44d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String propertyName = (String) propertyNames.nextElement();
45d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String propertyValue = properties.getProperty(propertyName);
46d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            String expandedPropertyValue = doSingleSubstitution(propertyValue, properties);
47d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin            properties.setProperty(propertyName, expandedPropertyValue);
48d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin        }
49d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin    }
50d05d28aca7ef2f1eba0714fc46a2ed4165a5902aPhil Goodwin}
51