Source code: com/sun/facelets/tag/jsf/ValueHolderRule.java
1 /**
2 * Licensed under the Common Development and Distribution License,
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://www.sun.com/cddl/
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11 * implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15 package com.sun.facelets.tag.jsf;
16
17 import javax.faces.component.UIComponent;
18 import javax.faces.component.ValueHolder;
19 import javax.faces.convert.Converter;
20
21 import com.sun.facelets.FaceletContext;
22 import com.sun.facelets.el.LegacyValueBinding;
23 import com.sun.facelets.tag.TagAttribute;
24 import com.sun.facelets.tag.Metadata;
25 import com.sun.facelets.tag.MetaRule;
26 import com.sun.facelets.tag.MetadataTarget;
27 import com.sun.facelets.util.FacesAPI;
28
29 /**
30 *
31 * @author Jacob Hookom
32 * @version $Id: ValueHolderRule.java,v 1.3 2006/05/03 04:03:36 jhook Exp $
33 */
34 final class ValueHolderRule extends MetaRule {
35
36 final static class LiteralConverterMetadata extends Metadata {
37
38 private final String converterId;
39
40 public LiteralConverterMetadata(String converterId) {
41 this.converterId = converterId;
42 }
43
44 public void applyMetadata(FaceletContext ctx, Object instance) {
45 ((ValueHolder) instance).setConverter(ctx.getFacesContext()
46 .getApplication().createConverter(this.converterId));
47 }
48 }
49
50 final static class DynamicConverterMetadata extends Metadata {
51
52 private final TagAttribute attr;
53
54 public DynamicConverterMetadata(TagAttribute attr) {
55 this.attr = attr;
56 }
57
58 public void applyMetadata(FaceletContext ctx, Object instance) {
59 ((UIComponent) instance).setValueBinding("converter",
60 new LegacyValueBinding(attr.getValueExpression(ctx,
61 Converter.class)));
62 }
63 }
64
65 final static class DynamicConverterMetadata2 extends Metadata {
66
67 private final TagAttribute attr;
68
69 public DynamicConverterMetadata2(TagAttribute attr) {
70 this.attr = attr;
71 }
72
73 public void applyMetadata(FaceletContext ctx, Object instance) {
74 ((UIComponent) instance).setValueExpression("converter", attr
75 .getValueExpression(ctx, Converter.class));
76 }
77 }
78
79 final static class LiteralValueMetadata extends Metadata {
80
81 private final String value;
82
83 public LiteralValueMetadata(String value) {
84 this.value = value;
85 }
86
87 public void applyMetadata(FaceletContext ctx, Object instance) {
88 ((ValueHolder) instance).setValue(this.value);
89 }
90 }
91
92 final static class DynamicValueExpressionMetadata extends Metadata {
93
94 private final TagAttribute attr;
95
96 public DynamicValueExpressionMetadata(TagAttribute attr) {
97 this.attr = attr;
98 }
99
100 public void applyMetadata(FaceletContext ctx, Object instance) {
101 ((UIComponent) instance).setValueExpression("value", attr
102 .getValueExpression(ctx, Object.class));
103 }
104 }
105
106 final static class DynamicValueBindingMetadata extends Metadata {
107
108 private final TagAttribute attr;
109
110 public DynamicValueBindingMetadata(TagAttribute attr) {
111 this.attr = attr;
112 }
113
114 public void applyMetadata(FaceletContext ctx, Object instance) {
115 ((UIComponent) instance).setValueBinding("value",
116 new LegacyValueBinding(attr.getValueExpression(ctx,
117 Object.class)));
118 }
119 }
120
121 public final static ValueHolderRule Instance = new ValueHolderRule();
122
123 public Metadata applyRule(String name, TagAttribute attribute,
124 MetadataTarget meta) {
125 if (meta.isTargetInstanceOf(ValueHolder.class)) {
126
127 if ("converter".equals(name)) {
128 if (attribute.isLiteral()) {
129 return new LiteralConverterMetadata(attribute.getValue());
130 } else {
131 if (FacesAPI.getComponentVersion(meta.getTargetClass()) >= 12) {
132 return new DynamicConverterMetadata2(attribute);
133 } else {
134 return new DynamicConverterMetadata(attribute);
135 }
136 }
137 }
138
139 if ("value".equals(name)) {
140 if (attribute.isLiteral()) {
141 return new LiteralValueMetadata(attribute.getValue());
142 } else {
143 if (FacesAPI.getComponentVersion(meta.getTargetClass()) >= 12) {
144 return new DynamicValueExpressionMetadata(attribute);
145 } else {
146 return new DynamicValueBindingMetadata(attribute);
147 }
148 }
149 }
150 }
151 return null;
152 }
153
154 }