Search in sources :

Example 1 with Plugin

use of org.apache.logging.log4j.plugins.Plugin in project logging-log4j2 by apache.

the class PluginRegistry method loadFromPackage.

/**
 * Load plugin types from a package.
 * @param pkg The package name.
 * @return A Map of the lists of plugin types organized by category.
 * @since 2.1
 */
public Map<String, List<PluginType<?>>> loadFromPackage(final String pkg) {
    if (Strings.isBlank(pkg)) {
        // happens when splitting an empty string
        return Collections.emptyMap();
    }
    Map<String, List<PluginType<?>>> existing = pluginsByCategoryByPackage.get(pkg);
    if (existing != null) {
        // already loaded this package
        return existing;
    }
    final long startTime = System.nanoTime();
    final ResolverUtil resolver = new ResolverUtil();
    final ClassLoader classLoader = LoaderUtil.getClassLoader();
    if (classLoader != null) {
        resolver.setClassLoader(classLoader);
    }
    resolver.findInPackage(new PluginTest(), pkg);
    final Map<String, List<PluginType<?>>> newPluginsByCategory = new HashMap<>();
    for (final Class<?> clazz : resolver.getClasses()) {
        final Plugin plugin = clazz.getAnnotation(Plugin.class);
        final String categoryLowerCase = plugin.category().toLowerCase();
        List<PluginType<?>> list = newPluginsByCategory.computeIfAbsent(categoryLowerCase, k -> new ArrayList<>());
        final PluginEntry mainEntry = new PluginEntry();
        final String mainElementName = plugin.elementType().equals(Plugin.EMPTY) ? plugin.name() : plugin.elementType();
        mainEntry.setKey(plugin.name().toLowerCase());
        mainEntry.setName(plugin.name());
        mainEntry.setCategory(plugin.category());
        mainEntry.setClassName(clazz.getName());
        mainEntry.setPrintable(plugin.printObject());
        mainEntry.setDefer(plugin.deferChildren());
        final PluginType<?> mainType = new PluginType<>(mainEntry, clazz, mainElementName);
        list.add(mainType);
        final PluginAliases pluginAliases = clazz.getAnnotation(PluginAliases.class);
        if (pluginAliases != null) {
            for (final String alias : pluginAliases.value()) {
                final PluginEntry aliasEntry = new PluginEntry();
                final String aliasElementName = plugin.elementType().equals(Plugin.EMPTY) ? alias.trim() : plugin.elementType();
                aliasEntry.setKey(alias.trim().toLowerCase());
                aliasEntry.setName(plugin.name());
                aliasEntry.setCategory(plugin.category());
                aliasEntry.setClassName(clazz.getName());
                aliasEntry.setPrintable(plugin.printObject());
                aliasEntry.setDefer(plugin.deferChildren());
                final PluginType<?> aliasType = new PluginType<>(aliasEntry, clazz, aliasElementName);
                list.add(aliasType);
            }
        }
    }
    LOGGER.debug(() -> {
        final long endTime = System.nanoTime();
        StringBuilder sb = new StringBuilder("Took ");
        final DecimalFormat numFormat = new DecimalFormat("#0.000000");
        sb.append(numFormat.format((endTime - startTime) * 1e-9));
        sb.append(" seconds to load ").append(resolver.getClasses().size());
        sb.append(" plugins from package ").append(pkg);
        return sb.toString();
    });
    // Note multiple threads could be calling this method concurrently. Both will do the work,
    // but only one will be allowed to store the result in the outer map.
    // Return the inner map produced by whichever thread won the race, so all callers will get the same result.
    existing = pluginsByCategoryByPackage.putIfAbsent(pkg, newPluginsByCategory);
    if (existing != null) {
        return existing;
    }
    return newPluginsByCategory;
}
Also used : HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) DecimalFormat(java.text.DecimalFormat) PluginEntry(org.apache.logging.log4j.plugins.processor.PluginEntry) PluginAliases(org.apache.logging.log4j.plugins.PluginAliases) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Plugin(org.apache.logging.log4j.plugins.Plugin)

Example 2 with Plugin

use of org.apache.logging.log4j.plugins.Plugin in project logging-log4j2 by apache.

the class PluginProcessor method collectPlugins.

private String collectPlugins(String packageName, final Iterable<? extends Element> elements, List<PluginEntry> list) {
    boolean calculatePackage = packageName == null;
    final Elements elementUtils = processingEnv.getElementUtils();
    final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new PluginElementVisitor(elementUtils);
    final ElementVisitor<Collection<PluginEntry>, Plugin> pluginAliasesVisitor = new PluginAliasesElementVisitor(elementUtils);
    for (final Element element : elements) {
        final Plugin plugin = element.getAnnotation(Plugin.class);
        if (plugin == null) {
            continue;
        }
        final PluginEntry entry = element.accept(pluginVisitor, plugin);
        list.add(entry);
        if (calculatePackage) {
            packageName = calculatePackage(elementUtils, element, packageName);
        }
        final Collection<PluginEntry> entries = element.accept(pluginAliasesVisitor, plugin);
        for (final PluginEntry pluginEntry : entries) {
            list.add(pluginEntry);
        }
    }
    return packageName;
}
Also used : TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) PluginEntry(org.apache.logging.log4j.plugins.processor.PluginEntry) Collection(java.util.Collection) Elements(javax.lang.model.util.Elements) Plugin(org.apache.logging.log4j.plugins.Plugin)

Example 3 with Plugin

use of org.apache.logging.log4j.plugins.Plugin in project logging-log4j2 by apache.

the class PluginProcessorTest method testNestedPlugin.

@Test
public void testNestedPlugin() throws Exception {
    final Plugin p = FakePlugin.Nested.class.getAnnotation(Plugin.class);
    final List<PluginType<?>> list = pluginService.getCategory(p.category());
    assertNotNull(list);
    final PluginEntry nested = getEntry(list, p.name());
    assertNotNull(nested);
    assertEquals(p.name().toLowerCase(), nested.getKey());
    assertEquals(FakePlugin.Nested.class.getName(), nested.getClassName());
    assertEquals(p.name(), nested.getName());
    assertEquals(Plugin.EMPTY, p.elementType());
    assertEquals(p.printObject(), nested.isPrintable());
    assertEquals(p.deferChildren(), nested.isDefer());
}
Also used : PluginEntry(org.apache.logging.log4j.plugins.processor.PluginEntry) FakePlugin(org.apache.logging.log4j.plugins.test.validation.FakePlugin) PluginType(org.apache.logging.log4j.plugins.util.PluginType) FakePlugin(org.apache.logging.log4j.plugins.test.validation.FakePlugin) Plugin(org.apache.logging.log4j.plugins.Plugin) Test(org.junit.Test)

Aggregations

Plugin (org.apache.logging.log4j.plugins.Plugin)3 PluginEntry (org.apache.logging.log4j.plugins.processor.PluginEntry)3 DecimalFormat (java.text.DecimalFormat)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 Element (javax.lang.model.element.Element)1 TypeElement (javax.lang.model.element.TypeElement)1 Elements (javax.lang.model.util.Elements)1 PluginAliases (org.apache.logging.log4j.plugins.PluginAliases)1 FakePlugin (org.apache.logging.log4j.plugins.test.validation.FakePlugin)1 PluginType (org.apache.logging.log4j.plugins.util.PluginType)1 Test (org.junit.Test)1