Commit 5a90bebf authored by Renato Figueiro Maia's avatar Renato Figueiro Maia

[OPENBUS-2741] Permitir usar a propriedade de configuração 'configs' no...

[OPENBUS-2741] Permitir usar a propriedade de configuração 'configs' no arquivo de configuração do barramento. 
- Ajuste para que os parâmetros definidos no arquivo sobreescrevam os anteriores.
- AJuste para que parâmetros que podem ter múltiplos valores possam aparecer mais de uma vez no arquivo de configuração ao invés de uma única vez recebendo uma tabela (essa forma continua válida, mas deprecada).


git-svn-id: https://subversion.tecgraf.puc-rio.br/engdist/openbus/sdk/lua/branches/02_00_00@161247 ae0415b3-e90b-0410-900d-d0be9363c56b
parent 7de2ee6c
......@@ -45,12 +45,6 @@ local module = {}
local SafeEnv = { __index = newsandbox() }
local function defaultAdd(list, value)
list[#list+1] = tostring(value)
end
function module.setuplog(log, level, path, mode)
log:level(level)
if path ~= nil and path ~= "" then
......@@ -190,83 +184,83 @@ module.ConfigArgs = class({
_norepeat = "parmetro '%s' s pode ser definido uma vez",
}, Arguments)
local function processlist(path, name, list, func, ...)
for index, value in ipairs(list) do
local itemname = name.."["..index.."]"
local kind = type(value)
if kind == "string" then
local errmsg = func(append(tostring(value), ...))
if errmsg ~= nil then
log:misconfig(msg.BadParamListInConfigFile:tag{
configname = itemname,
index = index,
path = path,
error = errmsg,
})
end
else
log:misconfig(msg.BadParamTypeInConfigFile:tag{
configname = itemname,
path = path,
expected = "string",
actual = kind,
})
end
end
local function defaultAdd(list, value)
list[#list+1] = tostring(value)
end
local function addtolist(self, field, value)
local list = self[field]
list[#list+1] = value
end
local SafeEnv = { __index = newsandbox() }
local MultipleKind = {
["function"] = true,
["table"] = true,
}
function module.ConfigArgs:configs(_, path)
local sandbox = setmetatable({}, SafeEnv)
local result, errmsg = loadfile(path, "t", sandbox)
if result ~= nil then
result, errmsg = xpcall(result, traceback)
if result then
for name, value in pairs(sandbox) do
local kind = type(self[name])
if kind == "nil" then
log:misconfig(msg.BadParamInConfigFile:tag{
configname = name,
path = path,
})
self[name] = value
else
local valkind = type(value)
if kind == "function" then
if valkind == "string" then
local errmsg = self[name](self, name, value)
if errmsg ~= nil then
log:misconfig(msg.BadParamInConfigFile:tag{
configname = name,
path = path,
error = errmsg,
})
end
elseif valkind == "table" then
processlist(path, name, value, self[name], self, name)
local interceptor = setmetatable({}, {
__index = sandbox,
__newindex = function (_, name, value)
sandbox[name] = value
local current = self[name]
local kind = type(current)
if kind == "nil" then
log:misconfig(msg.BadParamInConfigFile:tag{
configname = name,
path = path,
})
self[name] = value
else
local multiple = MultipleKind[kind]
local expected = multiple and "string" or kind
local valkind = type(value)
if kind == "table" and valkind == "table" then -- this use is deprecated
local list = self[name]
local add = list.add or defaultAdd
for index, value in ipairs(value) do
local kind = type(value)
if kind == "string" then
add(list, value)
else
log:misconfig(msg.BadParamTypeInConfigFile:tag{
configname = name,
configname = name.."["..index.."]",
path = path,
expected = "string|table",
actual = valkind,
expected = "string",
actual = kind,
})
end
elseif kind ~= valkind then
log:misconfig(msg.BadParamTypeInConfigFile:tag{
end
elseif valkind ~= expected then
log:misconfig(msg.BadParamTypeInConfigFile:tag{
configname = name,
path = path,
expected = expected,
actual = valkind,
})
elseif multiple then
local func = (kind == "function") and current or addtolist
local errmsg = func(self, name, value)
if errmsg ~= nil then
log:misconfig(msg.BadParamInConfigFile:tag{
configname = name,
path = path,
expected = kind,
actual = valkind,
error = errmsg,
})
elseif kind == "table" then
local list = self[name]
local add = list.add or defaultAdd
processlist(path, name, value, add, list)
else
self[name] = value
end
else
self[name] = value
end
end
end,
})
local result, errmsg = loadfile(path, "t", interceptor)
if result ~= nil then
result, errmsg = xpcall(result, traceback)
if result then
log:config(msg.ConfigFileLoaded:tag{path=path})
else
log:misconfig(msg.UnableToLoadConfigFile:tag{path=path,errmsg=errmsg})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment