in impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentResourceTagHandler.java [545:756]
public boolean apply(FaceletContext ctx, UIComponent parent, String name)
throws IOException, FacesException, FaceletException, ELException
{
if (_dynamicCompositeComponent)
{
AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
FaceletCompositionContext fcc = actx.getFaceletCompositionContext();
UIComponent innerCompositeComponent = fcc.getCompositeComponentFromStack();
// In a programatical addition, the code that process the composite component only takes effect
// when the composite component is added to the view.
Integer step = (Integer) innerCompositeComponent.getAttributes().get(CREATE_CC_ON_POST_ADD_TO_VIEW);
if (step != null && step == 1)
{
if (name != null)
{
//1. Initialize map used to retrieve facets
if (innerCompositeComponent.getFacetCount() == 0)
{
checkFacetRequired(ctx, name);
return true;
}
UIComponent facet = innerCompositeComponent.getFacet(name);
if (facet != null)
{
// Insert facet
innerCompositeComponent.getFacets().remove(name);
parent.getFacets().put(name, facet);
return true;
}
else
{
checkFacetRequired(ctx, name);
return true;
}
}
else
{
if (innerCompositeComponent.getChildCount() > 0)
{
String facetName = (String) parent.getAttributes().get(
org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY);
// Insert children
List<UIComponent> children = new ArrayList<>(innerCompositeComponent.getChildCount());
while (innerCompositeComponent.getChildCount() > 0)
{
children.add(innerCompositeComponent.getChildren().remove(0));
}
while (!children.isEmpty())
{
UIComponent child = children.remove(0);
child.getAttributes().put(InsertChildrenHandler.INSERT_CHILDREN_USED, Boolean.TRUE);
if (facetName != null)
{
ComponentSupport.addFacet(ctx, parent, child, facetName);
}
else
{
parent.getChildren().add(child);
}
}
}
return true;
}
}
else if (step != null && step > 1)
{
// refresh case, in facet case it is not necessary to remove/add the facet, because there
// is no relative order (it is always on the same spot).
if (name == null)
{
String facetName = (String) parent.getAttributes().get(
org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY);
// refresh case, remember the inserted children does not have any
// associated tag handler, so in this case we just need to remove and add them in the same order
// we found them
List<UIComponent> children = null;
if (facetName == null)
{
children = new ArrayList<>(parent.getChildCount());
int i = 0;
while (parent.getChildCount()-i > 0)
{
UIComponent child = parent.getChildren().get(i);
if (Boolean.TRUE.equals(
child.getAttributes().get(InsertChildrenHandler.INSERT_CHILDREN_USED)))
{
children.add(parent.getChildren().remove(i));
}
else
{
i++;
}
}
}
else
{
children = new ArrayList<>();
UIComponent child = parent.getFacet(facetName);
if (Boolean.TRUE.equals(child.getAttributes().get(InsertChildrenHandler.INSERT_CHILDREN_USED)))
{
parent.getFacets().remove(facetName);
children.add(child);
}
else
{
UIComponent parentToApply = child;
int i = 0;
while (parentToApply.getChildCount()-i > 0)
{
child = parentToApply.getChildren().get(i);
if (Boolean.TRUE.equals(child.getAttributes().get(
InsertChildrenHandler.INSERT_CHILDREN_USED)))
{
children.add(parentToApply.getChildren().remove(i));
}
else
{
i++;
}
}
}
}
while (!children.isEmpty())
{
UIComponent child = children.remove(0);
if (facetName != null)
{
ComponentSupport.addFacet(ctx, parent, child, facetName);
}
else
{
parent.getChildren().add(child);
}
}
}
}
return true;
}
if (name != null)
{
//1. Initialize map used to retrieve facets
if (_facetHandlers == null || _facetHandlers.isEmpty())
{
checkFacetRequired(ctx, name);
return true;
}
initFacetHandlersMap(ctx);
FaceletHandler handler = _facetHandlersMap.get(name);
if (handler != null)
{
AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
// Pop the current composite component on stack, so #{cc} references
// can be resolved correctly, because they are relative to the page
// that define it.
FaceletCompositionContext fcc = actx.getFaceletCompositionContext();
UIComponent innerCompositeComponent = fcc.getCompositeComponentFromStack();
fcc.popCompositeComponentToStack();
// Pop the template context, so ui:xx tags and nested composite component
// cases could work correctly
TemplateContext itc = actx.popTemplateContext();
try
{
handler.apply(ctx, parent);
}
finally
{
actx.pushTemplateContext(itc);
fcc.pushCompositeComponentToStack(innerCompositeComponent);
}
return true;
}
else
{
checkFacetRequired(ctx, name);
return true;
}
}
else
{
AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
// Pop the current composite component on stack, so #{cc} references
// can be resolved correctly, because they are relative to the page
// that define it.
FaceletCompositionContext fcc = actx.getFaceletCompositionContext();
UIComponent innerCompositeComponent = fcc.getCompositeComponentFromStack();
fcc.popCompositeComponentToStack();
// Pop the template context, so ui:xx tags and nested composite component
// cases could work correctly
TemplateContext itc = actx.popTemplateContext();
try
{
for (int i = 0; i < _componentHandlers.size(); i++)
{
_componentHandlers.get(i).apply(ctx, parent);
}
}
finally
{
actx.pushTemplateContext(itc);
fcc.pushCompositeComponentToStack(innerCompositeComponent);
}
return true;
}
}