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