From fa5140b5cee2f26820e610f72b01705bb692cff0 Mon Sep 17 00:00:00 2001 From: Danilo Costa Viana Date: Mon, 17 Nov 2014 18:03:32 -0300 Subject: [PATCH] Corrigindo problema de vazamento de memória em FacesViewContextImpl (Jira FWK-205). --- impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java | 24 +++++++----------------- impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java | 13 +++++++++++++ impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java | 13 +++++++++++++ impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml | 4 ++++ 5 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java create mode 100644 impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java create mode 100644 impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java diff --git a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java index 42aa35a..0c34620 100644 --- a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java +++ b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java @@ -39,6 +39,7 @@ package br.gov.frameworkdemoiselle.internal.context; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import javax.enterprise.event.Observes; import javax.enterprise.inject.Alternative; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; @@ -48,6 +49,7 @@ import javax.servlet.http.HttpSession; import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.annotation.ViewScoped; import br.gov.frameworkdemoiselle.context.ViewContext; +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; import br.gov.frameworkdemoiselle.util.Faces; /** @@ -80,8 +82,6 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @Override protected BeanStore getStore() { - clearInvalidatedSession(); - final String sessionId = getSessionId(); if (sessionId==null){ @@ -113,13 +113,13 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC return currentStore.getStore(viewId, this); } - private synchronized void clearInvalidatedSession(){ - if (wasSessionInvalidated()){ - final String requestedSessionId = getRequestedSessionId(); - final SessionBeanStore store = sessionBeanStore.get(requestedSessionId); + protected void clearInvalidatedSession(@Observes BeforeSessionDestroyed event){ + String sessionId = event.getSessionId(); + if (sessionId != null){ + final SessionBeanStore store = sessionBeanStore.get(sessionId); if (store!=null){ store.clear(this); - sessionBeanStore.remove(requestedSessionId); + sessionBeanStore.remove(sessionId); } } } @@ -128,14 +128,4 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); return session!=null ? session.getId() : null; } - - private String getRequestedSessionId(){ - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); - return request!=null ? request.getRequestedSessionId() : null; - } - - private boolean wasSessionInvalidated(){ - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); - return request!=null && request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); - } } diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java new file mode 100644 index 0000000..884700f --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java @@ -0,0 +1,13 @@ +package br.gov.frameworkdemoiselle.lifecycle; + +/** + * This interface represents an event fired before a new HTTP session is created. + * + * @author serpro + * + */ +public interface AfterSessionCreated { + + public String getSessionId(); + +} diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java new file mode 100644 index 0000000..487fa74 --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java @@ -0,0 +1,13 @@ +package br.gov.frameworkdemoiselle.lifecycle; + +/** + * This interface represents an event fired after a new HTTP session is destroyed. + * + * @author serpro + * + */ +public interface BeforeSessionDestroyed { + + public String getSessionId(); + +} diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java new file mode 100644 index 0000000..0a2b452 --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java @@ -0,0 +1,44 @@ +package br.gov.frameworkdemoiselle.util; + +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; +import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated; + +/** + *

Implements the {@link HttpSessionListener} interface and fires two events.

+ * + * + * + * @author serpro + * + */ +public class SessionListener implements HttpSessionListener { + + @Override + public void sessionCreated(final HttpSessionEvent sessionEvent) { + Beans.getBeanManager().fireEvent(new AfterSessionCreated() { + @Override + public String getSessionId() { + HttpSession session = sessionEvent.getSession(); + return session != null ? session.getId() : null; + } + }); + } + + @Override + public void sessionDestroyed(final HttpSessionEvent sessionEvent) { + Beans.getBeanManager().fireEvent(new BeforeSessionDestroyed() { + @Override + public String getSessionId() { + HttpSession session = sessionEvent.getSession(); + return session != null ? session.getId() : null; + } + }); + } +} diff --git a/impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml b/impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml index 7e6699d..fb00632 100644 --- a/impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml +++ b/impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml @@ -42,6 +42,10 @@ br.gov.frameworkdemoiselle.util.ServletListener + + + br.gov.frameworkdemoiselle.util.SessionListener + Demoiselle Servlet Filter -- libgit2 0.21.2