/**********************************************************************
 * This file is part of the "Object Teams Runtime Environment"
 * 
 * Copyright 2013 GK Software AG
 *  
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Please visit http://www.objectteams.org for updates and contact.
 * 
 * Contributors:
 * 	Stephan Herrmann - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otre;

import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;

/**
 * Generalization over different strategies for obtaining a resource / class on the classpath.
 * <p>
 * If a {@link ClassLoader} is provided use its method {@link ClassLoader#getResource(String)} 
 * and {@link ClassLoader#loadClass(String)}.
 * </p><p>
 * Otherwise we need a {@link Method} instance for each kind of access which needs to match
 * the type of the object passed as "loader". The latter method is used in Equinox settings,
 * where the "loader" will be an <code>org.osgi.framework.Bundle</code>.
 * </p><p>
 * Selecting one of the above strategies happens globally when the system start up,
 * which implies that {@link #setGetResource(Method)} and {@link #setLoadClass(Method)}
 * need to be called before any weaving is triggered.
 * </p>
 */
public class ClassLoaderAccess {

	private static Method getResourceMethod;
	private static Method loadClassMethod;

	public static void setGetResource(Method method) {
		getResourceMethod = method;
	}
	public static void setLoadClass(Method method) {
		loadClassMethod = method;
	}

	public static InputStream getResourceAsStream(Object loader, String name) {
		if (loader instanceof ClassLoader)
			return ((ClassLoader) loader).getResourceAsStream(name);
		try {
			URL url = (URL) getResourceMethod.invoke(loader, name);
			return url.openStream();
		} catch (Exception e) {
			return null;
		}
	}

	public static Class<?> loadClass(Object loader, String name) 
			throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException 
	{
		if (loader instanceof ClassLoader)
			return ((ClassLoader) loader).loadClass(name);
		else
			return (Class<?>)loadClassMethod.invoke(loader, name);
	}
}
