public static <S> ServiceLocator<S> of(Class<?> caller, Class<S> service, ClassLoader classLoader) { return new ServiceLocator<>(caller, service, classLoader, null); }
public Set<? extends S> getProviders() { if (acc == null) { return getProvidersImpl(service.getName(), classLoader, classFilter); } else { PrivilegedAction<Set<? extends S>> action = () -> getProvidersImpl(service.getName(), classLoader, classFilter); return AccessController.doPrivileged(action, acc); } }
public void lookup() { modulators.clear(); serviceAnnotations.clear(); ServiceLocator<Modulator> locator = ServiceLocator.of(this.getClass(), Modulator.class, getClass().getClassLoader()); for (Modulator ext : locator.getProviders()) { modulators.add(ext); Set<Class<? extends Annotation>> ma = ext.serviceAnnotations(); if (ma != null) { serviceAnnotations.addAll(ma); } logger.debug("Found modulator: " + ext.getClass().getName()); } }
protected Set<Class<? extends S>> getServiceProviderClasses(String serviceClassName, ClassLoader classLoader) { Set<Class<? extends S>> result = new HashSet<>(); Enumeration<URL> serviceProviderCatalogues = findServiceProviderCatalogues(serviceClassName, classLoader); while (serviceProviderCatalogues.hasMoreElements()) { URL serviceProvidersCatalogueUrl = serviceProviderCatalogues.nextElement(); Set<String> serviceProviderClassNames = getServiceProviderClassNames(serviceProvidersCatalogueUrl); for (String serviceProviderClassName : serviceProviderClassNames) { try { Class<? extends S> clazz = (Class<? extends S>) Class.forName(serviceProviderClassName, false, classLoader); result.add(clazz); } catch (ClassCastException cce) { throw new ServiceConfigurationError("Service provider " + serviceProviderClassName + " class must be subclass of " + serviceClassName); } catch (ClassNotFoundException x) { throw new ServiceConfigurationError("Service provider " + serviceProviderClassName + " class not found"); } } } return result; }
protected Set<S> getProvidersImpl(String serviceClassName, ClassLoader classLoader, Predicate<Class<? extends S>> classFilter) { Set<S> result = new HashSet<>(); Set<Class<? extends S>> srvProvClasses = getServiceProviderClasses(serviceClassName, classLoader); for (Class<? extends S> clazz : srvProvClasses) { if ((classFilter != null) && !classFilter.test(clazz)) { continue; } try { S service = clazz.getDeclaredConstructor().newInstance(); result.add(service); } catch (Exception e) { throw new ServiceConfigurationError("Service '" + clazz.getName() + "' instantiation error: " + e); } } return result; }
protected List<Ioclet> lookupIoclets() { List<Ioclet> result = new ArrayList<>(); log.debug("Lookup ioclets..."); ServiceLocator<Ioclet> locator = ServiceLocator.of(this.getClass(), Ioclet.class); for (Ioclet ioclet : locator.getProviders()) { log.debug("Found ioclet '" + ioclet.getClass().getName() + "' for producer '" + ioclet.getProducerId() + "' with rank '" + ioclet.getRank() + "'"); result.add(ioclet); } return result; }
public static <S> ServiceLocator<S> of(Class<?> caller, Class<S> service, ClassLoader classLoader, Predicate<Class<? extends S>> classFilter) { return new ServiceLocator<>(caller, service, classLoader, classFilter); }
public static <S> ServiceLocator<S> of(Class<?> caller, Class<S> service) { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); return new ServiceLocator<>(caller, service, classLoader, null); }
public static <S> ServiceLocator<S> of(Class<?> caller, Class<S> service, Predicate<Class<? extends S>> classFilter) { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); return new ServiceLocator<>(caller, service, classLoader, classFilter); }