nimakro
04/02/2017, 2:05 PMconfig
helper, this is what my first draft is looking like, I am open for any improvement suggestions or criticism.
In my opinion we should have the concept of component wide settings and system wide settings (which don't use the java.preferences
) and store them as json ( to allow hierarchical data structures).
My first draft:
// Defines the config context
enum class Context {
LOCAL,
SYSTEM
}
// The the default configBasePath is Paths.get("conf") but can be changed by overriding
// the path variable in App like so:
class MyApp : App(MyView::class) {
override val configBase = Paths.get("custom-folder")
// The system path has to be a relative path since it will wie placed beneath configBase
// If you don't override val system the system settings will be stored under
// configBase/system.properties
override val system = Paths.get("system")
}
class MyView : View() {
// All configs are stored under configBase;
// The LOCAL context contains all the component depending configurations
// config_base_path default is conf inside the current program folder.
config(context: Context = LOCAL) {
// ...
}
// The default context path is configBase/javaClass.name + ".properties"
// So you can write the following to save to the component config
config {
set("username" to "user")
set("password" to "pwd")
}
// The SYSTEM context contains all system wide configurations und configBase/system
// The SYSTEM context can by changed by overriding the system Path variable
config(SYSTEM) {
set("username" to "user")
set("password" to "pwd")
set("window") to jsonObject {
set("x" to 30.0)
set("y" to 40.0)
set("list" to jsonArray(2, 3, 4))
}
}
config(LOCAL) {
val usr = string("username")
val pwd = string("password")
}
config(SYSTEM) {
val usr = string("username")
val pwd = string("password")
val x = double("x", 50.0)
// We allow jsonPath to retrieve elements.
val windowX = double("windwo.x")
val listFirst = double("windwo.list[0]")
}
}