Commit da5ab9174351eedf2b616ddbf0867e500c9a71c7

Authored by Danilo Costa Viana
1 parent fa5140b5

Implementação de solução para leak de memória em aplicações usando beans

ViewScoped.
Showing 19 changed files with 162 additions and 60 deletions   Show diff stats
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
@@ -10,11 +10,17 @@ @@ -10,11 +10,17 @@
10 </listener> 10 </listener>
11 --> 11 -->
12 12
13 - <!-- If you are using servlet 2.5 then uncomment this listener --> 13 + <!--
  14 + If you are using servlet 2.5 then uncomment those listeners and filters.
  15 + They're added automatically on servlet 3.0 or greater.
  16 + -->
14 <!-- 17 <!--
15 <listener> 18 <listener>
16 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 19 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
17 </listener> 20 </listener>
  21 + <listener>
  22 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  23 + </listener>
18 <filter> 24 <filter>
19 <filter-name>Demoiselle Servlet Filter</filter-name> 25 <filter-name>Demoiselle Servlet Filter</filter-name>
20 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 26 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewBeanStore.java 0 → 100644
@@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
  1 +package br.gov.frameworkdemoiselle.internal.context;
  2 +
  3 +import java.io.Serializable;
  4 +
  5 +import javax.enterprise.context.spi.Contextual;
  6 +import javax.enterprise.context.spi.CreationalContext;
  7 +import javax.enterprise.inject.Alternative;
  8 +
  9 +/**
  10 + * Store that keeps view scoped beans. It associates all view scoped beans with a view ID.
  11 + * When the ID changes (meaning the view changed) all old view scoped beans are destroyed
  12 + * before new beans for the new view are created and stored.
  13 + *
  14 + * @author SERPRO
  15 + *
  16 + */
  17 +@Alternative
  18 +public class FacesViewBeanStore implements Serializable {
  19 +
  20 + private static final long serialVersionUID = -8265458933971929432L;
  21 +
  22 + private Long lastViewId = null;
  23 +
  24 + private BeanStore store;
  25 +
  26 + synchronized BeanStore getStore(Long viewId, AbstractCustomContext context) {
  27 + if (lastViewId == null || !lastViewId.equals(viewId)) {
  28 + clear(context);
  29 + lastViewId = viewId;
  30 + store = AbstractCustomContext.createStore();
  31 + }
  32 +
  33 + return store;
  34 + }
  35 +
  36 + @SuppressWarnings({ "rawtypes", "unchecked" })
  37 + public void clear(AbstractCustomContext context) {
  38 + if (store != null) {
  39 + for (String id : store) {
  40 + Contextual contextual = context.getContextualStore().getContextual(id);
  41 + Object instance = store.getInstance(id);
  42 + CreationalContext creationalContext = store.getCreationalContext(id);
  43 +
  44 + if (contextual != null && instance != null) {
  45 + contextual.destroy(instance, creationalContext);
  46 + }
  47 + }
  48 + store.clear();
  49 + }
  50 + }
  51 +}
impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java
@@ -39,17 +39,20 @@ package br.gov.frameworkdemoiselle.internal.context; @@ -39,17 +39,20 @@ package br.gov.frameworkdemoiselle.internal.context;
39 import java.util.concurrent.ConcurrentHashMap; 39 import java.util.concurrent.ConcurrentHashMap;
40 import java.util.concurrent.atomic.AtomicLong; 40 import java.util.concurrent.atomic.AtomicLong;
41 41
  42 +import javax.enterprise.context.ApplicationScoped;
  43 +import javax.enterprise.context.ContextNotActiveException;
  44 +import javax.enterprise.context.spi.Context;
42 import javax.enterprise.event.Observes; 45 import javax.enterprise.event.Observes;
43 import javax.enterprise.inject.Alternative; 46 import javax.enterprise.inject.Alternative;
44 import javax.faces.component.UIViewRoot; 47 import javax.faces.component.UIViewRoot;
45 import javax.faces.context.FacesContext; 48 import javax.faces.context.FacesContext;
46 -import javax.servlet.http.HttpServletRequest;  
47 import javax.servlet.http.HttpSession; 49 import javax.servlet.http.HttpSession;
48 50
49 import br.gov.frameworkdemoiselle.annotation.Priority; 51 import br.gov.frameworkdemoiselle.annotation.Priority;
50 import br.gov.frameworkdemoiselle.annotation.ViewScoped; 52 import br.gov.frameworkdemoiselle.annotation.ViewScoped;
51 import br.gov.frameworkdemoiselle.context.ViewContext; 53 import br.gov.frameworkdemoiselle.context.ViewContext;
52 import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; 54 import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed;
  55 +import br.gov.frameworkdemoiselle.util.Beans;
