[seam-commits] Seam SVN: r12669 - in modules/faces/trunk: api/src/main/java/org/jboss/seam/faces/display and 3 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Fri Apr 30 16:27:10 EDT 2010


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 at 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 at 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>&lt;h:message for="clientId" /&gt;</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>&lt;h:messages /&gt;</code> tag
+ * in any given View.
+ * 
+ * @author <a href="mailto:lincolnbaxter at 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 at 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 at gmail.com>Lincoln Baxter, III</a>
+ * 
+ */
+ at 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>



More information about the seam-commits mailing list