--- /dev/null
+package org.opendaylight.controller.clustersession;
+
+import java.beans.PropertyChangeSupport;
+import java.io.Serializable;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.catalina.Manager;
+import org.apache.catalina.SessionListener;
+import org.apache.catalina.session.StandardSession;
+import org.opendaylight.controller.clustersession.service.ClusterSessionService;
+
+public class ClusterSession extends StandardSession implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private transient ClusterSessionService sessionService;
+
+ public ClusterSession(Manager manager, ClusterSessionService sessionService) {
+ super(manager);
+ this.sessionService = sessionService;
+ }
+
+ public void setSessionService(ClusterSessionService sessionService){
+ this.sessionService = sessionService;
+ }
+
+ @Override
+ public void setAuthType(String authType) {
+ super.setAuthType(authType);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setCreationTime(long time) {
+ super.setCreationTime(time);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setMaxInactiveInterval(int interval) {
+ super.setMaxInactiveInterval(interval);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setNew(boolean isNew) {
+ super.setNew(isNew);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setPrincipal(Principal principal) {
+ super.setPrincipal(principal);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setValid(boolean isValid) {
+ super.setValid(isValid);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void access() {
+ super.access();
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void endAccess() {
+ super.endAccess();
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void removeAttribute(String name, boolean notify) {
+ super.removeAttribute(name, notify);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setAttribute(String name, Object value, boolean notify) {
+ super.setAttribute(name, value, notify);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void recycle() {
+ super.recycle();
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void removeNote(String name) {
+ super.removeNote(name);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void addSessionListener(SessionListener listener) {
+ super.addSessionListener(listener);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void removeSessionListener(SessionListener listener) {
+ super.removeSessionListener(listener);
+ sessionService.updateSession(this);
+ }
+
+ @Override
+ public void setNote(String name, Object value) {
+ super.setNote(name, value);
+ sessionService.updateSession(this);
+ }
+
+ /*
+ * Certain fields inside Standard session are not serialized, We need to process them here
+ */
+ public void afterDeserialization(){
+ if (listeners == null){
+ listeners = new ArrayList<SessionListener>();
+ }
+ if (notes == null){
+ notes = new ConcurrentHashMap<String, Object>();
+ }
+ if(support == null){
+ support = new PropertyChangeSupport(this);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("ClusterSession[");
+ sb.append(id);
+ sb.append(", isNew : ");
+ sb.append(isNew);
+ sb.append(", isValid : ");
+ sb.append(isValid);
+ sb.append("]");
+ return sb.toString();
+ }
+
+ /*
+ * These methods are added for deserialization purpose
+ */
+
+ public void setAuthTypeInternal(String authType){
+ this.authType = authType;
+ }
+
+ public void setPrincipalInternal(Principal principal){
+ this.principal = principal;
+ }
+
+ public void setNoteInternal(String name, Object value) {
+ notes.put(name, value);
+ }
+}