Environment.java
001 /*
002  * Copyright 2008-2015 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.core.env;
017 
018 import javax.annotation.Nonnull;
019 import javax.annotation.Nullable;
020 import java.util.LinkedHashMap;
021 import java.util.Locale;
022 import java.util.Map;
023 
024 import static java.util.Objects.requireNonNull;
025 
026 /**
027  * An enum that represents the current environment
028  *
029  @author Andres Almiray
030  @since 2.0.0
031  */
032 public enum Environment {
033     /**
034      * The development environment
035      */
036     DEVELOPMENT,
037 
038     /**
039      * The production environment
040      */
041     PRODUCTION,
042 
043     /**
044      * The test environment
045      */
046     TEST,
047 
048     /**
049      * A custom environment
050      */
051     CUSTOM;
052 
053     /**
054      * Constant used to resolve the environment via System.getProperty(Environment.KEY)
055      */
056     public static final String KEY = "griffon.env";
057 
058     private static final String PRODUCTION_ENV_SHORT_NAME = "prod";
059     private static final String DEVELOPMENT_ENVIRONMENT_SHORT_NAME = "dev";
060     private static final String TEST_ENVIRONMENT_SHORT_NAME = "test";
061 
062     private static final Map<String, String> ENV_NAME_MAPPINGS = new LinkedHashMap<>();
063 
064     static {
065         ENV_NAME_MAPPINGS.put(DEVELOPMENT_ENVIRONMENT_SHORT_NAME, Environment.DEVELOPMENT.getName());
066         ENV_NAME_MAPPINGS.put(PRODUCTION_ENV_SHORT_NAME, Environment.PRODUCTION.getName());
067         ENV_NAME_MAPPINGS.put(TEST_ENVIRONMENT_SHORT_NAME, Environment.TEST.getName());
068     }
069 
070     private String name;
071 
072     /**
073      @return Return true if the environment has been set as a System property
074      */
075     public static boolean isSystemSet() {
076         return System.getProperty(KEY!= null;
077     }
078 
079     /**
080      * Returns the environment for the given short name
081      *
082      @param shortName The short name
083      @return The Environment or null if not known
084      */
085     @Nullable
086     public static Environment resolveEnvironment(@Nullable String shortName) {
087         final String envName = ENV_NAME_MAPPINGS.get(shortName);
088         if (envName != null) {
089             return Environment.valueOf(envName.toUpperCase());
090         }
091         return null;
092     }
093 
094     @Nonnull
095     public static String getEnvironmentShortName(@Nonnull Environment env) {
096         requireNonNull(env, "Argument 'env' must not be null");
097         switch (env) {
098             case DEVELOPMENT:
099                 return "dev";
100             case TEST:
101                 return "test";
102             case PRODUCTION:
103                 return "prod";
104             default:
105                 return env.getName();
106         }
107     }
108 
109     /**
110      @return The name of the environment
111      */
112     @Nonnull
113     public String getName() {
114         if (this != CUSTOM || name == null) {
115             return this.toString().toLowerCase(Locale.getDefault());
116         }
117         return name;
118     }
119 
120     public void setName(@Nullable String name) {
121         this.name = name;
122     }
123 }