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);