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 2011/02/23 12:51:06 UTC

svn commit: r1073706 - in /myfaces: core/trunk/impl/src/main/java/org/apache/myfaces/resource/ shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/

Author: jakobk
Date: Wed Feb 23 11:51:06 2011
New Revision: 1073706

URL: http://svn.apache.org/viewvc?rev=1073706&view=rev
Log:
MYFACES-3051 Use multiple ClassLoaders to find resources (not only ContextClassLoader) (first draft)

Added:
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MyFacesClassLoader.java
Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/resource/InternalClassLoaderResourceLoader.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ClassLoaderResourceLoader.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/resource/InternalClassLoaderResourceLoader.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/resource/InternalClassLoaderResourceLoader.java?rev=1073706&r1=1073705&r2=1073706&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/resource/InternalClassLoaderResourceLoader.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/resource/InternalClassLoaderResourceLoader.java Wed Feb 23 11:51:06 2011
@@ -18,19 +18,18 @@
  */
 package org.apache.myfaces.resource;
 
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.faces.context.FacesContext;
-
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 import org.apache.myfaces.shared_impl.resource.AliasResourceMetaImpl;
 import org.apache.myfaces.shared_impl.resource.ResourceLoader;
 import org.apache.myfaces.shared_impl.resource.ResourceMeta;
 import org.apache.myfaces.shared_impl.resource.ResourceMetaImpl;
-import org.apache.myfaces.shared_impl.util.ClassUtils;
+import org.apache.myfaces.shared_impl.util.MyFacesClassLoader;
 import org.apache.myfaces.shared_impl.util.WebConfigParamUtils;
 
+import javax.faces.context.FacesContext;
+import java.io.InputStream;
+import java.net.URL;
+
 /**
  * A resource loader implementation which loads resources from the thread ClassLoader.
  * 
@@ -48,6 +47,7 @@ public class InternalClassLoaderResource
     public static final String USE_MULTIPLE_JS_FILES_FOR_JSF_UNCOMPRESSED_JS = "org.apache.myfaces.USE_MULTIPLE_JS_FILES_FOR_JSF_UNCOMPRESSED_JS";
     
     private final boolean _useMultipleJsFilesForJsfUncompressedJs;
+    private MyFacesClassLoader classLoader;
 
     public InternalClassLoaderResourceLoader(String prefix)
     {
@@ -138,7 +138,11 @@ public class InternalClassLoaderResource
      */
     protected ClassLoader getClassLoader()
     {
-        return ClassUtils.getContextClassLoader();
+        if (classLoader == null)
+        {
+            classLoader = new MyFacesClassLoader();
+        }
+        return classLoader;
     }
 
     @Override

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ClassLoaderResourceLoader.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ClassLoaderResourceLoader.java?rev=1073706&r1=1073705&r2=1073706&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ClassLoaderResourceLoader.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ClassLoaderResourceLoader.java Wed Feb 23 11:51:06 2011
@@ -18,14 +18,13 @@
  */
 package org.apache.myfaces.shared.resource;
 
-import java.io.InputStream;
-import java.net.URL;
+import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
+import org.apache.myfaces.shared.util.MyFacesClassLoader;
 
 import javax.faces.application.ProjectStage;
 import javax.faces.context.FacesContext;
-
-import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
-import org.apache.myfaces.shared.util.ClassUtils;
+import java.io.InputStream;
+import java.net.URL;
 
 /**
  * A resource loader implementation which loads resources from the thread ClassLoader.
@@ -74,6 +73,7 @@ public class ClassLoaderResourceLoader e
     };*/
     
     private final boolean _developmentStage;
+    private MyFacesClassLoader classLoader;
 
     public ClassLoaderResourceLoader(String prefix)
     {
@@ -435,7 +435,11 @@ public class ClassLoaderResourceLoader e
      */
     protected ClassLoader getClassLoader()
     {
-        return ClassUtils.getContextClassLoader();
+        if (classLoader == null)
+        {
+            classLoader = new MyFacesClassLoader();
+        }
+        return classLoader;
     }
 
     @Override

Added: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MyFacesClassLoader.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MyFacesClassLoader.java?rev=1073706&view=auto
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MyFacesClassLoader.java (added)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MyFacesClassLoader.java Wed Feb 23 11:51:06 2011
@@ -0,0 +1,161 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.myfaces.shared.util;
+
+import javax.faces.context.FacesContext;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+
+/**
+ * Custom ClassLoader that sets the current Thread's context ClassLoader as parent ClassLoader
+ * and uses the parent ClassLoader, myfaces-api and myfaces-impl ClassLoaders to locate Resources and Classes. 
+ *
+ * @author Jakob Korherr
+ */
+public class MyFacesClassLoader extends ClassLoader
+{
+
+    private ClassLoader apiClassLoader;
+    private ClassLoader implClassLoader;
+
+    public MyFacesClassLoader()
+    {
+        // context ClassLoader is parent ClassLoader
+        super(ClassLoaderUtils.getContextClassLoader());
+
+        apiClassLoader = FacesContext.class.getClassLoader(); // myfaces-api classloader
+        implClassLoader = getClass().getClassLoader();  // myfaces-impl classloader
+    }
+
+    @Override
+    public URL getResource(String s)
+    {
+        // context classloader
+        URL url = super.getResource(s);
+
+        if (url == null)
+        {
+            // try api
+            url = apiClassLoader.getResource(s);
+
+            if (url == null)
+            {
+                // try impl
+                url = implClassLoader.getResource(s);
+            }
+        }
+
+        return url;
+    }
+
+    @Override
+    public Enumeration<URL> getResources(String s) throws IOException
+    {
+        // context classloader
+        Enumeration<URL> urls = super.getResources(s);
+
+        if (urls == null || !urls.hasMoreElements())
+        {
+            // try api
+            urls = apiClassLoader.getResources(s);
+
+            if (urls == null || !urls.hasMoreElements())
+            {
+                // try impl
+                urls = implClassLoader.getResources(s);
+            }
+        }
+
+        return urls;
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String s)
+    {
+        // context classloader
+        InputStream stream = super.getResourceAsStream(s);
+
+        if (stream == null)
+        {
+            // try api
+            stream = apiClassLoader.getResourceAsStream(s);
+
+            if (stream == null)
+            {
+                // try impl
+                stream = implClassLoader.getResourceAsStream(s);
+            }
+        }
+
+        return stream;
+    }
+
+    @Override
+    public Class<?> loadClass(String s) throws ClassNotFoundException
+    {
+        Class<?> clazz = null;
+        ClassNotFoundException firstException = null;
+
+        try
+        {
+            // context classloader
+            clazz = super.loadClass(s);
+        }
+        catch (ClassNotFoundException cnfe)
+        {
+            firstException = cnfe;
+        }
+
+
+        if (clazz == null)
+        {
+            // try api
+            clazz = loadClassFailsafe(s, apiClassLoader);
+
+            if (clazz == null)
+            {
+                // try impl
+                clazz = loadClassFailsafe(s, implClassLoader);
+
+                if (clazz == null)
+                {
+                    // still null, throw first ClassNotFoundException
+                    throw firstException;
+                }
+            }
+        }
+
+        return clazz;
+    }
+
+    private Class<?> loadClassFailsafe(String s, ClassLoader classLaoder)
+    {
+        try
+        {
+            return classLaoder.loadClass(s);
+        }
+        catch (ClassNotFoundException cnfe)
+        {
+            return null;
+        }
+    }
+
+}