--- /dev/null
+//
+// ========================================================================
+// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.jetty.util.resource.Resource;
+
+/* ------------------------------------------------------------ */
+/** ClassLoader Helper.
+ * This helper class allows classes to be loaded either from the
+ * Thread's ContextClassLoader, the classloader of the derived class
+ * or the system ClassLoader.
+ *
+ * <B>Usage:</B><PRE>
+ * public class MyClass {
+ * void myMethod() {
+ * ...
+ * Class c=Loader.loadClass(this.getClass(),classname);
+ * ...
+ * }
+ * </PRE>
+ *
+ */
+public class Loader
+{
+ /* ------------------------------------------------------------ */
+ public static URL getResource(Class<?> loadClass,String name)
+ {
+ URL url =null;
+ ClassLoader context_loader=Thread.currentThread().getContextClassLoader();
+ if (context_loader!=null)
+ url=context_loader.getResource(name);
+
+ if (url==null && loadClass!=null)
+ {
+ ClassLoader load_loader=loadClass.getClassLoader();
+ if (load_loader!=null && load_loader!=context_loader)
+ url=load_loader.getResource(name);
+ }
+
+ if (url==null)
+ url=ClassLoader.getSystemResource(name);
+
+ return url;
+ }
+
+ /* ------------------------------------------------------------ */
+ /** Load a class.
+ *
+ * @param loadClass
+ * @param name
+ * @return Class
+ * @throws ClassNotFoundException
+ */
+ @SuppressWarnings("rawtypes")
+ public static Class loadClass(Class loadClass,String name)
+ throws ClassNotFoundException
+ {
+ ClassNotFoundException ex=null;
+ Class<?> c =null;
+ ClassLoader context_loader=Thread.currentThread().getContextClassLoader();
+ if (context_loader!=null )
+ {
+ try { c=context_loader.loadClass(name); }
+ catch (ClassNotFoundException e) {ex=e;}
+ }
+
+ if (c==null && loadClass!=null)
+ {
+ ClassLoader load_loader=loadClass.getClassLoader();
+ if (load_loader!=null && load_loader!=context_loader)
+ {
+ try { c=load_loader.loadClass(name); }
+ catch (ClassNotFoundException e) {if(ex==null)ex=e;}
+ }
+ }
+
+ if (c==null)
+ {
+ try { c=Class.forName(name); }
+ catch (ClassNotFoundException e)
+ {
+ if(ex!=null)
+ throw ex;
+ throw e;
+ }
+ }
+
+ return c;
+ }
+
+
+
+ /* ------------------------------------------------------------ */
+ public static ResourceBundle getResourceBundle(Class<?> loadClass,String name,boolean checkParents, Locale locale)
+ throws MissingResourceException
+ {
+ MissingResourceException ex=null;
+ ResourceBundle bundle =null;
+ ClassLoader loader=Thread.currentThread().getContextClassLoader();
+ while (bundle==null && loader!=null )
+ {
+ try { bundle=ResourceBundle.getBundle(name, locale, loader); }
+ catch (MissingResourceException e) {if(ex==null)ex=e;}
+ loader=(bundle==null&&checkParents)?loader.getParent():null;
+ }
+
+ loader=loadClass==null?null:loadClass.getClassLoader();
+ while (bundle==null && loader!=null )
+ {
+ try { bundle=ResourceBundle.getBundle(name, locale, loader); }
+ catch (MissingResourceException e) {if(ex==null)ex=e;}
+ loader=(bundle==null&&checkParents)?loader.getParent():null;
+ }
+
+ if (bundle==null)
+ {
+ try { bundle=ResourceBundle.getBundle(name, locale); }
+ catch (MissingResourceException e) {if(ex==null)ex=e;}
+ }
+
+ if (bundle!=null)
+ return bundle;
+ throw ex;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /**
+ * Generate the classpath (as a string) of all classloaders
+ * above the given classloader.
+ *
+ * This is primarily used for jasper.
+ * @return the system class path
+ */
+ public static String getClassPath(ClassLoader loader) throws Exception
+ {
+ StringBuilder classpath=new StringBuilder();
+ while (loader != null && (loader instanceof URLClassLoader))
+ {
+ URL[] urls = ((URLClassLoader)loader).getURLs();
+ if (urls != null)
+ {
+ for (int i=0;i<urls.length;i++)
+ {
+ Resource resource = Resource.newResource(urls[i]);
+ File file=resource.getFile();
+ if (file!=null && file.exists())
+ {
+ if (classpath.length()>0)
+ classpath.append(File.pathSeparatorChar);
+ classpath.append(file.getAbsolutePath());
+ }
+ }
+ }
+ loader = loader.getParent();
+ }
+ return classpath.toString();
+ }
+}
+