com.cinchapi.concourse.server.plugin.PluginConfiguration Maven / Gradle / Ivy
/*
* Copyright (c) 2013-2018 Cinchapi Inc.
*
* 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.
*/
package com.cinchapi.concourse.server.plugin;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import ch.qos.logback.classic.Level;
import com.cinchapi.concourse.util.Logging;
import com.cinchapi.lib.config.Configuration;
import com.cinchapi.lib.config.read.Interpreters;
import com.google.common.base.CaseFormat;
import com.google.common.base.Function;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
/**
* A collection of preferences that are used to configure a plugin's JVM and
* possible internal operations.
*
* Defaults can be {@link #addDefault(String, Object) declared} programmatically
* by the plugin and can be overridden by the user by specifying a prefs file in
* the plugin's home directory.
*
*
* @author Jeff Nelson
*/
public abstract class PluginConfiguration extends Configuration {
/**
* The absolute {@link Path} to plugin pref file in the plugin's home dir
*/
protected static Path PLUGIN_PREFS;
/**
* The name of the dev prefs file in the plugin's home directory.
*/
protected static final String PLUGIN_PREFS_DEV_FILENAME = "plugin.prefs.dev";
/**
* The name of the prefs file in the plugin's home directory.
*/
protected static final String PLUGIN_PREFS_FILENAME = "plugin.prefs";
/**
* The default value for the {@link SystemPreference#HEAP_SIZE} preference
* (in bytes).
*/
private static final long DEFAULT_HEAP_SIZE_IN_BYTES = 268435456;
/**
* The default value for the {@link SystemPreference#DEBUG_PORT} preference
*/
private static final int DEFAULT_REMOTE_DEBUGGER_PORT = 0;
/**
* The absolute path to the dev prefs file in the plugin's home directory.
*/
private static final Path PLUGIN_PREFS_DEV_LOCATION = PluginRuntime
.getRuntime().home()
.resolve(Paths.get("conf", PLUGIN_PREFS_DEV_FILENAME))
.toAbsolutePath();
/**
* The absolute path to the prefs file in the plugin's home directory.
*/
private static final Path PLUGIN_PREFS_LOCATION = PluginRuntime.getRuntime()
.home().resolve(Paths.get("conf", PLUGIN_PREFS_FILENAME))
.toAbsolutePath();
static {
// Prevent logging from showing up in the console
Logging.disable(PluginConfiguration.class);
// Set location of the plugin preferences files depending on the
// existence of the preferences files
PLUGIN_PREFS = Files.exists(PLUGIN_PREFS_DEV_LOCATION)
? PLUGIN_PREFS_DEV_LOCATION : PLUGIN_PREFS_LOCATION;
}
/**
* Default configuration values that are defined within the plugin. These
* defaults are used if they are not overridden in the prefs file.
*/
private final Map defaults = Maps.newHashMap();
/**
* Construct a new instance.
*/
public PluginConfiguration() {
this(PLUGIN_PREFS);
}
/**
* DO NOT CALL
*
* Provided for the plugin manager to create a local handler for every
* plugin's preferences.
*
*
* @param location
*/
protected PluginConfiguration(Path location) {
super(location);
addDefault(SystemPreference.REMOTE_DEBUGGER_PORT,
DEFAULT_REMOTE_DEBUGGER_PORT);
addDefault(SystemPreference.HEAP_SIZE, DEFAULT_HEAP_SIZE_IN_BYTES);
addDefault(SystemPreference.LOG_LEVEL, Level.INFO.levelStr);
}
/**
* Returns the list of aliases. If no aliases available, it will return a
* default empty list.
*
* @return List.
*/
public List getAliases() {
List aliases = get(SystemPreference.ALIAS.getKey(),
Interpreters.listFromDelimitedString(','));
if(aliases == null) {
aliases = get(SystemPreference.ALIASES.getKey(),
Interpreters.listFromDelimitedString(','));
}
else {
aliases.addAll(getOrDefault(SystemPreference.ALIASES.getKey(),
Interpreters.listFromDelimitedString(','),
ImmutableList.of()));
}
// TODO: add support default aliases...
return MoreObjects.firstNonNull(aliases, ImmutableList.of());
}
/**
* Return the heap_size for the plugin's JVM.
*
* @return the heap_size preference
*/
public long getHeapSize() {
long theDefault = (long) defaults
.get(SystemPreference.HEAP_SIZE.getKey());
return getOrDefault(SystemPreference.HEAP_SIZE.getKey(),
Interpreters.numberOfBytes(), theDefault);
}
/**
* Return the log_level for the plugin's JVM.
*
* @return the log_level preference
*/
public Level getLogLevel() {
Level theDefault = Level.valueOf(
(String) defaults.get(SystemPreference.LOG_LEVEL.getKey()));
return getOrDefault(SystemPreference.LOG_LEVEL.getKey(),
Interpreters.logLevel(), theDefault);
}
/**
* Return the debug_mode for the plugin's JVM.
*
* @return boolean
*/
public boolean getRemoteDebuggerEnabled() {
Integer port = getRemoteDebuggerPort();
return port != null && port > 0;
}
/**
* Return the debug_port for the plugin's JVM.
*
* @return int
*/
public int getRemoteDebuggerPort() {
int theDefault = (int) defaults
.get(SystemPreference.REMOTE_DEBUGGER_PORT.getKey());
return getOrDefault(SystemPreference.REMOTE_DEBUGGER_PORT.getKey(),
theDefault);
}
/**
* Define a default preference to be used if not provided in the prefs file.
*
* @param key
* @param value
*/
protected void addDefault(String key, Object value) {
SystemPreference sys = null;
try {
sys = SystemPreference.valueOf(CaseFormat.LOWER_UNDERSCORE
.to(CaseFormat.UPPER_UNDERSCORE, key));
}
catch (IllegalArgumentException e) {/* no-op */}
if(sys != null) {
addDefault(sys, value);
}
else {
defaults.put(key, value);
}
}
/**
* Define a default preference to be used if not provided in the prefs file.
*
* @param key
* @param value
*/
protected void addDefault(SystemPreference key, Object value) {
key.validate(value);
defaults.put(key.getKey(), value);
}
/**
* A collection of "system" preferences with (possibly) special validation
* rules.
*
* @author Jeff Nelson
*/
protected enum SystemPreference {
ALIAS(null, ArrayList.class),
ALIASES(null, ArrayList.class),
HEAP_SIZE(null, int.class, long.class, Integer.class, Long.class),
LOG_LEVEL(null, String.class),
REMOTE_DEBUGGER_PORT(null, int.class, Integer.class);
/**
* A function that can be defined to validate values for this
* preference.
*/
@Nullable
private final Function © 2015 - 2025 Weber Informatics LLC | Privacy Policy