1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.orchestra.conversation.jsf.components.facelets;
21
22 import java.io.IOException;
23
24 import javax.el.ELException;
25 import javax.faces.FacesException;
26 import javax.faces.application.Application;
27 import javax.faces.component.EditableValueHolder;
28 import javax.faces.component.UIComponent;
29 import javax.faces.context.FacesContext;
30 import javax.faces.convert.Converter;
31 import javax.faces.view.facelets.FaceletContext;
32 import javax.faces.view.facelets.FaceletException;
33 import javax.faces.view.facelets.TagAttribute;
34 import javax.faces.view.facelets.TagConfig;
35 import javax.faces.view.facelets.TagHandler;
36
37 import org.apache.myfaces.orchestra.lib.jsf.SerializableConverter;
38
39 public class ConverterTagHandler extends TagHandler
40 {
41 private final TagAttribute beanName;
42 private final TagAttribute useWrapper;
43
44 public ConverterTagHandler(TagConfig config)
45 {
46 super(config);
47 beanName = getRequiredAttribute("beanName");
48 useWrapper = getAttribute("useWrapper");
49 }
50
51 public void apply(FaceletContext faceletContext, UIComponent parent)
52 throws IOException, FacesException, FaceletException, ELException
53 {
54 if (parent.getParent() == null)
55 {
56 if (parent instanceof EditableValueHolder)
57 {
58 Converter converter = createConverter(beanName.getValue());
59
60 if (useWrapper == null || !"false".equals(useWrapper.getValue()) &&
61 !(converter instanceof SerializableConverter))
62 {
63
64
65
66
67 converter = new SerializableConverter(beanName.getValue(), converter);
68 }
69
70 ((EditableValueHolder) parent).setConverter(converter);
71 }
72 else
73 {
74 throw new FacesException("parent is not an EditableValueHolder");
75 }
76 }
77 }
78
79
80
81
82 protected static Converter createConverter(String beanName)
83 {
84 FacesContext facesContext = FacesContext.getCurrentInstance();
85 Application application = facesContext.getApplication();
86 Object converter = application.getVariableResolver().resolveVariable(facesContext, beanName);
87 return (Converter) converter;
88 }
89 }