53 import br.gov.frameworkdemoiselle.util.Faces; 56 import br.gov.frameworkdemoiselle.util.Faces;
54 57
55 /** 58 /**
@@ -67,7 +70,7 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @@ -67,7 +70,7 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC
67 70
68 private final AtomicLong atomicLong = new AtomicLong(); 71 private final AtomicLong atomicLong = new AtomicLong();
69 72
70 - private ConcurrentHashMap<String, SessionBeanStore> sessionBeanStore = new ConcurrentHashMap<String, SessionBeanStore>(); 73 + private ConcurrentHashMap<String, FacesViewBeanStore> sessionBeanStore = new ConcurrentHashMap<String, FacesViewBeanStore>();
71 74
72 private static final String FACES_KEY = FacesViewContextImpl.class.getCanonicalName(); 75 private static final String FACES_KEY = FacesViewContextImpl.class.getCanonicalName();
73 76
@@ -82,15 +85,22 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @@ -82,15 +85,22 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC
82 85
83 @Override 86 @Override
84 protected BeanStore getStore() { 87 protected BeanStore getStore() {
85 - final String sessionId = getSessionId();  
86 -  
87 - if (sessionId==null){ 88 + String sessionId = getSessionId();
  89 + if (sessionId == null){
88 return null; 90 return null;
89 } 91 }
90 92
  93 + /*
  94 + * Tenta obter o viewID de forma não thread-safe por questões de performance.
  95 + * Se o viewID não existe entra em um trecho thread-safe para incrementa-lo, evitando
  96 + * conflito entre duas requests tentando incrementar esse número.
  97 + */
91 Long viewId = (Long)Faces.getViewMap().get(FACES_KEY); 98 Long viewId = (Long)Faces.getViewMap().get(FACES_KEY);
92 if (viewId==null){ 99 if (viewId==null){
93 synchronized (this) { 100 synchronized (this) {
  101 +
  102 + //Tenta obte-lo novamente, caso entre a primeira tentativa e o bloqueio
  103 + //da thread outra thread já tenha criado o número.
94 viewId = (Long)Faces.getViewMap().get(FACES_KEY); 104 viewId = (Long)Faces.getViewMap().get(FACES_KEY);
95 if (viewId==null){ 105 if (viewId==null){
96 viewId = atomicLong.incrementAndGet(); 106 viewId = atomicLong.incrementAndGet();
@@ -99,24 +109,29 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @@ -99,24 +109,29 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC
99 } 109 }
100 } 110 }
101 111
102 - SessionBeanStore currentStore = sessionBeanStore.get(sessionId); 112 + //A mesma técnica de bloqueio de thread acima é usada aqui para
  113 + //criar um SessionBeanStore caso o mesmo ainda não exista.
  114 + FacesViewBeanStore currentStore = sessionBeanStore.get(sessionId);
103 if (currentStore==null){ 115 if (currentStore==null){
104 synchronized (this) { 116 synchronized (this) {
105 - currentStore = (SessionBeanStore) sessionBeanStore.get(sessionId); 117 + currentStore = (FacesViewBeanStore) sessionBeanStore.get(sessionId);
106 if (currentStore==null){ 118 if (currentStore==null){
107 - currentStore = new SessionBeanStore(); 119 + currentStore = new FacesViewBeanStore();
108 sessionBeanStore.put(sessionId, currentStore); 120 sessionBeanStore.put(sessionId, currentStore);
109 } 121 }
110 } 122 }
111 } 123 }
112 - 124 +
113 return currentStore.getStore(viewId, this); 125 return currentStore.getStore(viewId, this);
114 } 126 }
115 127
116 - protected void clearInvalidatedSession(@Observes BeforeSessionDestroyed event){  
117 - String sessionId = event.getSessionId(); 128 + /*
  129 + * Called before the session is invalidated for that user.
  130 + * Destroys all view scoped beans stored on that session.
  131 + */
  132 + private void clearInvalidatedSession(String sessionId){
118 if (sessionId != null){ 133 if (sessionId != null){
119 - final SessionBeanStore store = sessionBeanStore.get(sessionId); 134 + final FacesViewBeanStore store = sessionBeanStore.get(sessionId);
120 if (store!=null){ 135 if (store!=null){
121 store.clear(this); 136 store.clear(this);
122 sessionBeanStore.remove(sessionId); 137 sessionBeanStore.remove(sessionId);
@@ -124,8 +139,40 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @@ -124,8 +139,40 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC
124 } 139 }
125 } 140 }
126 141
  142 + /*
  143 + * Returns the current session ID. Creates a session if one doesn't exist. Returns NULL if the session can't be created.
  144 + */
127 private String getSessionId(){ 145 private String getSessionId(){
128 final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); 146 final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
129 return session!=null ? session.getId() : null; 147 return session!=null ? session.getId() : null;
130 } 148 }
  149 +
  150 + /**
  151 + * Observes HTTP session lifecycle and notifies the ViewContext of session events (creation or destruction)
  152 + * so view scoped beans can be created or destroyed based on their underlying session scopes.
  153 + *
  154 + * @author SERPRO
  155 + *
  156 + */
  157 + @ApplicationScoped
  158 + protected static class FacesViewSessionListener {
  159 +
  160 + /**
  161 + * Called before the session is invalidated for that user.
  162 + * Destroys all view scoped beans stored on that session.
  163 + */
  164 + protected void clearInvalidatedSession(@Observes BeforeSessionDestroyed event){
  165 + String sessionId = event.getSessionId();
  166 + try{
  167 + Context context = Beans.getBeanManager().getContext(ViewScoped.class);
  168 + if ( FacesViewContextImpl.class.isInstance(context) ){
  169 + ((FacesViewContextImpl)context).clearInvalidatedSession(sessionId);
  170 + }
  171 + }
  172 + catch(ContextNotActiveException ce){
  173 + //Nada a fazer, contexto não está ativo.
  174 + }
  175 + }
  176 + }
131 } 177 }
  178 +
impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/SessionBeanStore.java
@@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
1 -package br.gov.frameworkdemoiselle.internal.context;  
2 -  
3 -import java.io.Serializable;  
4 -  
5 -import javax.enterprise.context.SessionScoped;  
6 -import javax.enterprise.context.spi.Contextual;  
7 -import javax.enterprise.context.spi.CreationalContext;  
8 -  
9 -@SessionScoped  
10 -public class SessionBeanStore implements Serializable {  
11 -  
12 - private static final long serialVersionUID = -8265458933971929432L;  
13 -  
14 - private Long lastViewId = null;  
15 -  
16 - private BeanStore store;  
17 -  
18 - synchronized BeanStore getStore(Long viewId, AbstractCustomContext context) {  
19 - if (lastViewId == null || !lastViewId.equals(viewId)) {  
20 - clear(context);  
21 - lastViewId = viewId;  
22 - store = AbstractCustomContext.createStore();  
23 - }  
24 -  
25 - return store;  
26 - }  
27 -  
28 - @SuppressWarnings({ "rawtypes", "unchecked" })  
29 - public void clear(AbstractCustomContext context) {  
30 - if (store != null) {  
31 - for (String id : store) {  
32 - Contextual contextual = context.getContextualStore().getContextual(id);  
33 - Object instance = store.getInstance(id);  
34 - CreationalContext creationalContext = store.getCreationalContext(id);  
35 -  
36 - if (contextual != null && instance != null) {  
37 - contextual.destroy(instance, creationalContext);  
38 - }  
39 - }  
40 - store.clear();  
41 - }  
42 - }  
43 -}  
impl/extension/jsf/src/test/resources/exception-handler-authentication/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-authorization/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-config-compatibility/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-config/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-redirect-config-compatibility/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-redirect-config/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/exception-handler-redirect/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/message/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/jsf/src/test/resources/proxy/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 <filter> 46 <filter>
44 <filter-name>Demoiselle Servlet Filter</filter-name> 47 <filter-name>Demoiselle Servlet Filter</filter-name>
45 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> 48 <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class>
impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java
@@ -4,8 +4,8 @@ import javax.servlet.http.HttpSession; @@ -4,8 +4,8 @@ import javax.servlet.http.HttpSession;
4 import javax.servlet.http.HttpSessionEvent; 4 import javax.servlet.http.HttpSessionEvent;
5 import javax.servlet.http.HttpSessionListener; 5 import javax.servlet.http.HttpSessionListener;
6 6
7 -import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed;  
8 import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated; 7 import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated;
  8 +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed;
