View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * A ResourceHandlerSupport implementation for use with standard Java Servlet engines,
42   * ie an engine that supports javax.servlet, and uses a standard web.xml file.
43   * 
44   * @author Leonardo Uribe (latest modification by $Author$)
45   * @version $Revision$ $Date$
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                  //The ExternalContextResourceLoader has precedence over
79                  //ClassLoaderResourceLoader, so it goes first.
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                 //The ExternalContextResourceLoader has precedence over
107                 //ClassLoaderResourceLoader, so it goes first.
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 }