1 /* 2 * Copyright (c) 2016 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockito.internal.configuration.plugins; 6 7 import org.mockito.internal.util.collections.Iterables; 8 import org.mockito.plugins.PluginSwitch; 9 10 import java.io.IOException; 11 import java.net.URL; 12 import java.util.Enumeration; 13 14 class PluginInitializer { 15 16 private final PluginSwitch pluginSwitch; 17 private final String alias; 18 private final DefaultMockitoPlugins plugins; 19 20 PluginInitializer(PluginSwitch pluginSwitch, String alias, DefaultMockitoPlugins plugins) { 21 this.pluginSwitch = pluginSwitch; 22 this.alias = alias; 23 this.plugins = plugins; 24 } 25 26 /** 27 * Equivalent to {@link java.util.ServiceLoader#load} but without requiring 28 * Java 6 / Android 2.3 (Gingerbread). 29 */ 30 public <T> T loadImpl(Class<T> service) { 31 ClassLoader loader = Thread.currentThread().getContextClassLoader(); 32 if (loader == null) { 33 loader = ClassLoader.getSystemClassLoader(); 34 } 35 Enumeration<URL> resources; 36 try { 37 resources = loader.getResources("mockito-extensions/" + service.getName()); 38 } catch (IOException e) { 39 throw new IllegalStateException("Failed to load " + service, e); 40 } 41 42 try { 43 String classOrAlias = new PluginFinder(pluginSwitch).findPluginClass(Iterables.toIterable(resources)); 44 if (classOrAlias != null) { 45 if (classOrAlias.equals(alias)) { 46 classOrAlias = plugins.getDefaultPluginClass(alias); 47 } 48 Class<?> pluginClass = loader.loadClass(classOrAlias); 49 Object plugin = pluginClass.newInstance(); 50 return service.cast(plugin); 51 } 52 return null; 53 } catch (Exception e) { 54 throw new IllegalStateException( 55 "Failed to load " + service + " implementation declared in " + resources, e); 56 } 57 } 58 } 59