All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.rpi.tw.twks.configuration.AbstractConfiguration Maven / Gradle / Ivy

package edu.rpi.tw.twks.configuration;

import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import edu.umd.cs.findbugs.annotations.Nullable;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.EnvironmentConfiguration;
import org.apache.commons.configuration2.SystemConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
import org.apache.commons.configuration2.convert.ListDelimiterHandler;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;

import static com.google.common.base.Preconditions.checkNotNull;

public abstract class AbstractConfiguration {
    public final static ListDelimiterHandler listDelimiterHandler = new DefaultListDelimiterHandler(',');
    private final static String PROPERTY_KEY_PREFIX = "twks";

    protected AbstractConfiguration() {
    }

    @Override
    public final String toString() {
        return toStringHelper().toString();
    }

    protected MoreObjects.ToStringHelper toStringHelper() {
        return MoreObjects.toStringHelper(this).omitNullValues();
    }

    public abstract static class Builder, ConfigurationT extends AbstractConfiguration> {
        private boolean dirty = false;

        private static Configuration setListDelimiterHandler(final org.apache.commons.configuration2.AbstractConfiguration configuration) {
            configuration.setListDelimiterHandler(listDelimiterHandler);
            return configuration;
        }

        public abstract ConfigurationT build();

        /**
         * Has a setter been called?
         *
         * @return true if a setter has been called
         */
        public final boolean isDirty() {
            return dirty;
        }

        /**
         * Mark that a setter has been called.
         */
        protected final void markDirty() {
            dirty = true;
        }

        public final BuilderT set(final Configuration configuration) {
            return set(new ConfigurationWrapper(configuration));
        }

        public abstract BuilderT set(final ConfigurationWrapper properties);

        @SuppressWarnings("unchecked")
        public final BuilderT setFromEnvironment() {
            set(setListDelimiterHandler(new EnvironmentConfiguration()).subset(PROPERTY_KEY_PREFIX));
            set(setListDelimiterHandler(new SystemConfiguration()).subset(PROPERTY_KEY_PREFIX));
            return (BuilderT) this;
        }

        protected final static class ConfigurationWrapper {
            private final Configuration delegate;

            private ConfigurationWrapper(final Configuration delegate) {
                this.delegate = checkNotNull(delegate);
            }

            public final Optional getBoolean(final PropertyDefinition definition) {
                @Nullable final Object value = delegate.getProperty(definition.getKey());
                return value != null ? Optional.of(Boolean.TRUE) : Optional.empty();
            }

            public final Optional getInteger(final PropertyDefinition definition) {
                return Optional.ofNullable(delegate.getInteger(definition.getKey(), null));
            }

            public final Optional getPath(final PropertyDefinition definition) {
                return Optional.ofNullable(delegate.getString(definition.getKey(), null)).map(value -> Paths.get(value));
            }

            @SuppressWarnings("unchecked")
            public final Optional> getPaths(final PropertyDefinition definition) {
                final String[] values = delegate.getStringArray(definition.getKey());
                if (values == null || values.length == 0) {
                    return Optional.empty();
                }
                final ImmutableList.Builder pathsBuilder = ImmutableList.builder();
                for (final String value : values) {
                    pathsBuilder.add(Paths.get(value));
                }
                return Optional.of(pathsBuilder.build());
            }

            public final Optional getString(final PropertyDefinition definition) {
                return Optional.ofNullable(delegate.getString(definition.getKey(), null));
            }
        }
    }

    protected static class PropertyDefinition {
        private final String key;

        public PropertyDefinition(final String key) {
            this.key = checkNotNull(key);
        }

        public final String getKey() {
            return key;
        }
    }

    protected final static class PropertyDefinitionWithDefault extends PropertyDefinition {
        private final T default_;

        public PropertyDefinitionWithDefault(final T default_, final String key) {
            super(key);
            this.default_ = checkNotNull(default_);
        }

        public final T getDefault() {
            return default_;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy