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(); } if (notes == null){ notes = new ConcurrentHashMap(); } 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); } }