package org.eclipse.scout.rt.server;

import org.eclipse.scout.commons.AbstractDynamicHashMap;

class VirtualSessionCache extends AbstractDynamicHashMap<String, IServerSession> {
  private static final long serialVersionUID = 1L;

  private long m_sessionTimeoutMillis = 300000L;//default 5 minutes
  private long m_nextMaintenance = 0L;//default 5 minutes

  public long getSessionTimeoutMillis() {
    return m_sessionTimeoutMillis;
  }

  public void setSessionTimeoutMillis(long sessionTimeoutMillis) {
    m_sessionTimeoutMillis = sessionTimeoutMillis;
  }

  @Override
  protected void beforeAccessToInternalMap() {
    if (System.currentTimeMillis() > m_nextMaintenance) {
      validateInternalMap();
      m_nextMaintenance = System.currentTimeMillis() + m_sessionTimeoutMillis / 2;
    }
  }

  @Override
  protected DynamicEntry<IServerSession> createDynamicEntry(IServerSession value) {
    return new VirtualSessionEntry(value, getSessionTimeoutMillis());
  }

  @Override
  protected boolean isEntryValid(DynamicEntry e) {
    VirtualSessionEntry v = (VirtualSessionEntry) e;
    return v.getTimestamp() + v.getInactivityTimeout() >= System.currentTimeMillis();
  }

  static class VirtualSessionEntry extends DynamicEntry<IServerSession> {
    private long m_time;
    private long m_timeout;

    public VirtualSessionEntry(IServerSession value, long timeout) {
      super(value);
      m_timeout = timeout;
      m_time = System.currentTimeMillis();
    }

    public long getTimestamp() {
      return m_time;
    }

    public long getInactivityTimeout() {
      return m_timeout;
    }

    @Override
    public void touch() {
      m_time = System.currentTimeMillis();
    }

  }
}
