}
protected static ItsNatHttpSessionImpl getItsNatHttpSession(ItsNatHttpServletRequestImpl itsNatRequest)
{
ItsNatHttpSessionImpl itsNatSession;
ItsNatServletContextImpl context = itsNatRequest.getItsNatServletContext();
HttpServletRequest request = itsNatRequest.getHttpServletRequest();
HttpSession session = request.getSession();
if (session == null) throw new ItsNatException("INTERNAL ERROR");
boolean useAttribute = context.isSessionReplicationCapable();
synchronized(session)
{
// Quiz�s se pudiera evitar el synchronized usando AtomicReference (cuando portemos a Java 1.5)
// http://www.ibm.com/developerworks/java/library/j-jtp09238.html?ca=drs-
// De todas maneras el impacto en el rendimiento es �nfimo
if (useAttribute)
itsNatSession = ItsNatHttpSessionReplicationCapableImpl.readItsNatHttpSessionFromAttribute(session,context,itsNatRequest);
else
itsNatSession = ItsNatHttpSessionStickyImpl.getItsNatHttpSessionStickyByStandardId(session,context);
if (itsNatSession == null)
{
itsNatSession = createItsNatHttpSession(session, context, itsNatRequest);
context.addItsNatSession(itsNatSession); // �til para el control remoto, siempre hay que hacerlo
if (session.getAttribute(SESSION_CLEAN_ATTRIBUTE_NAME) == null)
{
// Esta anterior comprobaci�n es muy importante en SessionReplicationCapable = false
// pues el cleaner es lo �nico que se serializa en el caso SessionReplicationCapable = false