1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.application;
20
21 import javax.faces.application.ProjectStage;
22 import javax.faces.application.ResourceHandler;
23 import javax.faces.context.FacesContext;
24 import org.apache.myfaces.resource.ClassLoaderContractResourceLoader;
25 import org.apache.myfaces.resource.ExternalContextContractResourceLoader;
26 import org.apache.myfaces.resource.FacesFlowClassLoaderResourceLoader;
27
28 import org.apache.myfaces.resource.InternalClassLoaderResourceLoader;
29 import org.apache.myfaces.resource.RootExternalContextResourceLoader;
30 import org.apache.myfaces.resource.TempDirFileCacheContractResourceLoader;
31 import org.apache.myfaces.resource.TempDirFileCacheResourceLoader;
32 import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
33 import org.apache.myfaces.shared.resource.BaseResourceHandlerSupport;
34 import org.apache.myfaces.shared.resource.ClassLoaderResourceLoader;
35 import org.apache.myfaces.shared.resource.ContractResourceLoader;
36 import org.apache.myfaces.shared.resource.ExternalContextResourceLoader;
37 import org.apache.myfaces.shared.resource.ResourceLoader;
38 import org.apache.myfaces.shared.util.WebConfigParamUtils;
39
40
41
42
43
44
45
46
47 public class DefaultResourceHandlerSupport extends BaseResourceHandlerSupport
48 {
49
50 private static final String META_INF_RESOURCES = "META-INF/resources";
51 private static final String RESOURCES = "resources";
52 private static final String META_INF_INTERNAL_RESOURCES = "META-INF/internal-resources";
53 private static final String META_INF_CONTRACTS = "META-INF/contracts";
54 private static final String CONTRACTS = "contracts";
55
56 private ResourceLoader[] _resourceLoaders;
57
58 private ContractResourceLoader[] _contractResourceLoaders;
59
60 private ResourceLoader[] _viewResourceLoaders;
61
62 public DefaultResourceHandlerSupport()
63 {
64 super();
65 }
66
67 public ResourceLoader[] getResourceLoaders()
68 {
69 if (_resourceLoaders == null)
70 {
71 FacesContext facesContext = FacesContext.getCurrentInstance();
72
73 String directory = WebConfigParamUtils.getStringInitParameter(facesContext.getExternalContext(),
74 ResourceHandler.WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME, RESOURCES);
75
76 if (TempDirFileCacheResourceLoader.isValidCreateTemporalFiles(facesContext))
77 {
78
79
80 String renderedJSFJS = WebConfigParamUtils.getStringInitParameter(facesContext.getExternalContext(),
81 InternalClassLoaderResourceLoader.MYFACES_JSF_MODE,
82 ResourceUtils.JSF_MYFACES_JSFJS_NORMAL);
83
84 if (facesContext.isProjectStage(ProjectStage.Development) ||
85 !renderedJSFJS.equals(ResourceUtils.JSF_MYFACES_JSFJS_NORMAL))
86 {
87 _resourceLoaders = new ResourceLoader[] {
88 new TempDirFileCacheResourceLoader(new ExternalContextResourceLoader("/"+directory)),
89 new TempDirFileCacheResourceLoader(new FacesFlowClassLoaderResourceLoader()),
90 new TempDirFileCacheResourceLoader(
91 new InternalClassLoaderResourceLoader(META_INF_INTERNAL_RESOURCES)),
92 new TempDirFileCacheResourceLoader(new ClassLoaderResourceLoader(META_INF_RESOURCES))
93 };
94 }
95 else
96 {
97 _resourceLoaders = new ResourceLoader[] {
98 new TempDirFileCacheResourceLoader(new ExternalContextResourceLoader("/"+directory)),
99 new TempDirFileCacheResourceLoader(new FacesFlowClassLoaderResourceLoader()),
100 new TempDirFileCacheResourceLoader(new ClassLoaderResourceLoader(META_INF_RESOURCES))
101 };
102 }
103 }
104 else
105 {
106
107
108 String renderedJSFJS = WebConfigParamUtils.getStringInitParameter(facesContext.getExternalContext(),
109 InternalClassLoaderResourceLoader.MYFACES_JSF_MODE,
110 ResourceUtils.JSF_MYFACES_JSFJS_NORMAL);
111
112 if (facesContext.isProjectStage(ProjectStage.Development) ||
113 !renderedJSFJS.equals(ResourceUtils.JSF_MYFACES_JSFJS_NORMAL))
114 {
115 _resourceLoaders = new ResourceLoader[] {
116 new ExternalContextResourceLoader("/"+directory),
117 new FacesFlowClassLoaderResourceLoader(),
118 new InternalClassLoaderResourceLoader(META_INF_INTERNAL_RESOURCES),
119 new ClassLoaderResourceLoader(META_INF_RESOURCES)
120 };
121 }
122 else
123 {
124 _resourceLoaders = new ResourceLoader[] {
125 new ExternalContextResourceLoader("/"+directory),
126 new FacesFlowClassLoaderResourceLoader(),
127 new ClassLoaderResourceLoader(META_INF_RESOURCES)
128 };
129 }
130 }
131 }
132 return _resourceLoaders;
133 }
134
135 @Override
136 public ContractResourceLoader[] getContractResourceLoaders()
137 {
138 if (_contractResourceLoaders == null)
139 {
140 FacesContext facesContext = FacesContext.getCurrentInstance();
141
142 String directory = WebConfigParamUtils.getStringInitParameter(facesContext.getExternalContext(),
143 ResourceHandler.WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME, CONTRACTS);
144
145 if (directory.startsWith("/"))
146 {
147 throw new IllegalStateException("javax.faces.WEBAPP_CONTRACTS_DIRECTORY cannot start with '/");
148 }
149
150 if (TempDirFileCacheResourceLoader.isValidCreateTemporalFiles(facesContext))
151 {
152 _contractResourceLoaders= new ContractResourceLoader[] {
153 new TempDirFileCacheContractResourceLoader(
154 new ExternalContextContractResourceLoader("/"+directory)),
155 new TempDirFileCacheContractResourceLoader(
156 new ClassLoaderContractResourceLoader(META_INF_CONTRACTS))
157 };
158 }
159 else
160 {
161
162 _contractResourceLoaders= new ContractResourceLoader[] {
163 new ExternalContextContractResourceLoader("/"+directory),
164 new ClassLoaderContractResourceLoader(META_INF_CONTRACTS)
165 };
166 }
167 }
168 return _contractResourceLoaders;
169 }
170
171 @Override
172 public ResourceLoader[] getViewResourceLoaders()
173 {
174 if (_viewResourceLoaders == null)
175 {
176 FacesContext facesContext = FacesContext.getCurrentInstance();
177 if (TempDirFileCacheResourceLoader.isValidCreateTemporalFiles(facesContext))
178 {
179 _viewResourceLoaders = new ResourceLoader[] {
180 new RootExternalContextResourceLoader(),
181 new TempDirFileCacheResourceLoader(new FacesFlowClassLoaderResourceLoader())
182 };
183 }
184 else
185 {
186 _viewResourceLoaders = new ResourceLoader[] {
187 new RootExternalContextResourceLoader(),
188 new FacesFlowClassLoaderResourceLoader()
189 };
190 }
191 }
192 return _viewResourceLoaders;
193 }
194
195 }