protected void assignUniqueId(FaceletContext ctx, UIComponent parent, String id, UIComponent c) { // If the id is specified as a literal, and the component is being // repeated (by c:forEach, for example), use generated unique ids // after the first instance if (this.id != null && !(this.id.isLiteral() && ComponentSupport.getNeedUniqueIds(ctx))) { c.setId(this.id.getValue(ctx)); } else { UIViewRoot root = ComponentSupport.getViewRoot(ctx, parent); if (root != null) { String uid; IdMapper mapper = IdMapper.getMapper(ctx.getFacesContext()); String mid = ((mapper != null) ? mapper.getAliasedId(id) : id); UIComponent ancestorNamingContainer = parent.getNamingContainer(); if (null != ancestorNamingContainer && ancestorNamingContainer instanceof UniqueIdVendor) { uid = ((UniqueIdVendor) ancestorNamingContainer).createUniqueId(ctx.getFacesContext(), mid); } else { uid = root.createUniqueId(ctx.getFacesContext(), mid); } c.setId(uid); } } if (this.rendererType != null) { c.setRendererType(this.rendererType); } }
protected void addComponentToView( FaceletContext ctx, UIComponent parent, UIComponent c, boolean componentFound) { FacesContext context = ctx.getFacesContext(); boolean suppressEvents = ComponentSupport.suppressViewModificationEvents(context); boolean compcomp = UIComponent.isCompositeComponent(c); if (suppressEvents && componentFound && !compcomp) { context.setProcessingEvents(false); } ComponentSupport.addComponent(ctx, parent, c); if (suppressEvents && componentFound && !compcomp) { context.setProcessingEvents(true); } }
@SuppressWarnings({"UnusedDeclaration"}) protected UIComponent findReparentedComponent( FaceletContext ctx, UIComponent parent, String tagId) { UIComponent facet = parent.getFacets().get(UIComponent.COMPOSITE_FACET_NAME); if (facet != null) { UIComponent newParent = facet.findComponent((String) parent.getAttributes().get(tagId)); if (newParent != null) return ComponentSupport.findChildByTagId(newParent, tagId); } return null; }
protected void doOrphanedChildCleanup(FaceletContext ctx, UIComponent parent, UIComponent c) { ComponentSupport.finalizeForDeletion(c); if (getFacetName(parent) == null) { FacesContext context = ctx.getFacesContext(); boolean suppressEvents = ComponentSupport.suppressViewModificationEvents(context); if (suppressEvents) { // if the component has already been found, it will be removed // and added back to the view. We don't want to publish events // for this case. context.setProcessingEvents(false); } // suppress the remove event for this case since it will be re-added parent.getChildren().remove(c); if (suppressEvents) { // re-enable event processing context.setProcessingEvents(true); } } }
protected void doExistingComponentActions(FaceletContext ctx, String id, UIComponent c) { // mark all children for cleaning if (log.isLoggable(Level.FINE)) { log.fine(owner.getTag() + " Component[" + id + "] Found, marking children for cleanup"); } ComponentSupport.markForDeletion(c); /* * Repply the id, for the case when the component tree was changed, and the id's are set explicitly. */ if (this.id != null) { c.setId(this.id.getValue(ctx)); } }
@SuppressWarnings({"UnusedDeclaration"}) protected UIComponent findChild(FaceletContext ctx, UIComponent parent, String tagId) { return ComponentSupport.findChildByTagId(parent, tagId); }
/** * Method handles UIComponent tree creation in accordance with the JSF 1.2 spec. * * <ol> * <li>First determines this UIComponent's id by calling {@link * javax.faces.view.facelets.ComponentHandler#getTagId()}. * <li>Search the parent for an existing UIComponent of the id we just grabbed * <li>If found, {@link * com.sun.faces.facelets.tag.jsf.ComponentSupport#markForDeletion(javax.faces.component.UIComponent) * mark} its children for deletion. * <li>If <i>not</i> found, call {@link #createComponent(FaceletContext) createComponent}. * <ol> * <li>Only here do we apply {@link * com.sun.faces.facelets.tag.MetaTagHandlerImpl#setAttributes(FaceletContext, * Object)} * <li>Set the UIComponent's id * <li>Set the RendererType of this instance * </ol> * <li>Now apply the nextHandler, passing the UIComponent we've created/found. * <li>Now add the UIComponent to the passed parent * <li>Lastly, if the UIComponent already existed (found), then {@link * ComponentSupport#finalizeForDeletion(UIComponent) finalize} for deletion. * </ol> * * @throws TagException if the UIComponent parent is null */ @Override public void apply(FaceletContext ctx, UIComponent parent) throws IOException { FacesContext context = ctx.getFacesContext(); // make sure our parent is not null if (parent == null) { throw new TagException(owner.getTag(), "Parent UIComponent was null"); } // our id String id = ctx.generateUniqueId(owner.getTagId()); // grab our component UIComponent c = findChild(ctx, parent, id); if (null == c && context.isPostback() && UIComponent.isCompositeComponent(parent) && parent.getAttributes().get(id) != null) { c = findReparentedComponent(ctx, parent, id); } else { /** * If we found a child that is dynamic, the actual parent might have changed, so we need to * remove it from the actual parent. The reapplyDynamicActions will then replay the actions * and will make sure it ends up in the correct order. */ if (c != null && c.getParent() != parent && c.getAttributes().containsKey(DYNAMIC_COMPONENT)) { c.getParent().getChildren().remove(c); } } boolean componentFound = false; if (c != null) { componentFound = true; doExistingComponentActions(ctx, id, c); } else { c = this.createComponent(ctx); doNewComponentActions(ctx, id, c); assignUniqueId(ctx, parent, id, c); // hook method owner.onComponentCreated(ctx, c, parent); } CompositeComponentStackManager ccStackManager = CompositeComponentStackManager.getManager(context); boolean compcompPushed = pushComponentToEL(ctx, c, ccStackManager); if (ProjectStage.Development == context.getApplication().getProjectStage()) { ComponentSupport.setTagForComponent(context, c, this.owner.getTag()); } // If this this a naming container, stop generating unique Ids // for the repeated tags boolean setUniqueIds = false; boolean oldUnique = false; if (c instanceof NamingContainer) { oldUnique = ComponentSupport.setNeedUniqueIds(ctx, false); setUniqueIds = true; } try { // first allow c to get populated owner.applyNextHandler(ctx, c); } finally { if (setUniqueIds) ComponentSupport.setNeedUniqueIds(ctx, oldUnique); } // finish cleaning up orphaned children if (componentFound) { doOrphanedChildCleanup(ctx, parent, c); } this.privateOnComponentPopulated(ctx, c); owner.onComponentPopulated(ctx, c, parent); // add to the tree afterwards // this allows children to determine if it's // been part of the tree or not yet addComponentToView(ctx, parent, c, componentFound); adjustIndexOfDynamicChildren(context, c); popComponentFromEL(ctx, c, ccStackManager, compcompPushed); }