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;
+ }
+ }
+
+}