package org.japanosample;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.japano.util.Util;

/**
 Sample Session implementation.
 
 All sessions must be derived from {@link org.japano.servlet.Session}.
 The session class to be used must be set as servlet init parameter.
 in /WEB-INF/web.xml
   
 @author  Sven Helmberger ( sven dot helmberger at gmx dot de )
 @version $Id: SampleSession.java,v 1.3 2005/08/23 23:56:04 fforw Exp $
 */
public class SampleSession extends org.japano.Session
{  
  /** Number changed by the increment and decrement action */
  private int number=0;
      
  /**
   * User logged in to this session or <code>null</code>.
   */
  private User user;
  
  /**
   Accessor for the stored Number
   @return Value of property result.
   */
  public int getNumber()
  {
    return this.number;
  }
  
  /**
   Mutator for the stored Number
   @param number New value of property result.
   */
  public void setNumber(int number)
  {
    this.number=number;
  }    
  
  public void logout()
  {
    user=null;
    setAttribute("user", user);
  }
  
  public synchronized boolean login(String email, String password) 
  {
    String hash=Util.getSHADigest( password);
    
    for (Iterator i=User.USERS.iterator(); i.hasNext(); )
    {
      User u=(User)i.next();
      if ( u.getEMail().equals( email) &&  
           u.getPasswordHash().equals(hash))
      {
        
        this.user=u;
        setAttribute("user", this.user);
        return true;
      }
    }
    this.user=null;
    setAttribute("user", null);
    return false;
  }
  
  /**
   * Returns the user logged in to the session or <code>null</code>.
   * @return User
   */
  public synchronized User getUser()
  {
    return this.user;
  }        
  
  public static Collection sessions()
  {
    return new ArrayList(allSessions.values());
  }

  public void access()
  {
    super.access();
    
    long lastUserRest=User.getLastReset();
    long now=System.currentTimeMillis();
    // last user reset more than an hour ago?
    if (now-lastUserRest > User.RESET_INTERVAL)
    { // yes -> user reset
      User.reset();      
      // refresh users in session
      synchronized (allSessions)
      {
        for (Iterator i=allSessions.values().iterator(); i.hasNext(); )
        {
          SampleSession s=(SampleSession)i.next();
          synchronized(s)
          { 
            if (s.user != null)
            {
              s.user=User.fromId(s.user.getId());
            }
          }
        }
      }      
    }
  }  
}