package act.conf;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* 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.
* #L%
*/
import act.Act;
import org.osgl.logging.L;
import org.osgl.logging.Logger;
import org.osgl.util.S;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* {@link Act} configuration keys. General rules:
* <p/>
* <ul>
* <li>When a key is ended with <code>.enabled</code>, then you should be able to set
* the setting without <code>.enabled</code> or replace it with <code>.disabled</code>
* but the value will be inverted. For example, <code>built_in.transformer.enabled</code>
* is equal to <code>built_in.transformer</code> and invert to
* <code>built_in.transformer.disabled</code></li>
* <p/>
* <li>When a key is ended with <code>.impl</code>, then you can either put an instance into
* the configuration map or a string of the class className</li>
* </ul>
*/
public enum ActConfigKey implements ConfigKey {
/**
* {@code act.home.dir} specifies the Act home dir
* <p>This property must be set to start Act. There is no default value for this configuration</p>
*/
HOME("home.dir"),
/**
* {@code act.app.base} specifies the application base in relation to the
* {@link #HOME home dir}.
* <p>Default value: {@code apps}</p>
*/
APP_BASE("app.base", "apps"),
/**
* {@code act.mode} specifies the Act running mode. Options:
* <ul>
* <li>{@code dev} - run Act during development, loading and refreshing class
* directly from srccode code enabled in this mode</li>
* <li>{@code prod} - run Act when system is live</li>
* </ul>
* <p>You pass the mode to Act runtime during start up like:</p>
* <pre><code>act --mode dev</code></pre>
* <p>Or via JVM properties like:</p>
* <pre><code>-Dmode=uat</code></pre>
*/
MODE("mode", Act.Mode.PROD),
/**
* `act.xio.worker_threads.max`
*
* specifies the maximum number of worker threads shall be created.
*
* Default value: `0` meaning let the system decide the worker_threads number
*/
XIO_MAX_WORKER_THREADS("xio.worker_threads.max"),
/**
* `act.xio.statistics.enabled`
*
* Enable/disable XIO statistics (for undertow only)
*
* Default value: `false`
*/
XIO_STATISTICS("xio.statistics.enabled"),
/**
* {@code act.xio.impl} specifies the implementation for the network stack implementation
*/
NETWORK_SERVER_IMPL("xio.impl");
private static Logger logger = L.get(AppConfigKey.class);
private static ConfigKeyHelper helper = new ConfigKeyHelper(Act.F.MODE_ACCESSOR, Act.class.getClassLoader());
private String key;
private Object defVal;
ActConfigKey(String key) {
this(key, null);
}
ActConfigKey(String key, Object defVal) {
this.key = key;
this.defVal = defVal;
}
/**
* Return the key string
*
* @return the key of the configuration
*/
public String key() {
return key;
}
/**
* Return default value of this setting. The configuration data map
* is passed in in case the default value be variable depending on
* another setting.
*
* @param configuration
* @return return the default value
*/
protected Object getDefVal(Map<String, ?> configuration) {
return defVal;
}
/**
* Calling to this method is equals to calling {@link #key()}
*
* @return key of the configuration
*/
@Override
public String toString() {
return key;
}
@Override
public Object defVal() {
return defVal;
}
public <T> List<T> implList(String key, Map<String, ?> configuration, Class<T> c) {
return helper.getImplList(key, configuration, c);
}
/**
* Return configuration value from the configuration data map using the {@link #key}
* of this {@link AppConfigKey setting} instance
*
* @param configuration
* @param <T>
* @return return the configuration
*/
public <T> T val(Map<String, ?> configuration) {
return helper.getConfiguration(this, configuration);
}
private static Map<String, ActConfigKey> lookup = new HashMap<String, ActConfigKey>(50);
static {
for (ActConfigKey k : values()) {
lookup.put(k.key().toLowerCase(), k);
}
}
/**
* Return key enum instance from the string in case insensitive mode
*
* @param s
* @return configuration key from the string
*/
public static ActConfigKey valueOfIgnoreCase(String s) {
if (S.empty(s)) throw new IllegalArgumentException();
return lookup.get(s.trim().toLowerCase());
}
}