This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push: new f4e1305 [OWB-1359] ensure default loader service is more easily extensible f4e1305 is described below commit f4e13057ea9c8d6f076535ada10beaf406a2fd2d Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Wed Dec 16 15:02:50 2020 +0100 [OWB-1359] ensure default loader service is more easily extensible --- .../webbeans/service/DefaultLoaderService.java | 64 +++--- .../service/ManualImplementationLoaderService.java | 228 --------------------- 2 files changed, 24 insertions(+), 268 deletions(-) diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/service/DefaultLoaderService.java b/webbeans-impl/src/main/java/org/apache/webbeans/service/DefaultLoaderService.java index 353d47b..4a7c882 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/service/DefaultLoaderService.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/service/DefaultLoaderService.java @@ -23,22 +23,20 @@ import org.apache.webbeans.logger.WebBeansLoggerFacade; import org.apache.webbeans.spi.LoaderService; import org.apache.webbeans.util.WebBeansUtil; -import java.util.ArrayList; +import javax.enterprise.inject.spi.Extension; import java.util.List; import java.util.ServiceLoader; import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static java.util.stream.Collectors.toList; /** - * Default implementation which delegates to the s{@link ServiceLoader} of Java 1.6 and - * uses a fallback for Java 1.5 + * Default implementation which delegates to the s{@link ServiceLoader}. */ public class DefaultLoaderService implements LoaderService { - private static final Logger logger = WebBeansLoggerFacade.getLogger(DefaultLoaderService.class); - - private static final boolean JAVA_6_AVAILABLE = isJava6(); - @Override public <T> List<T> load(Class<T> serviceType) { @@ -48,44 +46,30 @@ public class DefaultLoaderService implements LoaderService @Override public <T> List<T> load(Class<T> serviceType, ClassLoader classLoader) { - if(JAVA_6_AVAILABLE) + try { - List<T> result = new ArrayList<>(); - try + Stream<T> stream = StreamSupport.stream(ServiceLoader.load(serviceType, classLoader).spliterator(), false); + if (Extension.class == serviceType) { - ServiceLoader<T> services; - services = ServiceLoader.load(serviceType, classLoader); - - for (T service : services) - { - result.add(service); - } + return mapExtensions(stream).collect(toList()); } - catch (Error error) - { - // WTF! ServiceLoader is cool, but THAT is utter crap: it throws some Errors! - logger.log(Level.SEVERE, "Problem while loading CDI Extensions", error); - throw new WebBeansConfigurationException("Problem while loading CDI Extensions", error); - } - - - return result; + // OWBPlugin + return stream.collect(toList()); + } + catch (Error error) + { + // WTF! ServiceLoader is cool, but THAT is utter crap: it throws some Errors! + WebBeansLoggerFacade.getLogger(DefaultLoaderService.class) + .log(Level.SEVERE, "Problem while loading CDI Extensions", error); + throw new WebBeansConfigurationException("Problem while loading CDI Extensions", error); } - - return new ManualImplementationLoaderService<>(serviceType, classLoader).loadServiceImplementations(); } - private static boolean isJava6() + // enables to easily extend the loader to customize extensions: + // 1. filter some undesired extensions programmatically + // 2. remap some extensions (to drop some events or wrap them for ex) + protected <T> Stream<T> mapExtensions(final Stream<T> stream) { - try - { - ServiceLoader.class.getName(); - return true; - } - catch (NoClassDefFoundError error) - { - logger.info("Using Java 5 compatibility mode, because didn't find ServiceLoader: " + error); - return false; - } + return stream; } } diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/service/ManualImplementationLoaderService.java b/webbeans-impl/src/main/java/org/apache/webbeans/service/ManualImplementationLoaderService.java deleted file mode 100644 index 9335c21..0000000 --- a/webbeans-impl/src/main/java/org/apache/webbeans/service/ManualImplementationLoaderService.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.webbeans.service; - -import org.apache.webbeans.util.ClassUtil; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Constructor; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; - -/** - * Manual service loader as fallback for Java 1.5 - */ -class ManualImplementationLoaderService<T> -{ - private static final String SERVICE_CONFIG = "META-INF/services/"; - private static final String FILE_ENCODING = "UTF-8"; - - protected List<Class<?>> foundServiceClasses = new ArrayList<>(); - private Class<T> serviceType; - private ClassLoader currentClassLoader; - - ManualImplementationLoaderService(Class<T> serviceType, ClassLoader currentClassLoader) - { - this.serviceType = serviceType; - this.currentClassLoader = currentClassLoader; - } - - List<T> loadServiceImplementations() - { - List<Class<?>> result = resolveServiceImplementations(); - - if (result == null) - { - return Collections.emptyList(); - } - - List<T> foundServices = new ArrayList<>(); - - for (Class<?> serviceClass : result) - { - foundServices.add(createInstance(serviceClass)); - } - - return foundServices; - } - - private List<Class<?>> resolveServiceImplementations() - { - for (URL configFile : getConfigFileList()) - { - loadConfiguredServices(configFile); - } - - return foundServiceClasses; - } - - private List<URL> getConfigFileList() - { - List<URL> serviceFiles = new ArrayList<>(); - - try - { - Enumeration<URL> serviceFileEnumerator = currentClassLoader.getResources(getConfigFileLocation()); - - while (serviceFileEnumerator.hasMoreElements()) - { - serviceFiles.add(serviceFileEnumerator.nextElement()); - } - } - catch (Exception e) - { - throw new IllegalStateException( - "Failed to load " + serviceType.getName() + " configured in " + getConfigFileLocation(), e); - } - return serviceFiles; - } - - private String getConfigFileLocation() - { - return SERVICE_CONFIG + serviceType.getName(); - } - - private void loadConfiguredServices(URL serviceFile) - { - InputStream inputStream = null; - - try - { - String serviceClassName; - inputStream = serviceFile.openStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, FILE_ENCODING)); - - while ((serviceClassName = bufferedReader.readLine()) != null) - { - serviceClassName = extractConfiguredServiceClassName(serviceClassName); - if (!"".equals(serviceClassName)) - { - loadService(serviceClassName); - } - } - } - catch (Exception e) - { - throw new IllegalStateException("Failed to process service-config: " + serviceFile, e); - } - finally - { - if (inputStream != null) - { - try - { - inputStream.close(); - } - catch (Exception e) - { - throw new IllegalStateException("Failed to close " + serviceFile, e); - } - } - } - } - - private String extractConfiguredServiceClassName(String currentConfigLine) - { - int startOfComment = currentConfigLine.indexOf('#'); - - if (startOfComment > -1) - { - currentConfigLine = currentConfigLine.substring(0, startOfComment); - } - return currentConfigLine.trim(); - } - - private void loadService(String serviceClassName) - { - Class<T> serviceClass = (Class<T>) loadClass(serviceClassName); - - if (serviceClass != null && !foundServiceClasses.contains(serviceClass)) - { - foundServiceClasses.add(serviceClass); - } - else if (serviceClass == null) - { - throw new IllegalStateException(serviceClassName + " couldn't be loaded. " + - "Please ensure that this class is in the classpath or remove the entry from " - + getConfigFileLocation() + "."); - } - } - - private Class<? extends T> loadClass(String serviceClassName) - { - Class<?> targetClass = ClassUtil.getClassFromName(serviceClassName); - - if (targetClass == null) - { - targetClass = loadClassForName(serviceClassName, currentClassLoader); - - if (targetClass == null) - { - return null; - } - } - - return targetClass.asSubclass(serviceType); - } - - private static Class<?> loadClassForName(String serviceClassName, ClassLoader classLoader) - { - if (classLoader == null) - { - return null; - } - - try - { - return classLoader.loadClass(serviceClassName); - } - catch (Exception e) - { - return loadClassForName(serviceClassName, classLoader.getParent()); - } - } - - private T createInstance(Class<?> serviceClass) - { - try - { - Constructor<?> constructor = serviceClass.getDeclaredConstructor(); - constructor.setAccessible(true); - return (T) constructor.newInstance(); - } - catch (Exception e) - { - return null; - } - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() - { - return "Config file: " + getConfigFileLocation(); - } -}