utils.lua 3.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
local _G = require "_G"
local tostring = _G.tostring
local type = _G.type

local io = require "io"
local stderr = io.stderr

local proto = require "loop.proto"
local clone = proto.clone

local openbus = require "openbus"
local sleep = openbus.sleep

local except = require "openbus.util.except"
local repid = except.repid
local minor = except.minor

require "openbus.util.messages"



22 23 24 25 26 27 28 29 30 31 32
local errmsg = {
  BusCore = {
    [repid.ServiceFailure]
      = "falha severa no barramento em $bushost:$busport ($message)",
    [repid.TRANSIENT]
      = "o barramento em $bushost:$busport está inacessível no momento",
    [repid.COMM_FAILURE]
      = "falha de comunicação ao acessar serviços núcleo do barramento",
    [repid.NO_PERMISSION] = {
      [minor.NoLogin]
        = "não há um login de $entity válido no momento",
33
    },
34
  },
35 36
  LoginByPassword = {
    [repid.AccessDenied]
37
      = "a senha fornecida para a entidade $entity foi negada ($message)",
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
  },
  LoginByCertificate = {
    [repid.AccessDenied]
      = "a chave em $privatekeypath não corresponde ao certificado da "..
        "entidade $entity",
    [repid.MissingCertificate]
      = "a entidade $entity não possui um certificado registrado",
  },
  Register = {
    [repid.UnauthorizedFacets]
      = "a entidade $entity não foi autorizada pelo administrador do "..
        "barramento a ofertar serviços que implementem a interface $interface",
  },
  Service = {
    [repid.TRANSIENT]
      = "o serviço encontrado está inacessível",
    [repid.COMM_FAILURE]
      = "falha de comunicação com o serviço encontrado",
    [repid.NO_PERMISSION] = {
      [minor.NoLogin]
        = "não há um login de $entity válido no momento",
      [minor.UnknownBus]
        = "o serviço encontrado não está mais logado ao barramento",
      [minor.UnverifiedLogin]
        = "o serviço encontrado não foi capaz de validar a chamada",
      [minor.InvalidRemote]
        = "integração do serviço encontrado com o barramento está incorreta",
    }
  },
67 68
}

69
local function showerror(errmsg, params, ...)
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
  local repid = errmsg._repid
  for index = 1, select("#", ...) do
    local expected = select(index, ...)
    local message = expected[repid]
    if message ~= nil then
      if type(message) == "table" then
        message = message[errmsg.minor]
      end
      if message ~= nil then
        errmsg = message:tag(clone(errmsg, params))
        setmetatable(params, nil)
      end
      break
    end
  end
  stderr:write(tostring(errmsg), "\n")
end

88 89
local module = { errmsg = errmsg, showerror = showerror }

90 91 92 93 94 95 96 97
function module.getprop(offer, name)
  for _, property in ipairs(offer.properties) do
    if property.name == name then
      return property.value
    end
  end
end

98 99 100 101 102 103 104 105 106 107 108 109 110 111
function module.failureObserver(params)
  local observer = {}
  function observer:onLoginFailure(assistent, exception)
    showerror(exception, params, errmsg["LoginBy"..assistent:loginargs()], errmsg.BusCore)
  end
  function observer:onOfferFailure(assistent, exception)
    showerror(exception, params, errmsg.Register, errmsg.BusCore)
  end
  function observer:onFindFailure(assistent, exception)
    showerror(exception, params, errmsg.BusCore)
  end
  return observer
end

112
return module