Subversion Repositories bacoAlunos

Rev

Rev 975 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain;

import org.apache.commons.io.output.ByteArrayOutputStream;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * @author Jorge Machado
 * @date 2/Mar/2008
 * @time 10:27:25
 * @see pt.estgp.estgweb.domain
 */

public class UserSessionImpl extends UserSession
{

    private Set<SessionObject> removeList;

    /**
     * @return
     */

    public 1.5.0/docs/api/java/io/Serializable.html">Serializable getSerializable()
    {
        return getCookie();
    }

    /**
     * put an object in cache
     *
     * @param key
     * @param obj
     */

    public void put(1.5.0/docs/api/java/lang/String.html">String key, 1.5.0/docs/api/java/io/Serializable.html">Serializable obj)
    {
        if (getObjects() == null || getObjects().size() == 0)
        {
            setObjects(new HashSet<SessionObject>());
        }
        SessionObject sessionObject = getSessionObject(key);
        if (sessionObject == null)
        {
            sessionObject = DomainObjectFactory.createSessionObjectImpl();
            SessionObjectId sessionObjectId = DomainObjectFactory.createSessionObjectIdImpl();
            sessionObjectId.setKeyId(key);
            sessionObject.setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());
            sessionObjectId.setUserSession(this);
            sessionObject.setId(sessionObjectId);
            getObjects().add(sessionObject);
        }
        1.5.0/docs/api/java/io/ByteArrayOutputStream.html">ByteArrayOutputStream os = new 1.5.0/docs/api/java/io/ByteArrayOutputStream.html">ByteArrayOutputStream();
//        try
//        {
//            ObjectOutputStream oos = new ObjectOutputStream(os);
//            oos.writeObject(obj);
//            oos.close();
//        }
//        catch (IOException e)
//        {
//            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
//        }
//        XMLEncoder xenc = new XMLEncoder(os);
//        xenc.writeObject(obj);
//        xenc.close();
//        sessionObject.setXmlObject(os.toString());
        sessionObject.setObject(obj);
    }

    /**
     * put an object in cache
     * only will be persistent when serialize is called
     *
     * @param key
     */

    public void remove(1.5.0/docs/api/java/lang/String.html">String key)
    {
        if (getObjects() == null || getObjects().size() == 0)
        {
            setObjects(new HashSet<SessionObject>());
        }
        SessionObject sessionObject = getAndRemoveSessionObject(key);
        if (sessionObject != null)
        {
            if (removeList == null)
                removeList = new HashSet<SessionObject>();
            removeList.add(sessionObject);
        }
    }

    /**
     * put an object in cache
     * only will be persistent when serialize is called
     *
     * @param key
     */


    public void removeWithOpenTransaction(1.5.0/docs/api/java/lang/String.html">String key)
    {
        if (getObjects() == null || getObjects().size() == 0)
        {
            setObjects(new HashSet<SessionObject>());
        }
        SessionObject sessionObject = getAndRemoveSessionObject(key);
        DaoFactory.getSessionObjectDaoImpl().evictAndDelete(sessionObject);
    }


    public void clearObjects()
    {

        if (getObjects() == null || getObjects().size() == 0)
        {
            return;
        }
        1.5.0/docs/api/java/lang/System.html">System.out.println("Clearing session from " + getObjects().size() + " objects");
        for(SessionObject obj: getObjects())
            1.5.0/docs/api/java/lang/System.html">System.out.println(obj.getId().getKeyId());
        if(removeList != null)
            removeList.addAll(getObjects());
        else
            removeList = getObjects();
        //todo NOVO Authenticate
        getObjects().clear();
    }

    public void clearObjectsWithOpenTransaction()
    {
        clearObjects();
        if(removeList != null && removeList.size() > 0)
        {
            DaoFactory.getSessionObjectDaoImpl().evictAndDelete(removeList);

        }
    }


    public void reset()
    {
        setUser(null);
        setUsername(null);
        setName(null);
        clear();
    }

    public void resetWithOpenTransaction()
    {
        setUser(null);
        setUsername(null);
        setName(null);
        clearWithOpenTransaction();
    }

    public void clear()
    {
        clearObjects();
        setUser(null);
        setUsername(null);
        setName(null);
    }

    public void clearWithOpenTransaction()
    {
        clearObjectsWithOpenTransaction();
        setUser(null);
        setUsername(null);
        setName(null);
    }

    /**
     * Return a seralized object for a given key
     *
     * @param key
     * @return
     */

    public 1.5.0/docs/api/java/io/Serializable.html">Serializable get(1.5.0/docs/api/java/lang/String.html">String key)
    {
        if (getObjects() == null)
        {
            return null;
        }
        for (SessionObject sessionObject : getObjects())
        {
            if (sessionObject.getId().getKeyId().equals(key))
            {
                //XMLDecoder xmlDecoder = new XMLDecoder(new ByteArrayInputStream(sessionObject.getXmlObject().getBytes()));
                //return (Serializable) xmlDecoder.readObject();
                return sessionObject.getObject();
            }
        }
        return null;
    }

    /**
     * Return an session object with a given key
     *
     * @param key
     * @return
     */

    private SessionObject getSessionObject(1.5.0/docs/api/java/lang/String.html">String key)
    {
        if (getObjects() == null)
        {
            return null;
        }
        for (SessionObject sessionObject : getObjects())
        {
            if (sessionObject.getId().getKeyId().equals(key))
            {
                return sessionObject;
            }
        }
        return null;
    }

    /**
     * Return an session object with a given key removing it from list
     *
     * @param key
     * @return
     */

    private SessionObject getAndRemoveSessionObject(1.5.0/docs/api/java/lang/String.html">String key)
    {
        if (getObjects() == null)
        {
            return null;
        }
        Iterator<SessionObject> iter = getObjects().iterator();
        while (iter.hasNext())
        {
            SessionObject sessionObject = iter.next();
            if (sessionObject.getId().getKeyId().equals(key))
            {
                iter.remove();
                return sessionObject;
            }
        }
        return null;
    }

    /**
     * Serialize Session to Database
     *
     * @param request
     * @throws Throwable
     */

    public void serialize(HttpServletRequest request, HttpServletResponse response) throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
    {
        serialize(RequestUtils.getRequester(request, response));
    }

    /**
     * Serialize Session to Database
     *
     * @param requester
     * @throws Throwable
     */

    public void serialize(1.5.0/docs/api/java/lang/String.html">String requester) throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
    {
        try
        {

            IServiceManager sm = ServiceManager.getInstance();
            5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{this, removeList};
            sm.execute(requester, "UpdateUserSession", args);
            if(removeList != null)
                removeList.clear();
        }
        catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            throw e;
        }
    }

}