Created
November 30, 2019 15:50
-
-
Save aalmiray/c2a77641c2fa2636d27f18b3093cf63a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* SPDX-License-Identifier: Apache-2.0 | |
* | |
* Copyright 2019 Andres Almiray. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package org.kordamp.gradle | |
import groovy.transform.CompileStatic | |
import org.gradle.api.Transformer | |
import org.gradle.api.internal.provider.HasConfigurableValueInternal | |
import org.gradle.api.internal.tasks.TaskDependencyContainer | |
import org.gradle.api.internal.tasks.TaskDependencyResolveContext | |
import org.gradle.api.provider.Property | |
import org.gradle.api.provider.Provider | |
import javax.annotation.Nullable | |
import static org.kordamp.gradle.StringUtils.isBlank | |
import static org.kordamp.gradle.StringUtils.isNotBlank | |
/** | |
* @author Andres Almiray | |
* @since 0.2.0 | |
*/ | |
@CompileStatic | |
class PropertyUtils { | |
static Property<String> stringProperty(String envKey, String propertyKey, Property<String> property) { | |
new StringPropertyDecorator(envKey, propertyKey, property) | |
} | |
static Property<Boolean> booleanProperty(String envKey, String propertyKey, Property<Boolean> property) { | |
new BooleanPropertyDecorator(envKey, propertyKey, property) | |
} | |
static Property<Integer> integerProperty(String envKey, String propertyKey, Property<Integer> property) { | |
new IntegerPropertyDecorator(envKey, propertyKey, property) | |
} | |
private static class ProviderDecorator<T> implements Provider<T>, | |
TaskDependencyContainer, | |
HasConfigurableValueInternal { | |
private final Provider<T> delegate | |
ProviderDecorator(Provider<T> delegate) { | |
this.delegate = delegate | |
} | |
protected Provider<T> getDelegate() { | |
return this.@delegate | |
} | |
@Override | |
T get() { | |
return delegate.get() | |
} | |
@Override | |
T getOrNull() { | |
return delegate.getOrNull() | |
} | |
@Override | |
T getOrElse(T t) { | |
return delegate.getOrElse(t) | |
} | |
@Override | |
<S> Provider<S> map(Transformer<? extends S, ? super T> transformer) { | |
return delegate.map(transformer) | |
} | |
@Override | |
<S> Provider<S> flatMap(Transformer<? extends Provider<? extends S>, ? super T> transformer) { | |
return delegate.flatMap(transformer) | |
} | |
@Override | |
boolean isPresent() { | |
return delegate.isPresent() | |
} | |
@Override | |
Provider<T> orElse(T t) { | |
delegate.orElse(t) | |
return this | |
} | |
@Override | |
Provider<T> orElse(Provider<? extends T> provider) { | |
delegate.orElse(provider) | |
return this | |
} | |
@Override | |
void visitDependencies(TaskDependencyResolveContext t) { | |
if (delegate instanceof TaskDependencyContainer) { | |
((TaskDependencyContainer) delegate).visitDependencies(t) | |
} | |
} | |
@Override | |
void finalizeValue() { | |
if (delegate instanceof HasConfigurableValueInternal) { | |
((HasConfigurableValueInternal) delegate).finalizeValue() | |
} | |
} | |
@Override | |
void disallowChanges() { | |
if (delegate instanceof HasConfigurableValueInternal) { | |
((HasConfigurableValueInternal) delegate).disallowChanges() | |
} | |
} | |
@Override | |
void implicitFinalizeValue() { | |
if (delegate instanceof HasConfigurableValueInternal) { | |
((HasConfigurableValueInternal) delegate).implicitFinalizeValue() | |
} | |
} | |
} | |
private static class PropertyDecorator<T> implements Property<T>, | |
TaskDependencyContainer, | |
HasConfigurableValueInternal { | |
private final Property<T> delegate | |
PropertyDecorator(Property<T> delegate) { | |
this.delegate = delegate | |
} | |
protected Property<T> getDelegate() { | |
return this.@delegate | |
} | |
@Override | |
void set(@Nullable T t) { | |
delegate.set(t) | |
} | |
@Override | |
void set(Provider<? extends T> provider) { | |
delegate.set(provider) | |
} | |
@Override | |
Property<T> value(@Nullable T t) { | |
delegate.value(t) | |
return this | |
} | |
@Override | |
Property<T> value(Provider<? extends T> provider) { | |
delegate.value(provider) | |
return this | |
} | |
@Override | |
Property<T> convention(T t) { | |
delegate.convention(t) | |
return this | |
} | |
@Override | |
Property<T> convention(Provider<? extends T> provider) { | |
delegate.convention(provider) | |
return this | |
} | |
@Override | |
void finalizeValue() { | |
delegate.finalizeValue() | |
} | |
@Override | |
void disallowChanges() { | |
delegate.disallowChanges() | |
} | |
@Override | |
T get() { | |
return delegate.get() | |
} | |
@Override | |
T getOrNull() { | |
return delegate.getOrNull() | |
} | |
@Override | |
T getOrElse(T t) { | |
return delegate.getOrElse(t) | |
} | |
@Override | |
<S> Provider<S> map(Transformer<? extends S, ? super T> transformer) { | |
return delegate.map(transformer) | |
} | |
@Override | |
<S> Provider<S> flatMap(Transformer<? extends Provider<? extends S>, ? super T> transformer) { | |
return delegate.flatMap(transformer) | |
} | |
@Override | |
boolean isPresent() { | |
return delegate.isPresent() | |
} | |
@Override | |
Provider<T> orElse(T t) { | |
return delegate.orElse(t) | |
} | |
@Override | |
Provider<T> orElse(Provider<? extends T> provider) { | |
return delegate.orElse(provider) | |
} | |
@Override | |
void visitDependencies(TaskDependencyResolveContext t) { | |
if (delegate instanceof TaskDependencyContainer) { | |
((TaskDependencyContainer) delegate).visitDependencies(t) | |
} | |
} | |
@Override | |
void implicitFinalizeValue() { | |
if (delegate instanceof HasConfigurableValueInternal) { | |
((HasConfigurableValueInternal) delegate).implicitFinalizeValue() | |
} | |
} | |
} | |
private static abstract class EnvironmentAwareProviderDecorator<T> extends ProviderDecorator<T> { | |
private final String envKey | |
private final String propertyKey | |
EnvironmentAwareProviderDecorator(String envKey, String propertyKey, Provider<T> delegate) { | |
super(delegate) | |
this.envKey = envKey | |
this.propertyKey = propertyKey | |
} | |
@Override | |
T get() { | |
T result = resolveValue() | |
return null != result ? result : delegate.get() | |
} | |
@Override | |
T getOrNull() { | |
T result = resolveValue() | |
return null != result ? result : delegate.getOrNull() | |
} | |
@Override | |
T getOrElse(T t) { | |
T result = resolveValue() | |
return null != result ? result : delegate.getOrElse(t) | |
} | |
@Override | |
boolean isPresent() { | |
return null != resolveValue() || delegate.isPresent() | |
} | |
protected abstract T resolveValue() | |
} | |
private static class BooleanProviderDecorator extends EnvironmentAwareProviderDecorator<Boolean> { | |
BooleanProviderDecorator(String envKey, String propertyKey, Provider<Boolean> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
protected Boolean resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
if (isNotBlank(value)) { | |
return Boolean.parseBoolean(value) | |
} | |
return null | |
} | |
} | |
private static class StringProviderDecorator extends EnvironmentAwareProviderDecorator<String> { | |
StringProviderDecorator(String envKey, String propertyKey, Provider<String> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
protected String resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
return isNotBlank(value) ? value : null | |
} | |
} | |
private static class IntegerProviderDecorator extends EnvironmentAwareProviderDecorator<Integer> { | |
IntegerProviderDecorator(String envKey, String propertyKey, Provider<Integer> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
protected Integer resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
if (isNotBlank(value)) { | |
return Integer.parseInt(value) | |
} | |
return null | |
} | |
} | |
private static abstract class EnvironmentAwarePropertyDecorator<T> extends PropertyDecorator<T> { | |
final String envKey | |
final String propertyKey | |
EnvironmentAwarePropertyDecorator(String envKey, String propertyKey, Property<T> delegate) { | |
super(delegate) | |
this.envKey = envKey | |
this.propertyKey = propertyKey | |
} | |
@Override | |
T get() { | |
T result = resolveValue() | |
return null != result ? result : delegate.get() | |
} | |
@Override | |
T getOrNull() { | |
T result = resolveValue() | |
return null != result ? result : delegate.getOrNull() | |
} | |
@Override | |
T getOrElse(T t) { | |
T result = resolveValue() | |
return null != result ? result : delegate.getOrElse(t) | |
} | |
@Override | |
boolean isPresent() { | |
return null != resolveValue() || delegate.isPresent() | |
} | |
protected abstract T resolveValue() | |
} | |
private static class BooleanPropertyDecorator extends EnvironmentAwarePropertyDecorator<Boolean> { | |
BooleanPropertyDecorator(String envKey, String propertyKey, Property<Boolean> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
@Override | |
Provider<Boolean> orElse(Boolean t) { | |
new BooleanProviderDecorator(envKey, propertyKey, delegate.orElse(t)) | |
} | |
@Override | |
Provider<Boolean> orElse(Provider<? extends Boolean> provider) { | |
new BooleanProviderDecorator(envKey, propertyKey, delegate.orElse(provider)) | |
} | |
protected Boolean resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
if (isNotBlank(value)) { | |
return Boolean.parseBoolean(value) | |
} | |
return null | |
} | |
} | |
private static class StringPropertyDecorator extends EnvironmentAwarePropertyDecorator<String> { | |
StringPropertyDecorator(String envKey, String propertyKey, Property<String> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
@Override | |
Provider<String> orElse(String t) { | |
new StringProviderDecorator(envKey, propertyKey, delegate.orElse(t)) | |
} | |
@Override | |
Provider<String> orElse(Provider<? extends String> provider) { | |
new StringProviderDecorator(envKey, propertyKey, delegate.orElse(provider)) | |
} | |
protected String resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
return isNotBlank(value) ? value : null | |
} | |
} | |
private static class IntegerPropertyDecorator extends EnvironmentAwarePropertyDecorator<Integer> { | |
IntegerPropertyDecorator(String envKey, String propertyKey, Property<Integer> delegate) { | |
super(envKey, propertyKey, delegate) | |
} | |
@Override | |
Provider<Integer> orElse(Integer t) { | |
new IntegerProviderDecorator(envKey, propertyKey, delegate.orElse(t)) | |
} | |
@Override | |
Provider<Integer> orElse(Provider<? extends Integer> provider) { | |
new IntegerProviderDecorator(envKey, propertyKey, delegate.orElse(provider)) | |
} | |
protected Integer resolveValue() { | |
String value = System.getenv(envKey) | |
if (isBlank(value)) value = System.getProperty(propertyKey) | |
if (isNotBlank(value)) { | |
return Integer.parseInt(value) | |
} | |
return null | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment