Snippets

Radistao A Gradle properties reader

Created by Radistao A
/**
 * Try to get configuration property {@code propertyName} in the next order:<ol>
 *     <li>-D${propertyName} Java runtime property in gradle command</li>
 *     <li>-P${propertyName} gradle runtime property in gradle command</li>
 *     <li>${propertyName} in ~/.gradle/gradle.properties (user global gradle properties)</li>
 *     <li>${propertyName} in gradle.properties (project local gradle properties)</li>
 *     <li>${propToEnvName(propertyName)} as environment variable</li>
 *     </ol>
 * @param propertyName in lowercase dotted Java properties format
 * @return property value, if found, otherwise - <b>null</b>
 */
String getConfigurationProperty(String propertyName) {
    return System.getProperty(propertyName) ?:
            project.properties.getOrDefault(propertyName, System.getenv(propToEnvName(propertyName)))
}

/**
 * Same as {@link #getConfigurationProperty(String)}, but returns {@code defaultValue} if property is not
 */
String getConfigurationPropertyOrDefault(String propertyName, String defaultValue) {
    return getConfigurationProperty(propertyName) ?: defaultValue
}

/**
 * Same as {@link #getConfigurationProperty(String)}, but throws {@link IllegalStateException} if property not found
 */
String getConfigurationPropertyOrThrow(String propertyName) {
    final value = getConfigurationProperty(propertyName)
    if (value == null) {
        throw new IllegalStateException("Configuration property \"${propertyName}\" is mandatory, but not found. " +
                "Please specify one of (in order of priority):\n" +
                "  1) -D${propertyName} Java runtime property in gradle command\n" +
                "  2) -P${propertyName} gradle runtime property in gradle command\n" +
                "  3) ${propertyName} in ~/.gradle/gradle.properties (user global gradle properties)\n" +
                "  4) ${propertyName} in gradle.properties (project local gradle properties)\n" +
                "  5) ${propToEnvName(propertyName)} as environment variable\n"
        )
    }

    return value
}

/**
 * Convert Java property name ({@code lower.case.dotted}) to respective environment variable name
 * ({@code UPPER_CASE_UNDERSCORED})
 * @param propertyName non-null property name to convert
 * @return uppercased and underscored {@code propertyName}
 */
String propToEnvName(String propertyName) {
    return propertyName.replaceAll(/\./, '_').toUpperCase()
}

/**
 * Test properties reading priority in example of {@code a.b} property
 */
task testProperties(type: Task) {
    println "prop=\"${getConfigurationPropertyOrThrow("a.b")}\""
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.