120 lines
5.2 KiB
Lua

--------------------------------------------------------------------------------
------------------------------ ##### ## ------------------------------
------------------------------ ## ## # ## ------------------------------
------------------------------ ## ## ## ## ------------------------------
------------------------------ ## ## # ## ------------------------------
------------------------------ ##### ### ###### ------------------------------
-------------------------------- --------------------------------
----------------------- An Object Request Broker in Lua ------------------------
--------------------------------------------------------------------------------
-- Project: OiL - ORB in Lua: An Object Request Broker in Lua --
-- Release: 0.4 --
-- Title : Request Acceptor --
-- Authors: Renato Maia <maia@inf.puc-rio.br> --
--------------------------------------------------------------------------------
-- acceptor:Facet
-- configs:table, [except:table] setup([configs:table])
-- success:boolean, [except:table] hasrequest(configs:table)
-- success:boolean, [except:table] acceptone(configs:table)
-- success:boolean, [except:table] acceptall(configs:table)
-- success:boolean, [except:table] halt(configs:table)
--
-- listener:Receptacle
-- configs:table default([configs:table])
-- channel:object, [except:table] getchannel(configs:table)
-- success:boolean, [except:table] disposechannels(configs:table)
-- success:boolean, [except:table] disposechannel(channel:object)
-- request:table, [except:table] = getrequest(channel:object, [probe:boolean])
-- success:booelan, [except:table] = sendreply(channel:object, request:table, success:booelan, results...)
--
-- dispatcher:Receptacle
-- success:boolean, [except:table]|results... dispatch(objectkey:string, operation:string|function, params...)
--------------------------------------------------------------------------------
local oo = require "oil.oo"
local Exception = require "oil.Exception" --[[VERBOSE]] local verbose = require "oil.verbose"
module("oil.kernel.base.Receiver", oo.class)
context = false
--------------------------------------------------------------------------------
function setup(self, channelinfo)
return self.context.listener:default(channelinfo)
end
function hasrequest(self, channelinfo)
return self.context.listener:getchannel(channelinfo, true)
end
function acceptone(self, channelinfo) --[[VERBOSE]] verbose:acceptor(true, "accept one request from channel ",channelinfo)
local context = self.context
local listener = context.listener
local result, except
result, except = listener:getchannel(channelinfo)
if result then
local channel = result
result, except = listener:getrequest(channel, true)
channel:release()
if result then --[[VERBOSE]] verbose:acceptor(true, "dispatching request from accepted channel")
local dispatcher = context.dispatcher
result, except = listener:sendreply(channel, result,
dispatcher:dispatch(result.object_key,
result.operation,
result.opimpl,
result:params())
) --[[VERBOSE]] verbose:acceptor(false)
end
end
if except and except.reason == "closed" then
result, except = false, nil
end --[[VERBOSE]] verbose:acceptor(false)
return result, except
end
function acceptall(self, channelinfo) --[[VERBOSE]] verbose:acceptor(true, "accept all requests from channel ",channelinfo)
local context = self.context
local listener = context.listener
local result, except
self[channelinfo] = true
repeat
result, except = listener:getchannel(channelinfo)
if result then
local channel = result
result, except = listener:getrequest(channel)
channel:release()
if result then --[[VERBOSE]] verbose:acceptor "dispatching request from accepted channel"
local dispatcher = context.dispatcher
result, except = listener:sendreply(channel, result,
dispatcher:dispatch(result.object_key,
result.operation,
result.opimpl,
result:params())
)
end
end
if not self[channelinfo] then
if not result and except.reason == "closed" then
result, except = true, nil
end
break
end
until not result and except.reason ~= "closed" --[[VERBOSE]] verbose:acceptor(false)
return result, except
end
function halt(self, channelinfo) --[[VERBOSE]] verbose:acceptor "halt acceptor"
if self[channelinfo] then
self[channelinfo] = nil
return self.context.listener:disposechannels(channelinfo)
else
return nil, Exception{
reason = "halt",
message = "channels not being accepted",
channels = channelinfo,
}
end
end