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.spi.impl;
20  
21  import org.apache.myfaces.config.DefaultFacesConfigResourceProvider;
22  import org.apache.myfaces.shared.util.ClassUtils;
23  import org.apache.myfaces.spi.FacesConfigResourceProvider;
24  import org.apache.myfaces.spi.FacesConfigResourceProviderFactory;
25  import org.apache.myfaces.spi.ServiceProviderFinderFactory;
26  
27  import javax.faces.FacesException;
28  import javax.faces.context.ExternalContext;
29  import java.lang.reflect.InvocationTargetException;
30  import java.security.AccessController;
31  import java.security.PrivilegedActionException;
32  import java.util.List;
33  import java.util.logging.Level;
34  import java.util.logging.Logger;
35  
36  /**
37   * 
38   * @since 2.0.2
39   * @author Leonardo Uribe
40   */
41  public class DefaultFacesConfigResourceProviderFactory extends FacesConfigResourceProviderFactory
42  {
43      public static final String FACES_CONFIG_PROVIDER = FacesConfigResourceProvider.class.getName();
44      
45      public static final String FACES_CONFIG_PROVIDER_LIST = FacesConfigResourceProvider.class.getName()+".LIST";
46      
47      private Logger getLogger()
48      {
49          return Logger.getLogger(DefaultFacesConfigResourceProviderFactory.class.getName());
50      }    
51      
52      @Override
53      public FacesConfigResourceProvider createFacesConfigResourceProvider(
54              ExternalContext externalContext)
55      {
56          FacesConfigResourceProvider returnValue = null;
57          final ExternalContext extContext = externalContext;
58          try
59          {
60              if (System.getSecurityManager() != null)
61              {
62                  returnValue = AccessController.doPrivileged(new java.security.PrivilegedExceptionAction<FacesConfigResourceProvider>()
63                          {
64                              public FacesConfigResourceProvider run() throws ClassNotFoundException,
65                                      NoClassDefFoundError,
66                                      InstantiationException,
67                                      IllegalAccessException,
68                                      InvocationTargetException,
69                                      PrivilegedActionException
70                              {
71                                  return resolveFacesConfigResourceProviderFromService(extContext);
72                              }
73                          });
74              }
75              else
76              {
77                  returnValue = resolveFacesConfigResourceProviderFromService(extContext);
78              }
79          }
80          catch (ClassNotFoundException e)
81          {
82              // ignore
83          }
84          catch (NoClassDefFoundError e)
85          {
86              // ignore
87          }
88          catch (InstantiationException e)
89          {
90              getLogger().log(Level.SEVERE, "", e);
91          }
92          catch (IllegalAccessException e)
93          {
94              getLogger().log(Level.SEVERE, "", e);
95          }
96          catch (InvocationTargetException e)
97          {
98              getLogger().log(Level.SEVERE, "", e);
99          }
100         catch (PrivilegedActionException e)
101         {
102             throw new FacesException(e);
103         }
104         return returnValue;
105     }
106     
107     private FacesConfigResourceProvider resolveFacesConfigResourceProviderFromService(
108             ExternalContext externalContext) throws ClassNotFoundException,
109             NoClassDefFoundError,
110             InstantiationException,
111             IllegalAccessException,
112             InvocationTargetException,
113             PrivilegedActionException
114     {
115         List<String> classList = (List<String>) externalContext.getApplicationMap().get(FACES_CONFIG_PROVIDER_LIST);
116         if (classList == null)
117         {
118             classList = ServiceProviderFinderFactory.getServiceProviderFinder(externalContext).getServiceProviderList(FACES_CONFIG_PROVIDER);
119             externalContext.getApplicationMap().put(FACES_CONFIG_PROVIDER_LIST, classList);
120         }
121 
122         return ClassUtils.buildApplicationObject(FacesConfigResourceProvider.class, classList, new DefaultFacesConfigResourceProvider());
123     }
124 
125 }