You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/08/18 18:56:45 UTC

svn commit: r1159314 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite: CompositeComponentResourceTagHandler.java InsertFacetHandler.java RenderFacetHandler.java

Author: lu4242
Date: Thu Aug 18 16:56:45 2011
New Revision: 1159314

URL: http://svn.apache.org/viewvc?rev=1159314&view=rev
Log:
MYFACES-3284 honor cc:insertFacet "required" attribute and check other "required" attributes

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/RenderFacetHandler.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java?rev=1159314&r1=1159313&r2=1159314&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java Thu Aug 18 16:56:45 2011
@@ -22,6 +22,7 @@ import java.beans.BeanDescriptor;
 import java.beans.BeanInfo;
 import java.beans.PropertyDescriptor;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -269,6 +270,40 @@ public class CompositeComponentResourceT
                 nextHandler.apply(ctx, c);
             }
         }
+        
+        //Check for required facets
+        Map<String, PropertyDescriptor> facetPropertyDescriptorMap = (Map<String, PropertyDescriptor>)
+            beanDescriptor.getValue(UIComponent.FACETS_KEY);
+        
+        if (facetPropertyDescriptorMap != null)
+        {
+            List<String> facetsRequiredNotFound = null;
+            for (Map.Entry<String, PropertyDescriptor> entry : facetPropertyDescriptorMap.entrySet())
+            {
+                ValueExpression requiredExpr = (ValueExpression) entry.getValue().getValue("required");
+                if (requiredExpr != null)
+                {
+                    Boolean required = (Boolean) requiredExpr.getValue(ctx.getFacesContext().getELContext());
+                    if (Boolean.TRUE.equals(required))
+                    {
+                        initFacetHandlersMap(ctx);
+                        if (!_facetHandlersMap.containsKey(entry.getKey()))
+                        {
+                            if (facetsRequiredNotFound == null)
+                            {
+                                facetsRequiredNotFound = new ArrayList(facetPropertyDescriptorMap.size());
+                            }
+                            facetsRequiredNotFound.add(entry.getKey());
+                        }
+                        
+                    }
+                }
+            }
+            if (facetsRequiredNotFound != null && !facetsRequiredNotFound.isEmpty())
+            {
+                throw new TagException(getTag(), "The following facets are required by the component: "+facetsRequiredNotFound);
+            }
+        }
     }
     
     protected void applyCompositeComponentFacelet(FaceletContext faceletContext, UIComponent compositeComponentBase) 
@@ -379,6 +414,27 @@ public class CompositeComponentResourceT
         return m;
     }
     
+    private void initFacetHandlersMap(FaceletContext ctx)
+    {
+        if (_facetHandlersMap == null)
+        {
+            Map<String, FaceletHandler> map = new HashMap<String, FaceletHandler>();
+            
+            for (FaceletHandler handler : _facetHandlers)
+            {
+                if (handler instanceof javax.faces.view.facelets.FacetHandler )
+                {
+                    map.put( ((javax.faces.view.facelets.FacetHandler)handler).getFacetName(ctx), handler);
+                }
+                else if (handler instanceof InsertFacetHandler)
+                {
+                    map.put( ((InsertFacetHandler)handler).getFacetName(ctx), handler);
+                }
+            }
+            _facetHandlersMap = map;
+        }
+    }
+    
     public boolean apply(FaceletContext ctx, UIComponent parent, String name)
             throws IOException, FacesException, FaceletException, ELException
     {        
@@ -387,26 +443,11 @@ public class CompositeComponentResourceT
             //1. Initialize map used to retrieve facets
             if (_facetHandlers == null || _facetHandlers.isEmpty())
             {
+                checkFacetRequired(ctx, parent, name);
                 return true;
             }
-            
-            if (_facetHandlersMap == null)
-            {
-                Map<String, FaceletHandler> map = new HashMap<String, FaceletHandler>();
-                
-                for (FaceletHandler handler : _facetHandlers)
-                {
-                    if (handler instanceof javax.faces.view.facelets.FacetHandler )
-                    {
-                        map.put( ((javax.faces.view.facelets.FacetHandler)handler).getFacetName(ctx), handler);
-                    }
-                    else if (handler instanceof InsertFacetHandler)
-                    {
-                        map.put( ((InsertFacetHandler)handler).getFacetName(ctx), handler);
-                    }
-                }
-                _facetHandlersMap = map;
-            }
+
+            initFacetHandlersMap(ctx);
 
             FaceletHandler handler = _facetHandlersMap.get(name);
 
@@ -436,6 +477,7 @@ public class CompositeComponentResourceT
             }
             else
             {
+                checkFacetRequired(ctx, parent, name);
                 return true;
             }
         }
@@ -466,4 +508,31 @@ public class CompositeComponentResourceT
             return true;
         }
     }
