Files
EWF/draft/application/cms/src/kernel/cms_session_controler.e
Jocelyn Fiat ce469b6ede Updated CMS code.
Separated code to have a lib and an example.
Improved design, fixed a few issues related to folder location.

This is still experimental and require more work to be really friendly to use.
2013-01-31 15:33:24 +01:00

135 lines
2.7 KiB
Plaintext

note
description: "[
Summary description for CMS_SESSION_CONTROLER.
]"
date: "$Date$"
revision: "$Revision$"
class
CMS_SESSION_CONTROLER
inherit
ANY
WSF_SESSION_FACTORY [WSF_SESSION]
create
make
feature -- Initialization
make (req: WSF_REQUEST; a_mngr: like session_manager)
do
session_manager := a_mngr
initialize
create discarded_sessions.make
get_session (req)
end
initialize
do
end
feature -- Session access
session: WSF_SESSION
has_pending_session: BOOLEAN
discarded_sessions: LINKED_LIST [like session]
feature -- Session operation
session_commit (page: CMS_HTML_PAGE_RESPONSE; e: CMS_EXECUTION)
do
if has_pending_session then
session.apply_to (page.header, e.request, e.request.script_url ("/"))
end
session.commit
end
apply_sessions_to (h: HTTP_HEADER; req: WSF_REQUEST; a_path: detachable READABLE_STRING_8)
do
session.apply_to (h, req, a_path)
across
discarded_sessions as c
loop
c.item.apply_to (h, req, a_path)
end
end
start_session (req: WSF_REQUEST)
-- Start a new session
local
s: like session
do
close_session (req)
s := new_session (req, False, session_manager)
req.set_execution_variable (session_request_variable_name, s)
session := s
if s.is_pending then
has_pending_session := True
end
ensure
session_attached: session /= Void
end
get_session (req: WSF_REQUEST)
-- Get existing session, or start a new one
local
s: like session
do
if attached {like session} req.execution_variable (session_request_variable_name) as r_session then
session := r_session
else
s := new_session (req, True, session_manager)
-- create {CMS_SESSION} s.make (req, "_EWF_CMS_SESSID")
if s.is_pending then
has_pending_session := True
end
session := s
req.set_execution_variable (session_request_variable_name, s)
end
if session.expired then
start_session (req)
end
end
close_session (req: WSF_REQUEST)
-- Close `session' if any
do
if session.is_pending then
has_pending_session := has_pending_session or not discarded_sessions.is_empty
else
has_pending_session := True
discarded_sessions.extend (session)
end
session.destroy
end
feature -- Session internal
session_manager: WSF_SESSION_MANAGER
new_session (req: WSF_REQUEST; a_reuse: BOOLEAN; m: WSF_SESSION_MANAGER): like session
local
s: CMS_SESSION
dt: DATE_TIME
do
if a_reuse then
create s.make (req, session_id_name, m)
else
create s.make_new (session_id_name, m)
create dt.make_now_utc
dt.day_add (31)
s.set_expiration (dt)
end
Result := s
end
session_request_variable_name: STRING = "_EWF_CMS_SESSION_"
session_id_name: STRING = "_EWF_CMS_SESSID"
end