Home | History | Annotate | Download | only in plugins
      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