Commit fa5140b5cee2f26820e610f72b01705bb692cff0
1 parent
077b05aa
Corrigindo problema de vazamento de memória em FacesViewContextImpl
(Jira FWK-205).
Showing
5 changed files
with
81 additions
and
17 deletions
Show diff stats
impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java
... | ... | @@ -39,6 +39,7 @@ package br.gov.frameworkdemoiselle.internal.context; |
39 | 39 | import java.util.concurrent.ConcurrentHashMap; |
40 | 40 | import java.util.concurrent.atomic.AtomicLong; |
41 | 41 | |
42 | +import javax.enterprise.event.Observes; | |
42 | 43 | import javax.enterprise.inject.Alternative; |
43 | 44 | import javax.faces.component.UIViewRoot; |
44 | 45 | import javax.faces.context.FacesContext; |
... | ... | @@ -48,6 +49,7 @@ import javax.servlet.http.HttpSession; |
48 | 49 | import br.gov.frameworkdemoiselle.annotation.Priority; |
49 | 50 | import br.gov.frameworkdemoiselle.annotation.ViewScoped; |
50 | 51 | import br.gov.frameworkdemoiselle.context.ViewContext; |
52 | +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; | |
51 | 53 | import br.gov.frameworkdemoiselle.util.Faces; |
52 | 54 | |
53 | 55 | /** |
... | ... | @@ -80,8 +82,6 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC |
80 | 82 | |
81 | 83 | @Override |
82 | 84 | protected BeanStore getStore() { |
83 | - clearInvalidatedSession(); | |
84 | - | |
85 | 85 | final String sessionId = getSessionId(); |
86 | 86 | |
87 | 87 | if (sessionId==null){ |
... | ... | @@ -113,13 +113,13 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC |
113 | 113 | return currentStore.getStore(viewId, this); |
114 | 114 | } |
115 | 115 | |
116 | - private synchronized void clearInvalidatedSession(){ | |
117 | - if (wasSessionInvalidated()){ | |
118 | - final String requestedSessionId = getRequestedSessionId(); | |
119 | - final SessionBeanStore store = sessionBeanStore.get(requestedSessionId); | |
116 | + protected void clearInvalidatedSession(@Observes BeforeSessionDestroyed event){ | |
117 | + String sessionId = event.getSessionId(); | |
118 | + if (sessionId != null){ | |
119 | + final SessionBeanStore store = sessionBeanStore.get(sessionId); | |
120 | 120 | if (store!=null){ |
121 | 121 | store.clear(this); |
122 | - sessionBeanStore.remove(requestedSessionId); | |
122 | + sessionBeanStore.remove(sessionId); | |
123 | 123 | } |
124 | 124 | } |
125 | 125 | } |
... | ... | @@ -128,14 +128,4 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC |
128 | 128 | final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); |
129 | 129 | return session!=null ? session.getId() : null; |
130 | 130 | } |
131 | - | |
132 | - private String getRequestedSessionId(){ | |
133 | - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); | |
134 | - return request!=null ? request.getRequestedSessionId() : null; | |
135 | - } | |
136 | - | |
137 | - private boolean wasSessionInvalidated(){ | |
138 | - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); | |
139 | - return request!=null && request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); | |
140 | - } | |
141 | 131 | } | ... | ... |
impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java
0 → 100644
... | ... | @@ -0,0 +1,13 @@ |
1 | +package br.gov.frameworkdemoiselle.lifecycle; | |
2 | + | |
3 | +/** | |
4 | + * This interface represents an event fired before a new HTTP session is created. | |
5 | + * | |
6 | + * @author serpro | |
7 | + * | |
8 | + */ | |
9 | +public interface AfterSessionCreated { | |
10 | + | |
11 | + public String getSessionId(); | |
12 | + | |
13 | +} | ... | ... |
impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java
0 → 100644
... | ... | @@ -0,0 +1,13 @@ |
1 | +package br.gov.frameworkdemoiselle.lifecycle; | |
2 | + | |
3 | +/** | |
4 | + * This interface represents an event fired after a new HTTP session is destroyed. | |
5 | + * | |
6 | + * @author serpro | |
7 | + * | |
8 | + */ | |
9 | +public interface BeforeSessionDestroyed { | |
10 | + | |
11 | + public String getSessionId(); | |
12 | + | |
13 | +} | ... | ... |
impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java
0 → 100644
... | ... | @@ -0,0 +1,44 @@ |
1 | +package br.gov.frameworkdemoiselle.util; | |
2 | + | |
3 | +import javax.servlet.http.HttpSession; | |
4 | +import javax.servlet.http.HttpSessionEvent; | |
5 | +import javax.servlet.http.HttpSessionListener; | |
6 | + | |
7 | +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; | |
8 | +import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated; | |
9 | + | |
10 | +/** | |
11 | + * <p>Implements the {@link HttpSessionListener} interface and fires two events.</p> | |
12 | + * | |
13 | + * <ul> | |
14 | + * <li><strong>{@link AfterSessionCreated}</strong>: Just after a new HTTP session is created</li> | |
15 | + * <li><strong>{@link BeforeSessionDestroyed}</strong>: Just before an HTTP session is invalidated</li> | |
16 | + * </ul> | |
17 | + * | |
18 | + * @author serpro | |
19 | + * | |
20 | + */ | |
21 | +public class SessionListener implements HttpSessionListener { | |
22 | + | |
23 | + @Override | |
24 | + public void sessionCreated(final HttpSessionEvent sessionEvent) { | |
25 | + Beans.getBeanManager().fireEvent(new AfterSessionCreated() { | |
26 | + @Override | |
27 | + public String getSessionId() { | |
28 | + HttpSession session = sessionEvent.getSession(); | |
29 | + return session != null ? session.getId() : null; | |
30 | + } | |
31 | + }); | |
32 | + } | |
33 | + | |
34 | + @Override | |
35 | + public void sessionDestroyed(final HttpSessionEvent sessionEvent) { | |
36 | + Beans.getBeanManager().fireEvent(new BeforeSessionDestroyed() { | |
37 | + @Override | |
38 | + public String getSessionId() { | |
39 | + HttpSession session = sessionEvent.getSession(); | |
40 | + return session != null ? session.getId() : null; | |
41 | + } | |
42 | + }); | |
43 | + } | |
44 | +} | ... | ... |
impl/extension/servlet/src/main/resources/META-INF/web-fragment.xml
... | ... | @@ -42,6 +42,10 @@ |
42 | 42 | <listener> |
43 | 43 | <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> |
44 | 44 | </listener> |
45 | + | |
46 | + <listener> | |
47 | + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class> | |
48 | + </listener> | |
45 | 49 | |
46 | 50 | <filter> |
47 | 51 | <filter-name>Demoiselle Servlet Filter</filter-name> | ... | ... |