1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.webapp;
20
21 import java.util.logging.Level;
22 import java.util.logging.Logger;
23
24 import javax.el.ELContext;
25 import javax.el.ExpressionFactory;
26 import javax.el.MethodExpression;
27 import javax.el.ValueExpression;
28 import javax.faces.FacesException;
29 import javax.faces.context.ExternalContext;
30 import javax.servlet.ServletContext;
31
32
33
34
35
36 public class Jsp20FacesInitializer extends AbstractFacesInitializer
37 {
38
39
40
41
42 private static final Logger log = Logger.getLogger(Jsp20FacesInitializer.class.getName());
43
44
45
46
47 private static final String EL_RI_EXPRESSION_FACTORY_IMPL = "com.sun.el.ExpressionFactoryImpl";
48
49
50
51
52 private static final String JASPER_EL_EXPRESSION_FACTORY_IMPL = "org.apache.el.ExpressionFactoryImpl";
53
54
55
56
57 private static final String[] KNOWN_EXPRESSION_FACTORIES =
58 new String[] { EL_RI_EXPRESSION_FACTORY_IMPL, JASPER_EL_EXPRESSION_FACTORY_IMPL };
59
60 @Override
61 protected void initContainerIntegration(ServletContext servletContext, ExternalContext externalContext)
62 {
63 if (log.isLoggable(Level.INFO))
64 {
65 log.info("This application isn't running in a JSP 2.1 container.");
66 }
67
68
69
70
71
72
73
74 ExpressionFactory expressionFactory = getUserDefinedExpressionFactory(externalContext);
75
76 if (expressionFactory == null) {
77 if (log.isLoggable(Level.INFO)) {
78 log.info("Either you haven't specified the ExpressionFactory implementation, or an "
79 + "error occured while instantiating the implementation you've specified. "
80 + "However, attempting to load a known implementation.");
81 }
82
83 expressionFactory = findExpressionFactory(KNOWN_EXPRESSION_FACTORIES);
84 if (expressionFactory == null)
85 {
86 if (log.isLoggable(Level.SEVERE))
87 {
88 log.severe("No valid ExpressionFactory implementation is available "
89 + "but that's required as this application isn't running in a JSP 2.1 container.");
90 }
91
92
93 expressionFactory = new ErrorExpressionFactory();
94 }
95 }
96
97 if (log.isLoggable(Level.FINE))
98 {
99 log.fine("The following ExpressionFactory implementation will " + "be used: '" + expressionFactory + "'.");
100 }
101
102 buildConfiguration(servletContext, externalContext, expressionFactory);
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117 private static ExpressionFactory findExpressionFactory(String[] expressionFactoryClassNames)
118 {
119 for (String expressionFactoryClassName : expressionFactoryClassNames)
120 {
121 ExpressionFactory expressionFactory = loadExpressionFactory(expressionFactoryClassName);
122 if (expressionFactory != null)
123 {
124 return expressionFactory;
125 }
126 }
127
128 return null;
129 }
130
131
132
133
134
135
136
137 private class ErrorExpressionFactory extends ExpressionFactory
138 {
139
140 @Override
141 public Object coerceToType(Object obj, Class<?> targetType)
142 {
143 throw new FacesException("No valid ExpressionFactory implementation is available "
144 + "but that's required as this application isn't running in a JSP 2.1 container.");
145 }
146
147 @Override
148 public MethodExpression createMethodExpression(ELContext context, String expression,
149 Class<?> expectedReturnType, Class<?>[] expectedParamTypes)
150 {
151 throw new FacesException("No valid ExpressionFactory implementation is available "
152 + "but that's required as this application isn't running in a JSP 2.1 container.");
153 }
154
155 @Override
156 public ValueExpression createValueExpression(Object instance, Class<?> expectedType)
157 {
158 throw new FacesException("No valid ExpressionFactory implementation is available "
159 + "but that's required as this application isn't running in a JSP 2.1 container.");
160 }
161
162 @Override
163 public ValueExpression createValueExpression(ELContext context, String expression, Class<?> expectedType)
164 {
165 throw new FacesException("No valid ExpressionFactory implementation is available "
166 + "but that's required as this application isn't running in a JSP 2.1 container.");
167 }
168
169 }
170
171 }