tomcat Session manager to support clustering using infinispan
[controller.git] / opendaylight / samples / clustersession / src / main / java / org / opendaylight / controller / clustersession / ClusterSession.java
diff --git a/opendaylight/samples/clustersession/src/main/java/org/opendaylight/controller/clustersession/ClusterSession.java b/opendaylight/samples/clustersession/src/main/java/org/opendaylight/controller/clustersession/ClusterSession.java
new file mode 100644 (file)
index 0000000..dc93700
--- /dev/null
@@ -0,0 +1,162 @@
+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);
+   }
+}