package edu.berkeley.thebes.common.config;
import java.util.List;
import com.google.common.collect.Lists;
/**
* RequirementLevels define which apps require which parameters to be configured.
*
* Main usage is something like the CliApp calling
* RequirementLevel.CLIAPP.getRequiredParameters()
* and ensuring all parameters are existent.
*/
public enum RequirementLevel {
COMMON, // Alias: all requirement levels
CLIAPP,
CLIENT_COMMON, // Alias: HAT_CLIENT and TWOPL_CLIENT
SERVER_COMMON, // Alias: HAT_SERVER and TWOPL_SERVER
HAT_COMMON, // Alias: HAT_CLIENT and HAT_SERVER
HAT_CLIENT,
HAT_SERVER,
TWOPL_COMMON, // Alias: TWOPL_CLIENT, TWOPLY_SERVER, TWOPL_TM
TWOPL_CLIENT,
TWOPL_SERVER,
TWOPL_TM;
private List<ConfigParameters> requiredParams;
/** Get all ConfigParamaters at this requirement level. */
public List<ConfigParameters> getRequiredParameters() {
// We cache the result of this computation.
if (requiredParams != null) {
return requiredParams;
}
List<ConfigParameters> params = Lists.newArrayList();
List<RequirementLevel> parentLevels = getParentLevels();
for (ConfigParameters param : ConfigParameters.values()) {
for (RequirementLevel reqLevel : parentLevels) {
if (param.requiresLevel(reqLevel)) {
params.add(param);
break;
}
}
}
requiredParams = params;
return params;
}
/**
* This is the inverse of getAliasedLevels -- it returns all RequirementLevels
* which alias to us (including ourself).
*/
private List<RequirementLevel> getParentLevels() {
List<RequirementLevel> parentLevels = Lists.newArrayList();
for (RequirementLevel reqLevel : RequirementLevel.values()) {
RequirementLevel[] aliasedLevels = reqLevel.getAliasedLevels();
for (RequirementLevel aliasedLevel : aliasedLevels) {
if (aliasedLevel == this) {
parentLevels.add(this);
break;
}
}
}
return parentLevels;
}
/** Expands aliases (e.g., COMMON aliases to everything). */
private RequirementLevel[] getAliasedLevels() {
switch (this) {
case COMMON:
return RequirementLevel.values();
case CLIENT_COMMON:
return new RequirementLevel[] { CLIENT_COMMON, HAT_CLIENT, TWOPL_CLIENT };
case SERVER_COMMON:
return new RequirementLevel[] { SERVER_COMMON, HAT_SERVER, TWOPL_SERVER };
case HAT_COMMON:
return new RequirementLevel[]{ HAT_COMMON, HAT_SERVER, HAT_CLIENT };
case TWOPL_COMMON:
return new RequirementLevel[]{ TWOPL_COMMON, TWOPL_SERVER, TWOPL_CLIENT, TWOPL_TM };
default:
return new RequirementLevel[]{ this };
}
}
}