1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package javax.faces.view.facelets; 20 21 import javax.faces.component.UIComponent; 22 23 /** 24 * Implementation of the tag logic used in the JSF specification. This is your golden hammer for wiring UIComponents to 25 * Facelets. 26 */ 27 public class ComponentHandler extends DelegatingMetaTagHandler 28 { 29 private ComponentConfig config; 30 private TagHandlerDelegate helper; 31 32 public ComponentHandler(ComponentConfig config) 33 { 34 super(config); 35 36 this.config = config; 37 38 } 39 40 public ComponentConfig getComponentConfig() 41 { 42 return config; 43 } 44 45 public static boolean isNew(UIComponent component) 46 { 47 // -= Leonardo Uribe =- It seems org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport.isNew(UIComponent) 48 // has been moved to this location. 49 // Originally this method was called from all tags that generate any kind of listeners 50 // (f:actionListener, f:phaseListener, f:setPropertyActionListener, f:valueChangeListener). 51 // This method prevent add listener when a facelet is applied twice. 52 // On MYFACES-2502 there is an explanation about where this is useful (partial state saving disabled). 53 // return component != null && component.getParent() == null; 54 if (component != null) 55 { 56 UIComponent parent = component.getParent(); 57 if (parent == null) 58 { 59 return true; 60 } 61 else 62 { 63 // When a composite component is used, we could have tags attaching 64 // objects or doing some operation on composite:implementation body 65 // like this: 66 // <composite:implementation> 67 // <f:event ...../> 68 // </composite:implementation> 69 // This case is valid, but the parent is the UIPanel inside 70 // UIComponent.COMPOSITE_FACET_NAME facet key of the composite component. 71 // So in this case we have to check if the component is a composite component 72 // or not and if so, try to get the parent again. 73 if (UIComponent.isCompositeComponent(parent)) 74 { 75 parent = parent.getParent(); 76 if (parent == null) 77 { 78 return true; 79 } 80 else 81 { 82 return false; 83 } 84 } 85 else 86 { 87 return false; 88 } 89 } 90 } 91 else 92 { 93 return false; 94 } 95 } 96 97 public void onComponentCreated(FaceletContext ctx, UIComponent c, UIComponent parent) 98 { 99 // no-op. 100 } 101 102 public void onComponentPopulated(FaceletContext ctx, UIComponent c, UIComponent parent) 103 { 104 // no-op. 105 } 106 107 protected TagHandlerDelegate getTagHandlerDelegate() 108 { 109 if (helper == null) 110 { 111 // Spec seems to indicate that the helper is created here, as opposed to other Handler 112 // instances, where it's presumably a new instance for every getter call. 113 114 this.helper = delegateFactory.createComponentHandlerDelegate (this); 115 } 116 return helper; 117 } 118 119 /** 120 * 121 * @since 2.2 122 * @param ctx 123 * @return 124 */ 125 public UIComponent createComponent(FaceletContext ctx) 126 { 127 return null; 128 } 129 }