You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ja...@apache.org on 2010/11/23 17:52:30 UTC

svn commit: r1038199 - /myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java

Author: jakobk
Date: Tue Nov 23 16:52:30 2010
New Revision: 1038199

URL: http://svn.apache.org/viewvc?rev=1038199&view=rev
Log:
MYFACES-2976 Support hiding myfaces impl classes in osgi, and provide a single osgi bundle for api + impl (fix FactoryFinder classloading for OSGi environment - thanks to David Jencks for this patch)

Modified:
    myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java?rev=1038199&r1=1038198&r2=1038199&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java Tue Nov 23 16:52:30 2010
@@ -18,17 +18,6 @@
  */
 package javax.faces;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import javax.faces.application.ApplicationFactory;
 import javax.faces.component.visit.VisitContextFactory;
 import javax.faces.context.ExceptionHandlerFactory;
@@ -39,6 +28,16 @@ import javax.faces.lifecycle.LifecycleFa
 import javax.faces.render.RenderKitFactory;
 import javax.faces.view.ViewDeclarationLanguageFactory;
 import javax.faces.view.facelets.TagHandlerDelegateFactory;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
@@ -77,6 +76,7 @@ public final class FactoryFinder
 
     private static final Set<String> VALID_FACTORY_NAMES = new HashSet<String>();
     private static final Map<String, Class<?>> ABSTRACT_FACTORY_CLASSES = new HashMap<String, Class<?>>();
+    private static final ClassLoader myFacesClassLoader;
 
     static
     {
@@ -101,6 +101,30 @@ public final class FactoryFinder
         ABSTRACT_FACTORY_CLASSES.put(TAG_HANDLER_DELEGATE_FACTORY, TagHandlerDelegateFactory.class);
         ABSTRACT_FACTORY_CLASSES.put(VIEW_DECLARATION_LANGUAGE_FACTORY, ViewDeclarationLanguageFactory.class);
         ABSTRACT_FACTORY_CLASSES.put(VISIT_CONTEXT_FACTORY, VisitContextFactory.class);
+        try
+        {
+            ClassLoader classLoader;
+            if (System.getSecurityManager() != null) {
+                classLoader = (ClassLoader) AccessController.doPrivileged(new java.security.PrivilegedExceptionAction() {
+                    public Object run() {
+                        return FactoryFinder.class.getClassLoader();
+                    }
+                });
+            }
+            else {
+                classLoader = FactoryFinder.class.getClassLoader();
+            }
+
+            if (classLoader == null)
+            {
+                throw new FacesException("jsf api class loader cannot be identified", null);
+            }
+            myFacesClassLoader = classLoader;
+        }
+        catch (Exception e)
+        {
+            throw new FacesException("jsf api class loader cannot be identified", e);
+        }
     }
 
     // avoid instantiation
@@ -186,8 +210,8 @@ public final class FactoryFinder
             }
         }
 
-        List<String> classNames = null;
-        Object factory = null;
+        List<String> classNames;
+        Object factory;
         synchronized (factoryClassNames)
         {
             factory = factoryMap.get(factoryName);
@@ -224,7 +248,12 @@ public final class FactoryFinder
             while (classNamesIterator.hasNext())
             {
                 String implClassName = classNamesIterator.next();
-                Class<?> implClass = classLoader.loadClass(implClassName);
+                Class<?> implClass = null;
+                try {
+                    implClass = classLoader.loadClass(implClassName);
+                } catch (ClassNotFoundException e) {
+                    implClass = myFacesClassLoader.loadClass(implClassName);
+                }
 
                 // check, if class is of expected interface type
                 if (!interfaceClass.isAssignableFrom(implClass))