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
;
}
}
}