Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }