blob: 89e8cee15b7805b25735a80b7d580c0ce850c373 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.seatunnel.datasource.configuration;
import static com.google.common.base.Preconditions.checkArgument;
import com.fasterxml.jackson.core.type.TypeReference;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Type;
import java.time.Duration;
import java.util.List;
import java.util.Map;
public class Options {
/**
* Starts building a new {@link Option}.
*
* @param key The key for the config option.
* @return The builder for the config option with the given key.
*/
public static OptionBuilder key(String key) {
checkArgument(StringUtils.isNotBlank(key), "Option's key not be null.");
return new OptionBuilder(key);
}
/**
* The option builder is used to create a {@link Option}. It is instantiated via {@link
* Options#key(String)}.
*/
public static final class OptionBuilder {
private final String key;
/**
* Creates a new OptionBuilder.
*
* @param key The key for the config option
*/
OptionBuilder(String key) {
this.key = key;
}
/**
* Defines that the value of the option should be of {@link Boolean} type.
*/
public TypedOptionBuilder<Boolean> booleanType() {
return new TypedOptionBuilder<>(key, new TypeReference<Boolean>() {
});
}
/**
* Defines that the value of the option should be of {@link Integer} type.
*/
public TypedOptionBuilder<Integer> intType() {
return new TypedOptionBuilder<>(key, new TypeReference<Integer>() {
});
}
/**
* Defines that the value of the option should be of {@link Long} type.
*/
public TypedOptionBuilder<Long> longType() {
return new TypedOptionBuilder<>(key, new TypeReference<Long>() {
});
}
/**
* Defines that the value of the option should be of {@link Float} type.
*/
public TypedOptionBuilder<Float> floatType() {
return new TypedOptionBuilder<>(key, new TypeReference<Float>() {
});
}
/**
* Defines that the value of the option should be of {@link Double} type.
*/
public TypedOptionBuilder<Double> doubleType() {
return new TypedOptionBuilder<>(key, new TypeReference<Double>() {
});
}
/**
* Defines that the value of the option should be of {@link String} type.
*/
public TypedOptionBuilder<String> stringType() {
return new TypedOptionBuilder<>(key, new TypeReference<String>() {
});
}
/**
* Defines that the value of the option should be of {@link Duration} type.
*/
public TypedOptionBuilder<Duration> durationType() {
return new TypedOptionBuilder<>(key, new TypeReference<Duration>() {
});
}
/**
* Defines that the value of the option should be of {@link Enum} type.
*
* @param enumClass Concrete type of the expected enum.
*/
public <T extends Enum<T>> TypedOptionBuilder<T> enumType(Class<T> enumClass) {
return new TypedOptionBuilder<>(key, new TypeReference<T>() {
@Override
public Type getType() {
return enumClass;
}
});
}
/**
* Defines that the value of the option should be a set of properties, which can be
* represented as {@code Map<String, String>}.
*/
public TypedOptionBuilder<Map<String, String>> mapType() {
return new TypedOptionBuilder<>(key, new TypeReference<Map<String, String>>() {
});
}
/**
* Defines that the value of the option should be a list of properties, which can be
* represented as {@code List<String>}.
*/
public TypedOptionBuilder<List<String>> listType() {
return new TypedOptionBuilder<>(key, new TypeReference<List<String>>() {
});
}
/**
* Defines that the value of the option should be a list of properties, which can be
* represented as {@code List<T>}.
*/
public <T> TypedOptionBuilder<List<T>> listType(Class<T> option) {
return new TypedOptionBuilder<>(key, new TypeReference<List<T>>() {
});
}
public <T> TypedOptionBuilder<T> objectType(Class<T> option) {
return new TypedOptionBuilder<>(key, new TypeReference<T>() {
@Override
public Type getType() {
return option;
}
});
}
/**
* The value of the definition option should be represented as T.
*
* @param typeReference complex type reference
*/
public <T> TypedOptionBuilder<T> type(TypeReference<T> typeReference) {
return new TypedOptionBuilder<>(key, typeReference);
}
}
/**
* Builder for {@link Option} with a defined atomic type.
*
* @param <T> atomic type of the option
*/
public static class TypedOptionBuilder<T> {
private final String key;
private final TypeReference<T> typeReference;
TypedOptionBuilder(String key, TypeReference<T> typeReference) {
this.key = key;
this.typeReference = typeReference;
}
/**
* Creates a Option with the given default value.
*
* @param value The default value for the config option
* @return The config option with the default value.
*/
public Option<T> defaultValue(T value) {
return new Option<>(key, typeReference, value);
}
/**
* Creates a Option without a default value.
*
* @return The config option without a default value.
*/
public Option<T> noDefaultValue() {
return new Option<>(key, typeReference, null);
}
}
}