/** * Gets the classloader for the given service name. * * @param serviceName the service name * @return the loader, never null */ protected ClassLoader getClassLoader(String serviceName) { ClassLoader cl = ServiceFactory.getExplicitClassLoader(servicePath, serviceName); if (cl == null) { cl = getClassLoader(); } return cl; }
/** * Finds the unique service provider by service class.<br> * * @param <T> the service type * @param service the service class * @return the provider class * @throws ClassNotFoundException if some provider could not be loaded */ @SuppressWarnings("unchecked") @Override public <T> Class<T> findUniqueServiceProvider(Class<T> service) throws ClassNotFoundException { String serviceName = service.getName(); Map.Entry<String,URL> entry = findUniqueServiceConfiguration(serviceName); Class<T> provider = (Class<T>) Class.forName(entry.getKey(), true, getClassLoader(serviceName)); checkProvider(provider, service, entry.getValue()); return provider; }
/** * Finds the first service provider by service name.<br> * If similar configurations appear more than once on the classpath, the * first is returned. Useful to override service default implementations. * * @param <T> the service type * @param service the service class * @return the provider class * @throws ClassNotFoundException if some provider could not be loaded */ @SuppressWarnings("unchecked") @Override public <T> Class<T> findFirstServiceProvider(Class<T> service) throws ClassNotFoundException { String serviceName = service.getName(); Map.Entry<String,URL> entry = findFirstServiceConfiguration(serviceName); Class<T> provider = (Class<T>) Class.forName(entry.getKey(), true, getClassLoader(serviceName)); checkProvider(provider, service, entry.getValue()); return provider; }
/** * Finds the service providers by service names. * * @param <T> the service type * @param service the service class * @return the classes providing this service * @throws ClassNotFoundException if some provider could not be loaded */ @SuppressWarnings("unchecked") @Override public synchronized <T> Collection<Class<T>> findServiceProviders(Class<T> service) throws ClassNotFoundException { String serviceName = service.getName(); Collection<Class<T>> serviceImplClasses = (Collection) classMap.get(serviceName); if (serviceImplClasses == null) { serviceImplClasses = new ArrayList<>(); for (Map.Entry<String,URL> entry: findServiceConfigurations(serviceName).entrySet()) { String serviceImplName = entry.getKey(); Class<T> provider = (Class<T>) Class.forName(serviceImplName, true, getClassLoader(serviceName)); // check that provides really implements service checkProvider(provider, service, entry.getValue()); serviceImplClasses.add(provider); } classMap.put(serviceName, (Collection) serviceImplClasses); } return serviceImplClasses; }
/** * Finds URLs of a service by name.<br> * * @param serviceName the service name, usually a classname * @return the service's resource urls */ @Override public Collection<URL> findServiceURLs(String serviceName) { try { Enumeration<URL> resources = getClassLoader(serviceName).getResources(servicePath + serviceName); return ModuleSorter.INSTANCE.sort(resources); } catch (IOException iox) { throw new TentackleRuntimeException("loading service information failed", iox); } }