+    
+    private void checkFacetRequired(FaceletContext ctx, UIComponent parent, String name)
+    {
+        AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
+        FaceletCompositionContext fcc = actx.getFaceletCompositionContext(); 
+        UIComponent innerCompositeComponent = fcc.getCompositeComponentFromStack();
+        
+        CompositeComponentBeanInfo beanInfo = 
+            (CompositeComponentBeanInfo) innerCompositeComponent.getAttributes()
+            .get(UIComponent.BEANINFO_KEY);
+        
+        BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
+        
+        Map<String, PropertyDescriptor> insertFacetPropertyDescriptorMap = (Map<String, PropertyDescriptor>)
+            beanDescriptor.getValue(InsertFacetHandler.INSERT_FACET_KEYS);
+
+        if (insertFacetPropertyDescriptorMap != null && insertFacetPropertyDescriptorMap.containsKey(name))
+        {
+            ValueExpression requiredExpr = (ValueExpression) insertFacetPropertyDescriptorMap.get(name).getValue("required");
+            
+            if (requiredExpr != null && Boolean.TRUE.equals(requiredExpr.getValue(ctx.getFacesContext().getELContext())))
+            {
+                //Insert facet associated is required, but it was not applied.
+                throw new TagException(this.tag, "Cannot find facet with name '"+name+"' in composite component");
+            }
+        }
+    }
 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java?rev=1159314&r1=1159313&r2=1159314&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java Thu Aug 18 16:56:45 2011
@@ -19,9 +19,13 @@
 package org.apache.myfaces.view.facelets.tag.composite;
 
 import java.beans.BeanDescriptor;
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -29,6 +33,7 @@ import javax.faces.component.UIComponent
 import javax.faces.view.facelets.FaceletContext;
 import javax.faces.view.facelets.TagAttribute;
 import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagException;
 import javax.faces.view.facelets.TagHandler;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
@@ -51,6 +56,12 @@ public class InsertFacetHandler extends 
     
     public static String INSERT_FACET_USED = "org.apache.myfaces.INSERT_FACET_USED";
     
+    /**
+     * Key used to save on bean descriptor a map containing the metadata
+     * information related to this tag. It will be used later to check "required" property.
+     */
+    public static String INSERT_FACET_KEYS = "org.apache.myfaces.INSERT_FACET_KEYS";
+    
     private static final Logger log = Logger.getLogger(InsertFacetHandler.class.getName());
     
     /**
@@ -120,6 +131,18 @@ public class InsertFacetHandler extends 
             }
             
             facetList.add(facetName);
+
+            Map<String, PropertyDescriptor> insertFacetPropertyDescriptorMap = (Map<String, PropertyDescriptor>)
+                beanDescriptor.getValue(INSERT_FACET_KEYS);
+        
+            if (insertFacetPropertyDescriptorMap == null)
+            {
+                insertFacetPropertyDescriptorMap = new HashMap<String, PropertyDescriptor>();
+                beanDescriptor.setValue(INSERT_FACET_KEYS, insertFacetPropertyDescriptorMap);
+            }
+            
+            PropertyDescriptor facetDescriptor = _createFacetPropertyDescriptor(facetName, ctx, parent);
+            insertFacetPropertyDescriptorMap.put(facetName, facetDescriptor);
         }
         else
         {
@@ -136,6 +159,31 @@ public class InsertFacetHandler extends 
         
     }
     
+    private PropertyDescriptor _createFacetPropertyDescriptor(String facetName, FaceletContext ctx, UIComponent parent)
+    throws TagException, IOException
+    {
+        try
+        {
+            CompositeComponentPropertyDescriptor facetPropertyDescriptor = 
+                new CompositeComponentPropertyDescriptor(facetName);
+            
+            if (_required != null)
+            {
+                facetPropertyDescriptor.setValue("required", _required.getValueExpression(ctx, Boolean.class));
+            }
+            
+            return facetPropertyDescriptor;
+        }
+        catch (IntrospectionException e)
+        {
+            if (log.isLoggable(Level.SEVERE))
+            {
+                log.log(Level.SEVERE, "Cannot create PropertyDescriptor for attribute ",e);
+            }
+            throw new TagException(tag,e);
+        }
+    }
+    
     /*
     public void apply(FaceletContext ctx, UIComponent parent)
             throws IOException

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/RenderFacetHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/RenderFacetHandler.java?rev=1159314&r1=1159313&r2=1159314&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/RenderFacetHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/RenderFacetHandler.java Thu Aug 18 16:56:45 2011
@@ -129,8 +129,7 @@ public class RenderFacetHandler extends 
     
             if (_required != null && _required.getBoolean(ctx) && parentCompositeComponent.getFacet(facetName) == null)
             {
-                throw new TagException(this.tag, "Cannot find facet with name "+facetName+" in composite component "
-                        +parentCompositeComponent.getClientId(ctx.getFacesContext()));
+                throw new TagException(this.tag, "Cannot find facet with name '"+facetName+"' in composite component");
             }
             
             c.getAttributes().put(UIComponent.FACETS_KEY, facetName);