@Override public MetaRuleset createMetaRuleset(Class type) { Util.notNull("type", type); MetaRuleset m = new MetaRulesetImpl(owner.getTag(), type); // ignore standard component attributes m.ignore("binding").ignore("id"); // add auto wiring for attributes m.addRule(ComponentRule.Instance); // if it's an ActionSource if (ActionSource.class.isAssignableFrom(type)) { m.addRule(ActionSourceRule.Instance); } // if it's a ValueHolder if (ValueHolder.class.isAssignableFrom(type)) { m.addRule(ValueHolderRule.Instance); // if it's an EditableValueHolder if (EditableValueHolder.class.isAssignableFrom(type)) { m.ignore("submittedValue"); m.ignore("valid"); m.addRule(EditableValueHolderRule.Instance); } } // if it's a selectone or selectmany if (UISelectOne.class.isAssignableFrom(type) || UISelectMany.class.isAssignableFrom(type)) { m.addRule(RenderPropertyRule.Instance); } return m; }
protected void doNewComponentActions(FaceletContext ctx, String id, UIComponent c) { if (log.isLoggable(Level.FINE)) { log.fine(owner.getTag() + " Component[" + id + "] Created: " + c.getClass().getName()); } // If this is NOT a composite component... if (null == createCompositeComponentDelegate) { // set the attributes and properties into the UIComponent instance. owner.setAttributes(ctx, c); } // otherwise, allow the composite component code to do it. // mark it owned by a facelet instance c.getAttributes().put(ComponentSupport.MARK_CREATED, id); if (ctx.getFacesContext().isProjectStage(ProjectStage.Development)) { // inject the location into the component c.getAttributes().put(UIComponent.VIEW_LOCATION_KEY, owner.getTag().getLocation()); } }
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)); } }
/** * 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); }