Author: lincolnthree
Date: 2010-04-30 16:27:09 -0400 (Fri, 30 Apr 2010)
New Revision: 12669
Added:
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Level.java
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Message.java
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Messages.java
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessage.java
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessages.java
Modified:
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/context/FlashScopedContext.java
modules/faces/trunk/impl/src/main/resources/META-INF/faces-config.xml
Log:
Fixed the flash scope
Implemented first generation Messages API
Added: modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Level.java
===================================================================
--- modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Level.java
(rev 0)
+++
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Level.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -0,0 +1,28 @@
+/**
+ *
+ */
+package org.jboss.seam.faces.display;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.application.FacesMessage.Severity;
+
+/**
+ * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter,
III</a>
+ *
+ */
+public enum Level
+{
+ INFO(FacesMessage.SEVERITY_INFO), WARN(FacesMessage.SEVERITY_WARN),
ERROR(FacesMessage.SEVERITY_ERROR), FATAL(FacesMessage.SEVERITY_FATAL);
+
+ private Severity severity;
+
+ Level(final Severity severity)
+ {
+ this.severity = severity;
+ }
+
+ public Severity getSeverity()
+ {
+ return severity;
+ }
+}
\ No newline at end of file
Added: modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Message.java
===================================================================
--- modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Message.java
(rev 0)
+++
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Message.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -0,0 +1,47 @@
+package org.jboss.seam.faces.display;
+
+import java.io.Serializable;
+
+/**
+ * A convenient message to be displayed to the user as Feedback, Toast, Alerts,
+ * etc... See {@link Messages} for usage.
+ *
+ * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter,
III</a>
+ */
+public interface Message extends Serializable
+{
+ /**
+ * Set the message summary to be displayed if the output component is enabled
+ * to display summary. This is the primary text of the message.
+ *
+ * @param message
+ * @return The builder pattern {@link Message}
+ */
+ Message summary(String message);
+
+ /**
+ * Set the message details to be displayed if the output component is enabled
+ * to display detail. This is the secondary text of the message.
+ *
+ * @return The builder pattern {@link Message}
+ */
+ Message details(String details);
+
+ /**
+ * Specifies that this message should be displayed by the corresponding
+ * <code><h:message for="clientId" /></code> tag,
where clientId is the
+ * ID of the component to which this message belongs.
+ *
+ * @param The clientId of the component to which this message should be
+ * attached/displayed
+ */
+ Message component(String clientId);
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public String getDetails();
+
+ public String getClientId();
+}
\ No newline at end of file
Added: modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Messages.java
===================================================================
--- modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Messages.java
(rev 0)
+++
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/display/Messages.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -0,0 +1,36 @@
+package org.jboss.seam.faces.display;
+
+import java.util.Set;
+
+/**
+ * A convenient way to add messages to be displayed to the user as Feedback
+ * messages, Toast, Alerts, etc...
+ *
+ * Messages can be displayed by using the <code><h:messages
/></code> tag
+ * in any given View.
+ *
+ * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter,
III</a>
+ */
+public interface Messages
+{
+ /**
+ * Create a new {@link Message} object and add it to the pending message
+ * cache. Messages remain pending until the Render Response phase is next
+ * invoked. E.g: If a redirect is issued before Render Response occurs,
+ * messages will be displayed during the next Render Response phase unless
+ * {@link Messages#clear()} is called, or the user's Session expires.
+ * <p>
+ * <b>Note:</b> Duplicate messages are ignored.
+ */
+ Message add(Level level);
+
+ /**
+ * Retrieve all pending messages.
+ */
+ Set<Message> getAll();
+
+ /**
+ * Clears all pending messages.
+ */
+ void clear();
+}
\ No newline at end of file
Modified:
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/context/FlashScopedContext.java
===================================================================
---
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/context/FlashScopedContext.java 2010-04-30
16:11:01 UTC (rev 12668)
+++
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/context/FlashScopedContext.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -21,6 +21,7 @@
*/
package org.jboss.seam.faces.context;
+import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.Map.Entry;
@@ -30,6 +31,7 @@
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
import javax.faces.bean.FlashScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
@@ -37,6 +39,9 @@
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
+import javax.faces.event.PreRenderViewEvent;
+import javax.inject.Inject;
+import javax.servlet.ServletRequest;
/**
* This class provides the lifecycle for the new JSF 2 Flash Context
@@ -45,157 +50,183 @@
*/
public class FlashScopedContext implements Context, PhaseListener
{
- private static final long serialVersionUID = -1580689204988513798L;
+ private static final long serialVersionUID = -1580689204988513798L;
- private final static String COMPONENT_MAP_NAME =
"org.jboss.seam.faces.flash.componentInstanceMap";
- private final static String CREATIONAL_MAP_NAME =
"org.jboss.seam.faces.flash.creationalInstanceMap";
- private final ThreadLocal<Map<Contextual<?>, Object>>
lastComponentInstanceMap = new ThreadLocal<Map<Contextual<?>,
Object>>();
- private final ThreadLocal<Map<Contextual<?>,
CreationalContext<?>>> lastCreationalContextMap = new
ThreadLocal<Map<Contextual<?>, CreationalContext<?>>>();
+ final static String COMPONENT_MAP_NAME =
"org.jboss.seam.faces.flash.componentInstanceMap";
+ final static String CREATIONAL_MAP_NAME =
"org.jboss.seam.faces.flash.creationalInstanceMap";
- @SuppressWarnings("unchecked")
- public <T> T get(final Contextual<T> component)
- {
- assertActive();
- return (T) getComponentInstanceMap().get(component);
- }
+ @SuppressWarnings("unchecked")
+ public <T> T get(final Contextual<T> component)
+ {
+ assertActive();
+ return (T) getComponentInstanceMap().get(component);
+ }
- @SuppressWarnings("unchecked")
- public <T> T get(final Contextual<T> component, final
CreationalContext<T> creationalContext)
- {
- assertActive();
+ @SuppressWarnings("unchecked")
+ public <T> T get(final Contextual<T> component, final
CreationalContext<T> creationalContext)
+ {
+ assertActive();
- T instance = get(component);
+ T instance = get(component);
- if (instance == null)
- {
- Map<Contextual<?>, CreationalContext<?>>
creationalContextMap = getCreationalContextMap();
- Map<Contextual<?>, Object> componentInstanceMap =
getComponentInstanceMap();
+ if (instance == null)
+ {
+ Map<Contextual<?>, CreationalContext<?>> creationalContextMap
= getCreationalContextMap();
+ Map<Contextual<?>, Object> componentInstanceMap =
getComponentInstanceMap();
- synchronized (componentInstanceMap)
+ synchronized (componentInstanceMap)
+ {
+ instance = (T) componentInstanceMap.get(component);
+ if (instance == null)
{
- instance = (T) componentInstanceMap.get(component);
- if (instance == null)
- {
- instance = component.create(creationalContext);
+ instance = component.create(creationalContext);
- if (instance != null)
- {
- componentInstanceMap.put(component, instance);
- creationalContextMap.put(component, creationalContext);
- }
- }
+ if (instance != null)
+ {
+ componentInstanceMap.put(component, instance);
+ creationalContextMap.put(component, creationalContext);
+ }
}
- }
+ }
+ }
- return instance;
- }
+ return instance;
+ }
- public Class<? extends Annotation> getScope()
- {
- return FlashScoped.class;
- }
+ public Class<? extends Annotation> getScope()
+ {
+ return FlashScoped.class;
+ }
- public boolean isActive()
- {
- return getFlash() != null;
- }
+ public boolean isActive()
+ {
+ return getFlash() != null;
+ }
- /**
- * This method should, **in theory**, catch the current instanceMap (which
- * is the previous lifecycle's next instanceMap.) These are the objects that
- * we want cleaned up at the end of the current render-response phase, so we
- * save them here until after the RENDER_RESPONSE phase, because otherwise
- * they would have been destroyed by the Flash, and we would no longer have
- * access to them.
- */
- public void beforePhase(final PhaseEvent event)
- {
- this.lastComponentInstanceMap.set(getComponentInstanceMap());
- this.lastCreationalContextMap.set(getCreationalContextMap());
- }
+ @Inject
+ FacesContext context;
- /**
- * Do the object cleanup using our saved references.
- */
- @SuppressWarnings("unchecked")
- public void afterPhase(final PhaseEvent event)
- {
- // TODO verify that this is actually destroying the beans we want to be
- // destroyed... flash is confusing, tests will make sense of it
- Map<Contextual<?>, Object> componentInstanceMap =
lastComponentInstanceMap.get();
- Map<Contextual<?>, CreationalContext<?>> creationalContextMap =
lastCreationalContextMap.get();
+ /**
+ * This method ensures that the contextual maps are populated before
+ * rendering occurs (thus, before any contextual objects are created during
+ * the Render Response phase.)
+ * <p>
+ * This method also ensures that the maps are available after Flash.clear()
+ * is called immediately before Render Response is complete.
+ *
+ * @param event
+ * @throws IOException
+ */
+ public void retrieveContextualMaps(@Observes final PreRenderViewEvent event) throws
IOException
+ {
+ ExternalContext externalContext = context.getExternalContext();
+ Object temp = externalContext.getRequest();
+ if (temp instanceof ServletRequest)
+ {
+ Object componentMap = getComponentInstanceMap();
+ Object creationalMap = getCreationalContextMap();
- if (componentInstanceMap != null)
- {
- for (Entry<Contextual<?>, Object> componentEntry :
componentInstanceMap.entrySet())
+ ServletRequest request = (ServletRequest) temp;
+ request.setAttribute(FlashScopedContext.COMPONENT_MAP_NAME, componentMap);
+ request.setAttribute(FlashScopedContext.CREATIONAL_MAP_NAME, creationalMap);
+ }
+ }
+
+ public void beforePhase(final PhaseEvent event)
+ {
+ }
+
+ /**
+ * This method saves the current scope metadata into the Flash after Restore
+ * View, then destroys the metadata after Render Response. Since the current
+ * request's execution Flash is swapped with the last requests execution
+ * flash for the Render Response phase, the last request's execution flash is
+ * actually the one that gets cleaned up.
+ * <p>
+ * Preserve this request's new metadata. Do the object cleanup using our
+ * saved references from last request.
+ */
+ @SuppressWarnings("unchecked")
+ public void afterPhase(final PhaseEvent event)
+ {
+ if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
+ {
+ ExternalContext externalContext = event.getFacesContext().getExternalContext();
+ Object temp = externalContext.getRequest();
+ if (temp instanceof ServletRequest)
+ {
+ ServletRequest request = (ServletRequest) temp;
+
+ Map<Contextual<?>, Object> componentInstanceMap =
(Map<Contextual<?>, Object>)
request.getAttribute(FlashScopedContext.COMPONENT_MAP_NAME);
+ Map<Contextual<?>, CreationalContext<?>>
creationalContextMap = (Map<Contextual<?>, CreationalContext<?>>)
request.getAttribute(FlashScopedContext.CREATIONAL_MAP_NAME);
+
+ if ((componentInstanceMap != null) && (creationalContextMap !=
null))
{
- Contextual contextual = componentEntry.getKey();
- Object instance = componentEntry.getValue();
- CreationalContext creational = creationalContextMap.get(contextual);
+ for (Entry<Contextual<?>, Object> componentEntry :
componentInstanceMap.entrySet())
+ {
+ Contextual contextual = componentEntry.getKey();
+ Object instance = componentEntry.getValue();
+ CreationalContext creational = creationalContextMap.get(contextual);
- contextual.destroy(instance, creational);
+ contextual.destroy(instance, creational);
+ }
}
- }
+ }
+ }
+ }
- this.lastComponentInstanceMap.remove();
- this.lastCreationalContextMap.remove();
- }
+ public PhaseId getPhaseId()
+ {
+ return PhaseId.ANY_PHASE;
+ }
- public PhaseId getPhaseId()
- {
- return PhaseId.RENDER_RESPONSE;
- }
+ private Flash getFlash()
+ {
+ FacesContext currentInstance = FacesContext.getCurrentInstance();
+ if (currentInstance != null)
+ {
+ ExternalContext externalContext = currentInstance.getExternalContext();
+ return externalContext.getFlash();
+ }
+ return null;
+ }
- private Flash getFlash()
- {
- FacesContext currentInstance = FacesContext.getCurrentInstance();
- if (currentInstance != null)
- {
- ExternalContext externalContext = currentInstance.getExternalContext();
- return externalContext.getFlash();
- }
- return null;
- }
+ private void assertActive()
+ {
+ if (!isActive())
+ {
+ throw new ContextNotActiveException("Seam context with scope annotation
@FlashScoped is not active with respect to the current thread");
+ }
+ }
- private void assertActive()
- {
- if (!isActive())
- {
- throw new ContextNotActiveException(
- "Seam context with scope annotation @FlashScoped is not active
with respect to the current thread");
- }
- }
+ @SuppressWarnings("unchecked")
+ private Map<Contextual<?>, Object> getComponentInstanceMap()
+ {
+ Flash flash = getFlash();
+ ConcurrentHashMap<Contextual<?>, Object> map =
(ConcurrentHashMap<Contextual<?>, Object>) flash.get(COMPONENT_MAP_NAME);
- @SuppressWarnings("unchecked")
- private Map<Contextual<?>, Object> getComponentInstanceMap()
- {
- Flash flash = getFlash();
- ConcurrentHashMap<Contextual<?>, Object> map =
(ConcurrentHashMap<Contextual<?>, Object>) flash
- .get(COMPONENT_MAP_NAME);
+ if (map == null)
+ {
+ map = new ConcurrentHashMap<Contextual<?>, Object>();
+ flash.put(COMPONENT_MAP_NAME, map);
+ }
- if (map == null)
- {
- map = new ConcurrentHashMap<Contextual<?>, Object>();
- flash.put(COMPONENT_MAP_NAME, map);
- }
+ return map;
+ }
- return map;
- }
+ @SuppressWarnings("unchecked")
+ private Map<Contextual<?>, CreationalContext<?>>
getCreationalContextMap()
+ {
+ Flash flash = getFlash();
+ Map<Contextual<?>, CreationalContext<?>> map =
(ConcurrentHashMap<Contextual<?>, CreationalContext<?>>)
flash.get(CREATIONAL_MAP_NAME);
- @SuppressWarnings("unchecked")
- private Map<Contextual<?>, CreationalContext<?>>
getCreationalContextMap()
- {
- Flash flash = getFlash();
- Map<Contextual<?>, CreationalContext<?>> map =
(ConcurrentHashMap<Contextual<?>, CreationalContext<?>>) flash
- .get(CREATIONAL_MAP_NAME);
+ if (map == null)
+ {
+ map = new ConcurrentHashMap<Contextual<?>,
CreationalContext<?>>();
+ flash.put(CREATIONAL_MAP_NAME, map);
+ }
- if (map == null)
- {
- map = new ConcurrentHashMap<Contextual<?>,
CreationalContext<?>>();
- flash.put(CREATIONAL_MAP_NAME, map);
- }
+ return map;
+ }
- return map;
- }
-
}
Added:
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessage.java
===================================================================
--- modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessage.java
(rev 0)
+++
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessage.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -0,0 +1,159 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package org.jboss.seam.faces.display;
+
+/**
+ * @author <a href="mailto:lincolnbaxter@gmail.com>Lincoln Baxter,
III</a>
+ *
+ */
+public class SeamMessage implements Message
+{
+ private static final long serialVersionUID = 6650116552438358826L;
+
+ private String message;
+ private String details;
+ private String clientId;
+ private final Level level;
+
+ public SeamMessage(final Level level)
+ {
+ this.level = level;
+ }
+
+ public Message component(final String clientId)
+ {
+ this.clientId = clientId;
+ return this;
+ }
+
+ public Message details(final String details)
+ {
+ this.details = details;
+ return this;
+ }
+
+ public Message summary(final String message)
+ {
+ this.message = message;
+ return this;
+ }
+
+ /*
+ * Getters & Setters
+ */
+ public Level getLevel()
+ {
+ return level;
+ }
+
+ public String getMessage()
+ {
+ return message;
+ }
+
+ public String getDetails()
+ {
+ return details;
+ }
+
+ public String getClientId()
+ {
+ return clientId;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((clientId == null) ? 0 : clientId.hashCode());
+ result = prime * result + ((details == null) ? 0 : details.hashCode());
+ result = prime * result + ((level == null) ? 0 : level.hashCode());
+ result = prime * result + ((message == null) ? 0 : message.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (getClass() != obj.getClass())
+ {
+ return false;
+ }
+ SeamMessage other = (SeamMessage) obj;
+ if (clientId == null)
+ {
+ if (other.clientId != null)
+ {
+ return false;
+ }
+ }
+ else if (!clientId.equals(other.clientId))
+ {
+ return false;
+ }
+ if (details == null)
+ {
+ if (other.details != null)
+ {
+ return false;
+ }
+ }
+ else if (!details.equals(other.details))
+ {
+ return false;
+ }
+ if (level == null)
+ {
+ if (other.level != null)
+ {
+ return false;
+ }
+ }
+ else if (!level.equals(other.level))
+ {
+ return false;
+ }
+ if (message == null)
+ {
+ if (other.message != null)
+ {
+ return false;
+ }
+ }
+ else if (!message.equals(other.message))
+ {
+ return false;
+ }
+ return true;
+ }
+
+}
Added:
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessages.java
===================================================================
--- modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessages.java
(rev 0)
+++
modules/faces/trunk/impl/src/main/java/org/jboss/seam/faces/display/SeamMessages.java 2010-04-30
20:27:09 UTC (rev 12669)
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package org.jboss.seam.faces.display;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.enterprise.context.SessionScoped;
+import javax.enterprise.event.Observes;
+import javax.faces.application.FacesMessage;
+import javax.faces.event.PhaseEvent;
+
+import org.jboss.seam.faces.event.qualifier.Before;
+import org.jboss.seam.faces.event.qualifier.RenderResponse;
+
+/**
+ * @author <a href="mailto:lincolnbaxter@gmail.com>Lincoln Baxter,
III</a>
+ *
+ */
+@SessionScoped
+public class SeamMessages implements Messages, Serializable
+{
+ private static final long serialVersionUID = -2908193057765795662L;
+ private final Set<Message> messages = Collections.synchronizedSet(new
HashSet<Message>());
+
+ @SuppressWarnings("unused")
+ private void convert(@Observes @Before @RenderResponse final PhaseEvent event)
+ {
+ for (Message m : messages)
+ {
+ event.getFacesContext().addMessage(m.getClientId(), new
FacesMessage(m.getLevel().getSeverity(), m.getMessage(), m.getDetails()));
+ }
+ clear();
+ }
+
+ public void clear()
+ {
+ messages.clear();
+ }
+
+ public Message add(final Level level)
+ {
+ Message result = new SeamMessage(level);
+ messages.add(result);
+ return result;
+ }
+
+ public Set<Message> getAll()
+ {
+ Set<Message> result;
+ synchronized (messages)
+ {
+ result = Collections.unmodifiableSet(messages);
+ }
+ return result;
+ }
+
+}
Modified: modules/faces/trunk/impl/src/main/resources/META-INF/faces-config.xml
===================================================================
--- modules/faces/trunk/impl/src/main/resources/META-INF/faces-config.xml 2010-04-30
16:11:01 UTC (rev 12668)
+++ modules/faces/trunk/impl/src/main/resources/META-INF/faces-config.xml 2010-04-30
20:27:09 UTC (rev 12669)
@@ -42,6 +42,10 @@
<system-event-listener-class>org.jboss.seam.faces.event.DelegatingSystemEventListener</system-event-listener-class>
<system-event-class>javax.faces.event.PreDestroyCustomScopeEvent</system-event-class>
</system-event-listener>
+ <system-event-listener>
+ <system-event-listener-class>org.jboss.seam.faces.event.DelegatingSystemEventListener</system-event-listener-class>
+ <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class>
+ </system-event-listener>
</application>
<component>