Thanks so much for the prompt reply Matt.

What do you mean by "if your needs are already structured in a tree"?

I was considering having an `eventTemplateResolvers` parameter of type
`Set<EventResolver>` in `JsonTemplateLayout.Builder` that is auto-magically
injected by the plugin system. In its current state, all available
resolvers are under the `resolver` package, which is at the same level as
`JsonTemplateLayout`. That said, users should be able to provide their own
implementations too – at the end of the day, that is the whole point of the
plugin system. Is this something doable right now? If it requires an
overhauling to the system, how can I incentivize it for you?

On Fri, Jan 29, 2021 at 6:28 PM Matt Sicker <boa...@gmail.com> wrote:

> That sounds like one of the main goals of the DI rewrite I started. To
> give more context on the existing system works, the ability to inject
> complex objects into plugins is primarily used for mapping nested
> configurations. Basically, anything corresponding to an XML element
> was injectable into other elements corresponding to the configuration
> file structure. Not every component in Log4j is integrated into the
> system yet, so there are some pain points like this in 2.x which can
> be seen in some things being configurable via system properties while
> others have custom plugin elements defined for users to define their
> configuration inside. Some of these testability concerns were likely
> missed because their underlying code was fast enough to not need
> mocks.
>
> Now if you'd like to inject objects instantiated from some arbitrary
> point similar to Spring/Guice/etc., that will require a larger
> overhaul (likely by rebooting my mean-bean-machine branch at some
> point), but if your needs are already structured in a tree, then
> @PluginElement is the equivalent of @Inject, while @PluginFactory is
> equivalent to @Produces. Depending on your use case, it could be
> supportable with the existing plugin system, or it may require
> revisiting the DI rewrite, especially if there's wider interest in
> completing that.
>
> On Fri, 29 Jan 2021 at 06:56, Volkan Yazıcı <volkan.yaz...@gmail.com>
> wrote:
> >
> > Hello,
> >
> > I am doing some investigation on how to replace statically bound
> > JsonTemplateLayout resolvers with plugins. For inspiration I was looking
> at
> > PatternLayout and found the following: PatternLayout calls PatternParser
> > ctor, which performs the following:
> >
> > final PluginManager manager = new PluginManager(converterKey);
> > manager.collectPlugins(config == null ? null :
> config.getPluginPackages());
> > final Map<String, PluginType<?>> plugins = manager.getPlugins();
> > final Map<String, Class<PatternConverter>> converters = new
> > LinkedHashMap<>();
> >
> > for (final PluginType<?> type : plugins.values()) {
> >     try {
> >         @SuppressWarnings("unchecked")
> >         final Class<PatternConverter> clazz = (Class<PatternConverter>)
> > type.getPluginClass();
> >         if (filterClass != null && !filterClass.isAssignableFrom(clazz))
> {
> >             continue;
> >         }
> >
> >
> > This got me really puzzled. I was expecting matched plugins to be
> injected
> > into the @PluginFactory ctor of PatternLayout as a parameter of type
> > List<PatternConverter> like every other DI system out there. That is,
> >
> > @PluginFactory
> > AwesomeLayout(
> >         @PluginConfiguration Configuration config,
> >         @PluginElement("converters") List<PatternConverter> converters) {
> >     // ...
> > }
> >
> >
> > I find usage of PluginManager::new an anti-pattern. For one, it is not
> > possible to unit test Pattern{Layout,Parser} by injecting only an
> isolated
> > set of converters. Second, it is not possible to mock PluginManager
> either.
> >
> > Is injection of plugins extending a certain interface/class as a
> > @PluginFactory ctor parameter something we can introduce to the plugin
> > system?
> >
> > Kind regards.
>

Reply via email to