1 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 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 } 155 | Popular Tags |