/*
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * ****************************************
 * This class was extended by Thomas Dorner
 * ****************************************
 * 
 */

package com.tsystems.epdm.pdmwebconnector.control;

import org.apache.axis.session.Session;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Enumeration;

/**
 * An HTTP/Servlet implementation of Axis sessions.
 *
 * @author Glen Daniels (gdaniels@apache.org)
 */
public class AxisHttpSession implements Session
{
	public static final String AXIS_SESSION_MARKER = "axis.isAxisSession";
    
	private HttpSession rep;
	private HttpServletRequest req;

    
	public AxisHttpSession(HttpServletRequest realRequest, int defaultSessionTimeout)
	{
		req = realRequest;
		this.set("firstAccessTime", new Long (System.currentTimeMillis()));
		this.set("defaultSessionTimeout", new Integer(defaultSessionTimeout));
		this.setTimeout(defaultSessionTimeout);
	}
    
	public AxisHttpSession(HttpSession realSession, int defaultSessionTimeout)
	{
		if (realSession != null){
			setRep(realSession);
		}
					
		this.set("firstAccessTime", new Long (System.currentTimeMillis()));
		this.set("defaultSessionTimeout", new Integer(defaultSessionTimeout));
		this.setTimeout(defaultSessionTimeout);
	}
    
	/** Get the internal HttpSession.
	 */
	public HttpSession getRep()
	{
		ensureSession();
		return rep;
	}
    
	/** Set our internal HttpSession to the passed
	 * servlet HttpSession.  Not sure if we'll really
	 * need this method...
	 */
	private void setRep(HttpSession realSession)
	{
		rep = realSession;
		rep.setAttribute(AXIS_SESSION_MARKER, Boolean.TRUE);
	}
    
	/** Get a property from the session
	 *
	 * @param key the name of the property desired.
	 */
	public Object get(String key)
	{
		ensureSession();
		return rep.getAttribute(key);
	}
    
	/** Set a property in the session
	 *
	 * @param key the name of the property to set.
	 * @param value the value of the property.
	 */
	public void set(String key, Object value)
	{
		ensureSession();
		rep.setAttribute(key, value);
	}
    
	/** Remove a property from the session
	 *
	 * @param key the name of the property desired.
	 */
	public void remove(String key)
	{
		ensureSession();
		rep.removeAttribute(key);
	}

	/**
	 * Get an enumeration of the keys in this session
	 */
	public Enumeration getKeys() {
		ensureSession();
		return rep.getAttributeNames();
	}

	/** Set the session's time-to-live.
	 *
	 * This is implementation-specific, but basically should be the #
	 * of seconds of inactivity which will cause the session to time
	 * out and invalidate.  "inactivity" is implementation-specific.
	 */
	public void setTimeout(int timeout)
	{
		ensureSession();
		rep.setMaxInactiveInterval(timeout);
		System.out.println("session Timeout() : "  + getTimeout());
	}

	/**
	 * Return the sessions' time-to-live.
	 * 
	 * @return the timeout value for this session.
	 */
	public int getTimeout() {
		ensureSession();
		return rep.getMaxInactiveInterval();
	}


	/**
	 * Return the sessionsID from the httpSession.
	 * 
	 * @return the SessionID for this session.
	 */
	public String getSessionID() {
		ensureSession();
		return rep.getId();
	}


	/**
	 * "Touch" the session (mark it recently used)
	 */
	public void touch() {
		
		ensureSession();
		Long theFirstAccess = (Long) this.get("firstAccessTime");
		Long curTime = new Long (System.currentTimeMillis());
		int delta = (new Integer(curTime.intValue()/1000 - theFirstAccess.intValue()/1000)).intValue();
		int defaultSessionTimeout = Integer.parseInt(this.get("defaultSessionTimeout").toString());
		this.setTimeout(delta + defaultSessionTimeout);
	}


	/**
	 * invalidate the session
	 */
	public void invalidate() {
		rep.invalidate();
	}
    
	protected void ensureSession() {
		if (rep == null) {
			setRep(req.getSession());
		}
	}

	/**
	 * Get an Object suitable for synchronizing the session.  This method
	 * exists because different session implementations might provide
	 * different ways of getting at shared data.  For a simple hashtable-
	 * based session, this would just be the hashtable, but for sessions
	 * which use database connections, etc. it might be an object wrapping
	 * a table ID or somesuch.
	 */
	public Object getLockObject() {
		ensureSession();
		return rep;
	}
}