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 javax.el.ELContext;
22 import javax.el.ExpressionFactory;
23 import javax.el.MethodExpression;
24 import javax.el.ValueExpression;
25 import javax.faces.FacesException;
26 import javax.faces.context.ExternalContext;
27 import javax.servlet.ServletContext;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31
32
33
34
35
36 public class Jsp20FacesInitializer extends AbstractFacesInitializer
37 {
38
39
40
41 private static final Log log = LogFactory.getLog(Jsp20FacesInitializer.class);
42
43
44
45
46 private static final String EL_RI_EXPRESSION_FACTORY_IMPL = "com.sun.el.ExpressionFactoryImpl";
47
48
49
50
51 private static final String JASPER_EL_EXPRESSION_FACTORY_IMPL = "org.apache.el.ExpressionFactoryImpl";
52
53
54
55
56 private static final String[] KNOWN_EXPRESSION_FACTORIES =
57 new String[] { EL_RI_EXPRESSION_FACTORY_IMPL, JASPER_EL_EXPRESSION_FACTORY_IMPL };
58
59
60 @Override
61 protected void initContainerIntegration(
62 ServletContext servletContext, ExternalContext externalContext)
63 {
64 if (log.isInfoEnabled()) {
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.isInfoEnabled()) {
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 if (log.isErrorEnabled()) {
86 log.error("No valid ExpressionFactory implementation is available "
87 + "but that's required as this application isn't running in a JSP 2.1 container.");
88 }
89
90
91 expressionFactory = new ErrorExpressionFactory();
92 }
93 }
94
95 if (log.isDebugEnabled()) {
96 log.debug("The following ExpressionFactory implementation will "
97 + "be used: '" + expressionFactory + "'.");
98 }
99
100 buildConfiguration(servletContext, externalContext, expressionFactory);
101 }
102
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 ExpressionFactory expressionFactory =
121 loadExpressionFactory(expressionFactoryClassName);
122 if (expressionFactory != null) {
123 return expressionFactory;
124 }
125 }
126
127 return null;
128 }
129
130
131
132
133
134
135
136
137 private class ErrorExpressionFactory extends ExpressionFactory
138 {
139
140 public Object coerceToType(Object obj, Class<?> targetType)
141 {
142 throw new FacesException("No valid ExpressionFactory implementation is available "
143 + "but that's required as this application isn't running in a JSP 2.1 container.");
144 }
145
146 public MethodExpression createMethodExpression(ELContext context,
147 String expression, Class<?> expectedReturnType, Class<?>[] expectedParamTypes)
148 {
149 throw new FacesException("No valid ExpressionFactory implementation is available "
150 + "but that's required as this application isn't running in a JSP 2.1 container.");
151 }
152
153 public ValueExpression createValueExpression(Object instance, Class<?> expectedType)
154 {
155 throw new FacesException("No valid ExpressionFactory implementation is available "
156 + "but that's required as this application isn't running in a JSP 2.1 container.");
157 }
158
159 public ValueExpression createValueExpression(
160 ELContext context, String expression, Class<?> expectedType)
161 {
162 throw new FacesException("No valid ExpressionFactory implementation is available "
163 + "but that's required as this application isn't running in a JSP 2.1 container.");
164 }
165
166 }
167
168 }