1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.view.facelets.tag.composite;
20
21 import java.beans.BeanDescriptor;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.logging.Level;
26 import java.util.logging.Logger;
27
28 import javax.faces.component.UIComponent;
29 import javax.faces.view.AttachedObjectTarget;
30 import javax.faces.view.facelets.FaceletContext;
31 import javax.faces.view.facelets.TagAttribute;
32 import javax.faces.view.facelets.TagConfig;
33 import javax.faces.view.facelets.TagHandler;
34
35 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
36 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
37 import org.apache.myfaces.view.facelets.FaceletCompositionContext;
38
39
40
41
42
43 @JSFFaceletTag(name="composite:clientBehavior")
44 public class ClientBehaviorHandler extends TagHandler implements InterfaceDescriptorCreator
45 {
46
47 private static final Logger log = Logger.getLogger(ClientBehaviorHandler.class.getName());
48
49
50
51
52
53
54
55
56
57 @JSFFaceletAttribute(name="event",
58 className="javax.el.ValueExpression",
59 deferredValueType="java.lang.String",
60 required=true)
61 protected final TagAttribute _event;
62
63
64
65
66
67
68
69
70 @JSFFaceletAttribute(name="name",
71 className="javax.el.ValueExpression",
72 deferredValueType="java.lang.String",
73 required=true)
74 protected final TagAttribute _name;
75
76
77
78
79
80
81
82 @JSFFaceletAttribute(name="default",
83 className="javax.el.ValueExpression",
84 deferredValueType="boolean")
85 protected final TagAttribute _default;
86
87
88
89
90
91
92
93 @JSFFaceletAttribute(name="targets",
94 className="javax.el.ValueExpression",
95 deferredValueType="java.lang.String")
96 protected final TagAttribute _targets;
97
98
99
100
101
102 private boolean _cacheable;
103
104 private ClientBehaviorAttachedObjectTargetImpl _target;
105
106 public ClientBehaviorHandler(TagConfig config)
107 {
108 super(config);
109 _name = getRequiredAttribute("name");
110 _event = getAttribute("event");
111 _default = getAttribute("default");
112 _targets = getAttribute("targets");
113 if (_name.isLiteral() &&
114 (_event == null || _event.isLiteral()) &&
115 (_default == null || _default.isLiteral() ))
116 {
117 _cacheable = true;
118 }
119 else
120 {
121 _cacheable = false;
122 }
123 }
124
125 @SuppressWarnings("unchecked")
126 public void apply(FaceletContext ctx, UIComponent parent)
127 throws IOException
128 {
129 UIComponent compositeBaseParent
130 = FaceletCompositionContext.getCurrentInstance(ctx).getCompositeComponentFromStack();
131
132 CompositeComponentBeanInfo beanInfo =
133 (CompositeComponentBeanInfo) compositeBaseParent.getAttributes()
134 .get(UIComponent.BEANINFO_KEY);
135
136 if (beanInfo == null)
137 {
138 if (log.isLoggable(Level.SEVERE))
139 {
140 log.severe("Cannot find composite bean descriptor UIComponent.BEANINFO_KEY ");
141 }
142 return;
143 }
144
145 BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
146
147
148 List<AttachedObjectTarget> targetList = (List<AttachedObjectTarget>)
149 beanDescriptor.getValue(
150 AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY);
151
152 if (targetList == null)
153 {
154
155 targetList = new ArrayList<AttachedObjectTarget>();
156 beanDescriptor.setValue(
157 AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY,
158 targetList);
159 }
160
161
162 if (isCacheable())
163 {
164 if (_target == null)
165 {
166 _target = createAttachedObjectTarget(ctx);
167 }
168 targetList.add(_target);
169 }
170 else
171 {
172 ClientBehaviorAttachedObjectTargetImpl target = createAttachedObjectTarget(ctx);
173 targetList.add(target);
174 }
175
176 this.nextHandler.apply(ctx, parent);
177 }
178
179 public boolean isCacheable()
180 {
181 return _cacheable;
182 }
183
184 public void setCacheable(boolean cacheable)
185 {
186 _cacheable = cacheable;
187 }
188
189
190
191
192
193
194
195 protected ClientBehaviorAttachedObjectTargetImpl createAttachedObjectTarget(FaceletContext ctx)
196 {
197 ClientBehaviorAttachedObjectTargetImpl target = new ClientBehaviorAttachedObjectTargetImpl();
198
199 if (_event != null)
200 {
201 target.setEvent(_event.getValueExpression(ctx, String.class));
202 }
203 if (_name != null)
204 {
205 target.setName(_name.getValueExpression(ctx, String.class));
206 }
207 if (_default != null)
208 {
209 target.setDefault(_default.getBoolean(ctx));
210 }
211 if (_targets != null)
212 {
213 target.setTargets(_targets.getValueExpression(ctx, String.class));
214 }
215 return target;
216 }
217 }