X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsamples%2Fclustersession%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustersession%2FClusterSessionManager.java;fp=opendaylight%2Fsamples%2Fclustersession%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustersession%2FClusterSessionManager.java;h=e285bb4f158d18b88895f8a23bbab41e203154c0;hp=0000000000000000000000000000000000000000;hb=bb8e483729cee2950c8394751e21f87812aec48d;hpb=f2a95080b262418d109d7f1151cf3d9d3aae6237;ds=sidebyside diff --git a/opendaylight/samples/clustersession/src/main/java/org/opendaylight/controller/clustersession/ClusterSessionManager.java b/opendaylight/samples/clustersession/src/main/java/org/opendaylight/controller/clustersession/ClusterSessionManager.java new file mode 100644 index 0000000000..e285bb4f15 --- /dev/null +++ b/opendaylight/samples/clustersession/src/main/java/org/opendaylight/controller/clustersession/ClusterSessionManager.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + */ +package org.opendaylight.controller.clustersession; + +import java.io.IOException; +import java.util.HashMap; + +import org.apache.catalina.LifecycleException; +import org.apache.catalina.LifecycleState; +import org.apache.catalina.Session; +import org.apache.catalina.session.ManagerBase; +import org.apache.catalina.util.SessionIdGenerator; +import org.opendaylight.controller.clustersession.impl.ClusterSessionServiceImpl; +import org.opendaylight.controller.clustersession.service.ClusterSessionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +/** + * ClusterSession Manager is a custom session manager, that is used to persist session data + * across cluster of a storage such as infinispan or memcache + * @author harman singh + * + */ +public class ClusterSessionManager extends ManagerBase{ + /** + * Has this component been _started yet? + */ + protected boolean started = false; + + protected ClusterSessionService sessionService; + + private static final Logger LOGGER = LoggerFactory.getLogger(ClusterSessionManager.class); + /** + * The descriptive information about this implementation. + */ + protected static final String INFO = "ClusterSessionManager/1.0"; + + /** + * The descriptive name of this Manager implementation (for logging). + */ + protected static final String NAME = "ClusterSessionManager"; + + public ClusterSessionManager(){ + sessionService = new ClusterSessionServiceImpl(this); + } + + /** + * Return descriptive information about this Manager implementation and + * the corresponding version number, in the format + * <description>/<version>. + */ + @Override + public String getInfo(){ + return INFO; + } + + /** + * Return the descriptive short name of this Manager implementation. + */ + @Override + public String getName(){ + return NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public void load() throws ClassNotFoundException, IOException { + // We are not persisting any session in database, infinispan does not persist data. + // loading of persisted session is not required. + } + + /** + * {@inheritDoc} + */ + @Override + public void unload() throws IOException { + // We are not persisting any session in database, infinispan does not persist data. + // unloading of session to persistence layer is not required. + } + + /** + * Start this component and implement the requirements + * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}. + * + * @exception LifecycleException if this component detects a fatal error + * that prevents this component from being used + */ + @Override + protected synchronized void startInternal() throws LifecycleException { + sessionIdGenerator = new SessionIdGenerator(); + sessionIdGenerator.setJvmRoute(getJvmRoute()); + sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); + sessionIdGenerator.setSecureRandomClass(getSecureRandomClass()); + sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider()); + sessionIdGenerator.setSessionIdLength(getSessionIdLength()); + sessionService.startInternal(sessionIdGenerator); + setState(LifecycleState.STARTING); + } + + /** + * Stop this component and implement the requirements + * of {@link org.apache.catalina.util.LifecycleBase#stopInternal()}. + * + * @exception LifecycleException if this component detects a fatal error + * that prevents this component from being used + */ + @Override + protected synchronized void stopInternal() throws LifecycleException { + setState(LifecycleState.STOPPING); + + // Expire all active sessions + Session sessions[] = findSessions(); + for (int i = 0; i < sessions.length; i++) { + Session session = sessions[i]; + try { + if (session.isValid()) { + session.expire(); + } + } catch (Exception e) { + LOGGER.warn(e.toString()); + } finally { + // Measure against memory leaking if references to the session + // object are kept in a shared field somewhere + session.recycle(); + } + } + // Require a new random number generator if we are restarted + super.stopInternal(); + sessionService.stopInternal(); + } + + /** + * {@inheritDoc} + */ + @Override + public void expireSession(final String sessionId){ + LOGGER.debug("SESSION EXPIRE : ", sessionId); + sessionService.expireSession(sessionId); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove(final Session session){ + LOGGER.debug("SESSION REMOVE : ", session.getId()); + sessionService.removeSession(session.getId()); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove(Session session, boolean update) { + sessionService.removeSession(session.getId()); + } + + /** + * {@inheritDoc} + */ + @Override + public Session findSession(final String id) throws IOException{ + return sessionService.findSession(id); + } + + /** + * {@inheritDoc} + */ + @Override + public Session createSession(final String sessionId){ + LOGGER.debug("SESSION CREATE : ", sessionId); + if(sessionId != null){ + Session session = sessionService.findSession(sessionId); + if(session != null){ + return session; + } + } + return sessionService.createSession(sessionId); + } + + /** + * {@inheritDoc} + */ + @Override + public Session createEmptySession(){ + return sessionService.createEmptySession(); + } + /** + * {@inheritDoc} + */ + @Override + public void add(Session session){ + LOGGER.debug("SESSION ADD : ", session.getId()); + sessionService.addSession((ClusterSession)session); + } + /** + * {@inheritDoc} + */ + @Override + public HashMap getSession(String sessionId){ + return sessionService.getSession(sessionId); + } + /** + * {@inheritDoc} + */ + @Override + public Session[] findSessions() { + return sessionService.findSessions(); + } + + public ClusterSessionService getSessionService() { + return sessionService; + } + + public void setSessionService(ClusterSessionService sessionService) { + this.sessionService = sessionService; + } + +}