Class CconfigClientImpl
java.lang.Object
org.chenile.cconfig.sdk.CconfigClientImpl
- All Implemented Interfaces:
CconfigClient
The default implementation of the
CconfigClient interface. This uses a CconfigRetriever to
get multiple Cconfigs that allow the default value to be mutated.-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final CconfigRetrieverprivate final String(package private) ContextContainerprivate static final org.slf4j.Logger(package private) MemoryCacheCaches module keys in cache.private final ObjectMapperprivate final ExpressionParser -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionallKeysForModule(String module, String customAttribute) protected StringOverride this in a subclass to change the default behaviour.private Objectprivate Stringprivate ObjectParses the string as JSON if applicable and returns the parsed string as mapprivate Objectprivate StringreadModuleAsString(String module)
-
Field Details
-
logger
private static final org.slf4j.Logger logger -
objectMapper
-
parser
-
configPath
-
cconfigRetriever
-
memoryCache
-
moduleCache
-
contextContainer
-
-
Constructor Details
-
CconfigClientImpl
-
-
Method Details
-
value
- Specified by:
valuein interfaceCconfigClient- Parameters:
module- - the module under which the key is defined. Modules can be nested.key- - the key for which value is desired.- Returns:
- the value for the key.
If key is null and only module name is specified, then all keys
for module will be returned. Key value can be string or a map.
If a module is specified it will be a map with all the keys as keys of the map. The value can be strings or map depending on how the value was defined in the JSON file and all the DB records.
Eg: The JSON file that defines the keys for a module can look like this:
"key1": "value1" "key2": { "valid JSON": "here", "it": { "can": {"be": { "arbitrarily": "nested"}}} }
Modules are defined in JSON files under a config path defined in "chenile.config.path". For example module1 is defined in module1.json directly under "chenile.config.path".
These JSON values can be over-ridden in two ways in the database:
- They can be over-ridden for all "requests" whether they have a custom attribute or not (__GLOBAL__)
- They can be over-ridden for specific "requests" that have a custom attribute (eg. all requests that belong to a client "tenant0")
It is possible that no JSON file exists. All keys can be defined in the database directly without using the JSON. In that case, keys can only be defined using path as null. Subsequent records can override this record. It is assumed that DB records don't alter the same path. If they do so, the result is indeterminate.
-
allKeysForModule
-
getJsonMapForModuleFromClassPath
-
customizationAttribute
Override this in a subclass to change the default behaviour.- Returns:
- the value of custom attribute from request headers. Default implementation returns the value of the tenant ID header.
-
readModuleAsString
-
override
- Parameters:
module- the modulekey- the keyvalue- the original value either from JSON or from the first record found with path null in DBdbList- the list of all keys obtained for the module and the custom attribute.- Returns:
- the modified value after all the operations in dblist are applied against the key
-
mapExpression
-
evaluate
- Parameters:
key- the keypath- the path in the value that has been modified to a new valuevalue- the original value that will be modifieddbValue- the db value that will be applied against the original record- Returns:
- the modified value after SPEL constructs specified in the path are invoked on the original record
-
objectify
-