9 9
10 /** 10 /**
11 * <p>Implements the {@link HttpSessionListener} interface and fires two events.</p> 11 * <p>Implements the {@link HttpSessionListener} interface and fires two events.</p>
@@ -19,14 +19,14 @@ import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated; @@ -19,14 +19,14 @@ import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated;
19 * 19 *
20 */ 20 */
21 public class SessionListener implements HttpSessionListener { 21 public class SessionListener implements HttpSessionListener {
22 - 22 +
23 @Override 23 @Override
24 public void sessionCreated(final HttpSessionEvent sessionEvent) { 24 public void sessionCreated(final HttpSessionEvent sessionEvent) {
25 Beans.getBeanManager().fireEvent(new AfterSessionCreated() { 25 Beans.getBeanManager().fireEvent(new AfterSessionCreated() {
26 @Override 26 @Override
27 public String getSessionId() { 27 public String getSessionId() {
28 HttpSession session = sessionEvent.getSession(); 28 HttpSession session = sessionEvent.getSession();
29 - return session != null ? session.getId() : null; 29 + return session!=null ? session.getId() : null;
30 } 30 }
31 }); 31 });
32 } 32 }
@@ -37,7 +37,7 @@ public class SessionListener implements HttpSessionListener { @@ -37,7 +37,7 @@ public class SessionListener implements HttpSessionListener {
37 @Override 37 @Override
38 public String getSessionId() { 38 public String getSessionId() {
39 HttpSession session = sessionEvent.getSession(); 39 HttpSession session = sessionEvent.getSession();
40 - return session != null ? session.getId() : null; 40 + return session!=null ? session.getId() : null;
41 } 41 }
42 }); 42 });
43 } 43 }
impl/extension/servlet/src/test/java/test/Tests.java
@@ -54,6 +54,7 @@ import br.gov.frameworkdemoiselle.security.ServletAuthorizer; @@ -54,6 +54,7 @@ import br.gov.frameworkdemoiselle.security.ServletAuthorizer;
54 import br.gov.frameworkdemoiselle.util.BasicAuthFilter; 54 import br.gov.frameworkdemoiselle.util.BasicAuthFilter;
55 import br.gov.frameworkdemoiselle.util.ServletFilter; 55 import br.gov.frameworkdemoiselle.util.ServletFilter;
56 import br.gov.frameworkdemoiselle.util.ServletListener; 56 import br.gov.frameworkdemoiselle.util.ServletListener;
  57 +import br.gov.frameworkdemoiselle.util.SessionListener;
57 58
58 @Ignore 59 @Ignore
59 public final class Tests { 60 public final class Tests {
@@ -76,6 +77,7 @@ public final class Tests { @@ -76,6 +77,7 @@ public final class Tests {
76 .addClass(ServletAuthorizer.class) 77 .addClass(ServletAuthorizer.class)
77 .addClass(ServletFilter.class) 78 .addClass(ServletFilter.class)
78 .addClass(ServletListener.class) 79 .addClass(ServletListener.class)
  80 + .addClass(SessionListener.class)
79 .addClass(HttpServletRequestProducer.class) 81 .addClass(HttpServletRequestProducer.class)
80 .addClass(HttpServletResponseProducer.class) 82 .addClass(HttpServletResponseProducer.class)
81 .addClass(HttpSessionProducer.class) 83 .addClass(HttpSessionProducer.class)
impl/extension/servlet/src/test/resources/producer/request/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 46
44 <filter> 47 <filter>
45 <filter-name>Demoiselle Servlet Filter</filter-name> 48 <filter-name>Demoiselle Servlet Filter</filter-name>
impl/extension/servlet/src/test/resources/producer/response/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 46
44 <filter> 47 <filter>
45 <filter-name>Demoiselle Servlet Filter</filter-name> 48 <filter-name>Demoiselle Servlet Filter</filter-name>
impl/extension/servlet/src/test/resources/security/authentication/basic/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 46
44 <filter> 47 <filter>
45 <filter-name>Demoiselle Servlet Filter</filter-name> 48 <filter-name>Demoiselle Servlet Filter</filter-name>
impl/extension/servlet/src/test/resources/security/authentication/form/web.xml
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <listener> 40 <listener>
41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> 41 <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class>
42 </listener> 42 </listener>
  43 + <listener>
  44 + <listener-class>br.gov.frameworkdemoiselle.util.SessionListener</listener-class>
  45 + </listener>
43 46
44 <filter> 47 <filter>
45 <filter-name>Demoiselle Servlet Filter</filter-name> 48 <filter-name>Demoiselle Servlet Filter</filter-name>