001package org.kuali.common.util.spring.env.model;
002
003import java.util.Properties;
004
005import org.kuali.common.util.Assert;
006import org.kuali.common.util.Mode;
007import org.kuali.common.util.spring.env.EnvUtils;
008import org.kuali.common.util.spring.env.PropertiesEnvironment;
009import org.springframework.core.env.Environment;
010
011public final class EnvironmentServiceContext {
012
013        public Environment getEnv() {
014                return env;
015        }
016
017        public boolean isCheckEnvironmentVariables() {
018                return checkEnvironmentVariables;
019        }
020
021        public boolean isResolveStrings() {
022                return resolveStrings;
023        }
024
025        public Mode getMissingPropertyMode() {
026                return missingPropertyMode;
027        }
028
029        private final Environment env;
030        private final boolean checkEnvironmentVariables;
031        private final boolean resolveStrings;
032        private final Mode missingPropertyMode;
033
034        private EnvironmentServiceContext(Builder builder) {
035                this.env = builder.env;
036                this.checkEnvironmentVariables = builder.checkEnvironmentVariables;
037                this.resolveStrings = builder.resolveStrings;
038                this.missingPropertyMode = builder.missingPropertyMode;
039        }
040
041        public static class Builder {
042
043                private Environment env = EnvUtils.getDefaultEnvironment();
044                private boolean checkEnvironmentVariables = true;
045                private boolean resolveStrings = true;
046                private Mode missingPropertyMode = Mode.ERROR;
047
048                private static final String CHECK_ENVIRONMENT_VARIABLES_KEY = "env.checkEnvironmentVariables";
049                private static final String RESOLVE_STRINGS_KEY = "env.resolveStrings";
050                private static final String MISSING_PROPERTY_MODE_KEY = "env.missingPropertyMode";
051
052                public Builder env(Properties properties) {
053                        return env(new PropertiesEnvironment(properties));
054                }
055
056                public Builder env(Environment env) {
057                        this.env = env;
058                        return this;
059                }
060
061                public Builder checkEnvironmentVariables(boolean checkEnvironmentVariables) {
062                        this.checkEnvironmentVariables = checkEnvironmentVariables;
063                        return this;
064                }
065
066                public Builder resolveStrings(boolean resolveStrings) {
067                        this.resolveStrings = resolveStrings;
068                        return this;
069                }
070
071                public Builder missingPropertyMode(Mode missingPropertyMode) {
072                        this.missingPropertyMode = missingPropertyMode;
073                        return this;
074                }
075
076                private void override() {
077                        Assert.noNulls(env);
078                        checkEnvironmentVariables(env.getProperty(CHECK_ENVIRONMENT_VARIABLES_KEY, Boolean.class, checkEnvironmentVariables));
079                        resolveStrings(env.getProperty(RESOLVE_STRINGS_KEY, Boolean.class, resolveStrings));
080                        missingPropertyMode(env.getProperty(MISSING_PROPERTY_MODE_KEY, Mode.class, missingPropertyMode));
081                }
082
083                protected void validate(EnvironmentServiceContext ctx) {
084                        Assert.notNull(ctx.getEnv(), "'env' cannot be null");
085                        Assert.notNull(ctx.getMissingPropertyMode(), "'missingPropertyMode' cannot be null");
086                }
087
088                protected EnvironmentServiceContext getInstance() {
089                        return new EnvironmentServiceContext(this);
090                }
091
092                public EnvironmentServiceContext build() {
093                        override();
094                        EnvironmentServiceContext ctx = new EnvironmentServiceContext(this);
095                        validate(ctx);
096                        return ctx;
097                }
098
099        }
100
101}