in impl/src/main/java/org/apache/myfaces/view/facelets/tag/ui/IncludeHandler.java [104:265]
public void apply(FaceletContext ctx, UIComponent parent) throws IOException, FacesException, FaceletException,
ELException
{
AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
FaceletCompositionContext fcc = FaceletCompositionContext.getCurrentInstance(ctx);
String path;
boolean markInitialState = false;
String uniqueId = null;
if (!src.isLiteral())
{
uniqueId = actx.generateUniqueFaceletTagId(fcc.startComponentUniqueIdSection(), tagId);
}
else if (_params != null)
{
uniqueId = actx.generateUniqueFaceletTagId(fcc.generateUniqueComponentId(), tagId);
}
if (!src.isLiteral())
{
String restoredPath = (String) ComponentSupport.restoreInitialTagState(ctx, fcc, parent, uniqueId);
if (restoredPath != null)
{
// If is not restore view phase, the path value should be
// evaluated and if is not equals, trigger markInitialState stuff.
if (!PhaseId.RESTORE_VIEW.equals(ctx.getFacesContext().getCurrentPhaseId()))
{
path = this.src.getValue(ctx);
if (StringUtils.isBlank(path))
{
return;
}
if (!path.equals(restoredPath))
{
markInitialState = true;
}
}
else
{
path = restoredPath;
}
}
else
{
//No state restored, calculate path
path = this.src.getValue(ctx);
}
ComponentSupport.saveInitialTagState(ctx, fcc, parent, uniqueId, path);
}
else
{
path = this.src.getValue(ctx);
}
try
{
if (StringUtils.isBlank(path))
{
return;
}
VariableMapper orig = ctx.getVariableMapper();
ctx.setVariableMapper(new VariableMapperWrapper(orig));
try
{
URL url = null;
boolean oldMarkInitialState = false;
Boolean isBuildingInitialState = null;
// if we are in ProjectStage Development and the path equals "jakarta.faces.error.xhtml"
// we should include the default error page
if (ctx.getFacesContext().isProjectStage(ProjectStage.Development)
&& ERROR_PAGE_INCLUDE_PATH.equals(path))
{
url = ClassUtils.getResource(ERROR_FACELET);
}
if (markInitialState)
{
//set markInitialState flag
oldMarkInitialState = fcc.isMarkInitialState();
fcc.setMarkInitialState(true);
isBuildingInitialState = (Boolean) ctx.getFacesContext().getAttributes().put(
StateManager.IS_BUILDING_INITIAL_STATE, Boolean.TRUE);
}
try
{
if (_params != null)
{
// ui:include defines a new TemplateContext, but ui:param EL expressions
// defined inside should be built before the new context is setup, to
// apply then after. The final effect is EL expressions will be resolved
// correctly when nested ui:params with the same name or based on other
// ui:params are used.
String[] names = new String[_params.length];
ValueExpression[] values = new ValueExpression[_params.length];
for (int i = 0; i < _params.length; i++)
{
names[i] = _params[i].getName(ctx);
values[i] = _params[i].getValue(ctx);
}
actx.pushTemplateContext(new TemplateContextImpl());
for (int i = 0; i < _params.length; i++)
{
_params[i].apply(ctx, parent, names[i], values[i], uniqueId);
}
}
else
{
actx.pushTemplateContext(new TemplateContextImpl());
}
if (url == null)
{
ctx.includeFacelet(parent, path);
}
else
{
ctx.includeFacelet(parent, url);
}
}
finally
{
if (markInitialState)
{
//unset markInitialState flag
if (isBuildingInitialState == null)
{
ctx.getFacesContext().getAttributes().remove(
StateManager.IS_BUILDING_INITIAL_STATE);
}
else
{
ctx.getFacesContext().getAttributes().put(
StateManager.IS_BUILDING_INITIAL_STATE, isBuildingInitialState);
}
fcc.setMarkInitialState(oldMarkInitialState);
}
actx.popTemplateContext();
}
}
finally
{
ctx.setVariableMapper(orig);
}
}
finally
{
if (!src.isLiteral())
{
fcc.endComponentUniqueIdSection();
if (fcc.isUsingPSSOnThisView() && fcc.isRefreshTransientBuildOnPSS()
&& !fcc.isRefreshingTransientBuild())
{
//Mark the parent component to be saved and restored fully.
ComponentSupport.markComponentToRestoreFully(ctx.getFacesContext(), parent);
}
if (fcc.isDynamicComponentSection())
{
ComponentSupport.markComponentToRefreshDynamically(ctx.getFacesContext(), parent);
}
}
}
}