Package ome.services.sessions
Class SessionManagerImpl
- java.lang.Object
-
- ome.services.sessions.SessionManagerImpl
-
- All Implemented Interfaces:
java.util.EventListener,SessionManager,SessionCache.StaleCacheListener,org.springframework.beans.factory.Aware,org.springframework.context.ApplicationContextAware,org.springframework.context.ApplicationListener<org.springframework.context.ApplicationEvent>
public class SessionManagerImpl extends java.lang.Object implements SessionManager, SessionCache.StaleCacheListener, org.springframework.context.ApplicationContextAware, org.springframework.context.ApplicationListener<org.springframework.context.ApplicationEvent>
Is for ISession a cache and will be kept there in sync? OR Factors out the logic from ISession and SessionManagerI Therefore either called directly, or via synchronous messages. Uses the name of a Principal as the key to the session. We may need to limit user names to prevent this. (Strictly alphanumeric) Receives notifications as anApplicationListener, which should be used to keep theSessioninstances up-to-date.- Since:
- 3.0-Beta3
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface ome.services.sessions.SessionManager
SessionManager.CreationRequest
-
-
Field Summary
Fields Modifier and Type Field Description protected LightAdminPrivilegesadminPrivilegesprotected ome.system.PrincipalasrootA private session for use only by this instance for running methods viaExecutor.protected SessionCachecacheprotected ome.system.OmeroContextcontextprotected longdefaultTimeToIdleprotected longdefaultTimeToLiveprotected Executorexecutorprotected CounterFactoryfactorystatic java.lang.StringGROUP_SUDO_NSprotected SessionContextinternalSessionInternalSessionContextcreated duringinit()which is used for all method calls internal to the session manager (see execute* methods)protected longmaxUserTimeToIdleprotected longmaxUserTimeToLiveprotected PrincipalHolderprincipalHolderprotected booleanreadOnlyprotected ome.system.Rolesrolesprotected SessionProvidersessionProvider
-
Constructor Summary
Constructors Constructor Description SessionManagerImpl()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddCallback(java.lang.String sessionId, SessionCallback cb)intclose(java.lang.String uuid)If reference count for the session is less than 1, close the session.intcloseAll()Close all sessions with checking for the necessary reference counts.ome.model.meta.Sessioncopy(ome.model.meta.Session source)ome.model.meta.SessioncreateFromRequest(SessionManager.CreationRequest request)protected SessionContextcreateSessionContext(java.util.List<?> list, SessionContext previous)Takes a snapshot as fromexecuteSessionContextLookup(ServiceFactory, Principal, Session)and turns it into aSessionContextinstance.ome.model.meta.SharecreateShare(ome.system.Principal principal, boolean enabled, long timeToLive, java.lang.String eventType, java.lang.String description, long groupId)ome.model.meta.SessioncreateWithAgent(ome.system.Principal principal, java.lang.String agent, java.lang.String ip)ome.model.meta.SessioncreateWithAgent(ome.system.Principal _principal, java.lang.String credentials, java.lang.String agent, java.lang.String ip)protected voiddefine(ome.model.meta.Session s, java.lang.String uuid, java.lang.String message, long started, long idle, long live, java.lang.String eventType, java.lang.String agent, java.lang.String ip)protected voiddefine(ome.model.meta.Session s, java.lang.String uuid, java.lang.String message, long started, SessionManager.CreationRequest req)intdetach(java.lang.String uuid)Allows decrementing the reference count for a session without calling the actualSessionManager.close(String)logic.protected java.util.Map<java.lang.String,java.lang.Object>environment(java.lang.String session, java.lang.String env)booleanexecutePasswordCheck(java.lang.String name, java.lang.String credentials)Executes a password check using theExecutorframework.ome.model.meta.Sessionfind(java.lang.String uuid)Finds aSessionand update the last access time.ome.model.meta.SessionfindQuietly(java.lang.String uuid)Finds aSessionwithout updating the last access time.java.util.List<ome.model.meta.Session>findSameUser(java.lang.String uuid, java.lang.String... agents)Returns a non-null, possibly empty list of session instances belonging to the same user as the given session with one of the given agents.java.lang.ObjectgetCallbackObject(java.lang.String sessionId, java.lang.String name)ome.system.EventContextgetEventContext(ome.system.Principal principal)Provides a partialEventContextfor the currentSession.java.lang.ObjectgetInput(java.lang.String session, java.lang.String key)Returns the input environmentObjectstored under the given key or null if none present.java.lang.ObjectgetOutput(java.lang.String session, java.lang.String key)Returns the output environmentObjectstored under the given key or null if none present.intgetReferenceCount(java.lang.String uuid)Return the number of client which are presumed to be attached to this session or throw an exception if there's no such session.java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>>getSessionData()Return all sessions that are active with associated possibly varying session data information.SessionStatsgetSessionStats(java.lang.String uuid)Return theSessionStatswhich are being counted for the given session or throw an exception if it has been removed.java.util.List<java.lang.String>getUserRoles(java.lang.String uuid)voidinit()Initialization method called by the Spring run-time to acquire an initialSession.net.sf.ehcache.EhcacheinMemoryCache(java.lang.String uuid)Returns after possibly creating an in-memorycachewhich can be used throughout the session.java.util.Map<java.lang.String,java.lang.Object>inputEnvironment(java.lang.String session)Returns a copy of the input environment.java.lang.String[]notifications(java.lang.String sessionId)voidonApplicationEvent(org.springframework.context.ApplicationEvent event)net.sf.ehcache.EhcacheonDiskCache(java.lang.String uuid)Returns after possibly creating an on-diskcachewhich can be used throughout the session.java.util.Map<java.lang.String,java.lang.Object>outputEnvironment(java.lang.String session)Returns a copy of the output environment.voidprepareReload()ome.system.EventContextreload(java.lang.String uuid)Similar toSessionManager.getEventContext(Principal)but uses the internal reload logic to get a fresh representation of the context.SessionContextreload(SessionContext ctx)Will be called in a synchronized block bySessionCachein order to allow for an update.voidsetAdminPrivileges(LightAdminPrivileges adminPrivileges)voidsetApplicationContext(org.springframework.context.ApplicationContext applicationContext)voidsetCounterFactory(CounterFactory factory)voidsetDefaultTimeToIdle(long defaultTimeToIdle)voidsetDefaultTimeToLive(long defaultTimeToLive)voidsetExecutor(Executor executor)voidsetInput(java.lang.String session, java.lang.String key, java.lang.Object object)Places theargumentin the input environment under the given key, possibly initializing theMapThrows an exception if there is noSessionwith the given identifier.voidsetMaxUserTimeToIdle(long maxUserTimeToIdle)voidsetMaxUserTimeToLive(long maxUserTimeToLive)voidsetOutput(java.lang.String session, java.lang.String key, java.lang.Object object)Places theargumentin the output environment under the given key, possibly initializing theMapThrows an exception if there is noSessionwith the given identifier.voidsetPrincipalHolder(PrincipalHolder principal)voidsetReadOnly(ReadOnlyStatus readOnly)voidsetRoles(ome.system.Roles securityRoles)ome.model.IObjectsetSecurityContext(ome.system.Principal principal, ome.model.IObject obj)Sets the context for the current session to the given value.voidsetSessionCache(SessionCache sessionCache)voidsetSessionProvider(SessionProvider sessionProvider)voidsetUuid(java.lang.String uuid)ome.model.meta.Sessionupdate(ome.model.meta.Session session)Certain fields from theSessioninstance will be copied and then saved to the db, as well as a newSessionContextcreated.ome.model.meta.Sessionupdate(ome.model.meta.Session session, boolean trusted)Same asSessionManager.update(Session)but some security checks can be overridden.
-
-
-
Field Detail
-
GROUP_SUDO_NS
public static final java.lang.String GROUP_SUDO_NS
- See Also:
- Constant Field Values
-
context
protected ome.system.OmeroContext context
-
roles
protected ome.system.Roles roles
-
adminPrivileges
protected LightAdminPrivileges adminPrivileges
-
cache
protected SessionCache cache
-
executor
protected Executor executor
-
defaultTimeToIdle
protected long defaultTimeToIdle
-
maxUserTimeToIdle
protected long maxUserTimeToIdle
-
defaultTimeToLive
protected long defaultTimeToLive
-
maxUserTimeToLive
protected long maxUserTimeToLive
-
principalHolder
protected PrincipalHolder principalHolder
-
factory
protected CounterFactory factory
-
readOnly
protected boolean readOnly
-
sessionProvider
protected SessionProvider sessionProvider
-
asroot
protected ome.system.Principal asroot
A private session for use only by this instance for running methods viaExecutor. The name of thisPrincipalwill not be removed by calls tocloseAll().
-
internalSession
protected SessionContext internalSession
InternalSessionContextcreated duringinit()which is used for all method calls internal to the session manager (see execute* methods)
-
-
Method Detail
-
setApplicationContext
public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) throws org.springframework.beans.BeansException- Specified by:
setApplicationContextin interfaceorg.springframework.context.ApplicationContextAware- Throws:
org.springframework.beans.BeansException
-
setUuid
public void setUuid(java.lang.String uuid)
-
setSessionCache
public void setSessionCache(SessionCache sessionCache)
-
setRoles
public void setRoles(ome.system.Roles securityRoles)
-
setAdminPrivileges
public void setAdminPrivileges(LightAdminPrivileges adminPrivileges)
-
setExecutor
public void setExecutor(Executor executor)
-
setDefaultTimeToIdle
public void setDefaultTimeToIdle(long defaultTimeToIdle)
-
setMaxUserTimeToIdle
public void setMaxUserTimeToIdle(long maxUserTimeToIdle)
-
setDefaultTimeToLive
public void setDefaultTimeToLive(long defaultTimeToLive)
-
setMaxUserTimeToLive
public void setMaxUserTimeToLive(long maxUserTimeToLive)
-
setPrincipalHolder
public void setPrincipalHolder(PrincipalHolder principal)
-
setCounterFactory
public void setCounterFactory(CounterFactory factory)
-
setReadOnly
public void setReadOnly(ReadOnlyStatus readOnly)
-
setSessionProvider
public void setSessionProvider(SessionProvider sessionProvider)
-
init
public void init()
Initialization method called by the Spring run-time to acquire an initialSession.
-
define
protected void define(ome.model.meta.Session s, java.lang.String uuid, java.lang.String message, long started, SessionManager.CreationRequest req)
-
define
protected void define(ome.model.meta.Session s, java.lang.String uuid, java.lang.String message, long started, long idle, long live, java.lang.String eventType, java.lang.String agent, java.lang.String ip)
-
createFromRequest
public ome.model.meta.Session createFromRequest(SessionManager.CreationRequest request)
- Specified by:
createFromRequestin interfaceSessionManager
-
createWithAgent
public ome.model.meta.Session createWithAgent(ome.system.Principal _principal, java.lang.String credentials, java.lang.String agent, java.lang.String ip)- Specified by:
createWithAgentin interfaceSessionManager- Returns:
- Not null. Instead an exception will be thrown.
-
createWithAgent
public ome.model.meta.Session createWithAgent(ome.system.Principal principal, java.lang.String agent, java.lang.String ip)- Specified by:
createWithAgentin interfaceSessionManager- Returns:
- Not null. Instead an exception will be thrown.
-
createShare
public ome.model.meta.Share createShare(ome.system.Principal principal, boolean enabled, long timeToLive, java.lang.String eventType, java.lang.String description, long groupId)- Specified by:
createSharein interfaceSessionManager- Returns:
- Not null. Instead an exception will be thrown.
-
update
public ome.model.meta.Session update(ome.model.meta.Session session)
Description copied from interface:SessionManagerCertain fields from theSessioninstance will be copied and then saved to the db, as well as a newSessionContextcreated. This method assumes that the user is NOT an admin.- Specified by:
updatein interfaceSessionManager
-
update
public ome.model.meta.Session update(ome.model.meta.Session session, boolean trusted)Description copied from interface:SessionManagerSame asSessionManager.update(Session)but some security checks can be overridden. This is usually done by checking with theSecuritySystembut here the server is in a critical state, and instead will trust the method invoker.- Specified by:
updatein interfaceSessionManager
-
createSessionContext
protected SessionContext createSessionContext(java.util.List<?> list, SessionContext previous)
Takes a snapshot as fromexecuteSessionContextLookup(ServiceFactory, Principal, Session)and turns it into aSessionContextinstance. List argument should never be null. Abort ifexecuteSessionContextLookup(ServiceFactory, Principal, Session)returns null.
-
find
public ome.model.meta.Session find(java.lang.String uuid)
Description copied from interface:SessionManagerFinds aSessionand update the last access time.- Specified by:
findin interfaceSessionManager- Returns:
- A current session.
-
findQuietly
public ome.model.meta.Session findQuietly(java.lang.String uuid)
Description copied from interface:SessionManagerFinds aSessionwithout updating the last access time.- Specified by:
findQuietlyin interfaceSessionManager- Returns:
- A current session.
-
findSameUser
public java.util.List<ome.model.meta.Session> findSameUser(java.lang.String uuid, java.lang.String... agents)Description copied from interface:SessionManagerReturns a non-null, possibly empty list of session instances belonging to the same user as the given session with one of the given agents. Sudo is taken into account. If the agent list is empty then all are included. Anullmay be included in the list to include null agents.- Specified by:
findSameUserin interfaceSessionManager
-
getReferenceCount
public int getReferenceCount(java.lang.String uuid)
Description copied from interface:SessionManagerReturn the number of client which are presumed to be attached to this session or throw an exception if there's no such session.- Specified by:
getReferenceCountin interfaceSessionManager
-
detach
public int detach(java.lang.String uuid)
Description copied from interface:SessionManagerAllows decrementing the reference count for a session without calling the actualSessionManager.close(String)logic. This is useful when it is assumed that another user will re-attach to the same session. A timeout can still cause the session to be removed.- Specified by:
detachin interfaceSessionManager- Returns:
- See above.
-
getSessionStats
public SessionStats getSessionStats(java.lang.String uuid)
Description copied from interface:SessionManagerReturn theSessionStatswhich are being counted for the given session or throw an exception if it has been removed.- Specified by:
getSessionStatsin interfaceSessionManager
-
close
public int close(java.lang.String uuid)
Description copied from interface:SessionManagerIf reference count for the session is less than 1, close the session. Otherwise decrement the reference count. The current reference count is returned. If -1, then no such session existed. If -2, then the session was removed.- Specified by:
closein interfaceSessionManager
-
getSessionData
public java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> getSessionData()
Description copied from interface:SessionManagerReturn all sessions that are active with associated possibly varying session data information.- Specified by:
getSessionDatain interfaceSessionManager
-
closeAll
public int closeAll()
Description copied from interface:SessionManagerClose all sessions with checking for the necessary reference counts.- Specified by:
closeAllin interfaceSessionManager
-
getUserRoles
public java.util.List<java.lang.String> getUserRoles(java.lang.String uuid)
- Specified by:
getUserRolesin interfaceSessionManager
-
inMemoryCache
public net.sf.ehcache.Ehcache inMemoryCache(java.lang.String uuid)
Description copied from interface:SessionManagerReturns after possibly creating an in-memorycachewhich can be used throughout the session. On close, the cache will be disposed.- Specified by:
inMemoryCachein interfaceSessionManager
-
onDiskCache
public net.sf.ehcache.Ehcache onDiskCache(java.lang.String uuid)
Description copied from interface:SessionManagerReturns after possibly creating an on-diskcachewhich can be used throughout the session. On close, the cache will be disposed.- Specified by:
onDiskCachein interfaceSessionManager
-
getInput
public java.lang.Object getInput(java.lang.String session, java.lang.String key) throws ome.conditions.RemovedSessionExceptionDescription copied from interface:SessionManagerReturns the input environmentObjectstored under the given key or null if none present. Throws an exception if there is noSessionwith the given identifier.- Specified by:
getInputin interfaceSessionManager- Parameters:
session- Not null.key- Not null.- Returns:
- Possibly null.
- Throws:
ome.conditions.RemovedSessionException
-
getOutput
public java.lang.Object getOutput(java.lang.String session, java.lang.String key) throws ome.conditions.RemovedSessionExceptionDescription copied from interface:SessionManagerReturns the output environmentObjectstored under the given key or null if none present. Throws an exception if there is noSessionwith the given identifier.- Specified by:
getOutputin interfaceSessionManager- Parameters:
session- Not null.key- Not null.- Returns:
- Possibly null.
- Throws:
ome.conditions.RemovedSessionException
-
inputEnvironment
public java.util.Map<java.lang.String,java.lang.Object> inputEnvironment(java.lang.String session)
Description copied from interface:SessionManagerReturns a copy of the input environment.- Specified by:
inputEnvironmentin interfaceSessionManager- Parameters:
session- The session id.- Returns:
- Not null
-
outputEnvironment
public java.util.Map<java.lang.String,java.lang.Object> outputEnvironment(java.lang.String session)
Description copied from interface:SessionManagerReturns a copy of the output environment.- Specified by:
outputEnvironmentin interfaceSessionManager- Parameters:
session- The session id.- Returns:
- Not null.
-
environment
protected java.util.Map<java.lang.String,java.lang.Object> environment(java.lang.String session, java.lang.String env)
-
setInput
public void setInput(java.lang.String session, java.lang.String key, java.lang.Object object) throws ome.conditions.RemovedSessionExceptionDescription copied from interface:SessionManagerPlaces theargumentin the input environment under the given key, possibly initializing theMapThrows an exception if there is noSessionwith the given identifier.- Specified by:
setInputin interfaceSessionManager- Parameters:
session- Not null.key- Not null.object- If null, key will be removed.- Throws:
ome.conditions.RemovedSessionException
-
setOutput
public void setOutput(java.lang.String session, java.lang.String key, java.lang.Object object) throws ome.conditions.RemovedSessionExceptionDescription copied from interface:SessionManagerPlaces theargumentin the output environment under the given key, possibly initializing theMapThrows an exception if there is noSessionwith the given identifier.- Specified by:
setOutputin interfaceSessionManager- Parameters:
session- Not null.key- Not null.object- If null, key will be removed.- Throws:
ome.conditions.RemovedSessionException
-
getEventContext
public ome.system.EventContext getEventContext(ome.system.Principal principal)
Description copied from interface:SessionManagerProvides a partialEventContextfor the currentSession.- Specified by:
getEventContextin interfaceSessionManager- Parameters:
principal- Non null.- Returns:
- Never null.
-
reload
public ome.system.EventContext reload(java.lang.String uuid)
Description copied from interface:SessionManagerSimilar toSessionManager.getEventContext(Principal)but uses the internal reload logic to get a fresh representation of the context. This queries all of the user management tables (experimenter, experimentergroup, etc) and so should not be used anywhere in a critical path.- Specified by:
reloadin interfaceSessionManager- Parameters:
uuid- non null.- Returns:
- See above.
-
notifications
public java.lang.String[] notifications(java.lang.String sessionId)
-
onApplicationEvent
public void onApplicationEvent(org.springframework.context.ApplicationEvent event)
- Specified by:
onApplicationEventin interfaceorg.springframework.context.ApplicationListener<org.springframework.context.ApplicationEvent>
-
addCallback
public void addCallback(java.lang.String sessionId, SessionCallback cb)
-
getCallbackObject
public java.lang.Object getCallbackObject(java.lang.String sessionId, java.lang.String name)
-
copy
public ome.model.meta.Session copy(ome.model.meta.Session source)
-
prepareReload
public void prepareReload()
-
reload
public SessionContext reload(SessionContext ctx)
Will be called in a synchronized block bySessionCachein order to allow for an update.- Specified by:
reloadin interfaceSessionCache.StaleCacheListener
-
executePasswordCheck
public boolean executePasswordCheck(java.lang.String name, java.lang.String credentials)Description copied from interface:SessionManagerExecutes a password check using theExecutorframework. Also checks the credentials against current session uuids.- Specified by:
executePasswordCheckin interfaceSessionManager- Returns:
- See above.
-
setSecurityContext
public ome.model.IObject setSecurityContext(ome.system.Principal principal, ome.model.IObject obj)Description copied from interface:SessionManagerSets the context for the current session to the given value. If it is anExperimenterGroupthen the active group is changed, and any active shares are deactivated. If it is anSharethen the share is activate (the group is left alone). Unless otherwise specified, the user's default group is used as the initial context. Passing any other object will result in anApiUsageException.- Specified by:
setSecurityContextin interfaceSessionManager- Parameters:
principal-Principalfor which the context should be set.obj-IObjectwhich represents the new context.- Returns:
- See above.
-
-