The "normal" plugin pattern looks like this:

    @PluginFactory
    public static PatternLayout createLayout(
            @PluginAttribute(value = "pattern", defaultStringValue =
DEFAULT_CONVERSION_PATTERN) final String pattern,
            @PluginConfiguration final Configuration config,
            @PluginElement("Replace") final RegexReplacement replace,
            @PluginAttribute(value = "charset", defaultStringValue =
"UTF-8") final Charset charset,
            @PluginAttribute(value = "alwaysWriteExceptions",
defaultBooleanValue = true) final boolean alwaysWriteExceptions,
            @PluginAttribute(value = "noConsoleNoAnsi", defaultBooleanValue
= false) final boolean noConsoleNoAnsi,
            @PluginAttribute("header") final String header,
            @PluginAttribute("footer") final String footer) {

I get that and I'm used to it.

But now I see that the impl has changed:

        return newBuilder()
            .withPattern(pattern)
            .withConfiguration(config)
            .withRegexReplacement(replace)
            .withCharset(charset)
            .withAlwaysWriteExceptions(alwaysWriteExceptions)
            .withNoConsoleNoAnsi(noConsoleNoAnsi)
            .withHeader(header)
            .withFooter(footer)
            .build();

OK, I can see that this is a translation from one style to the other.

But then I see:

    /**
     * Custom PatternLayout builder. Use the {@link
PatternLayout#newBuilder() builder factory method} to create this.
     */
    public static class Builder implements
org.apache.logging.log4j.core.util.Builder<PatternLayout> {

        // FIXME: it seems rather redundant to repeat default values (same
goes for field names)
        // perhaps introduce a @PluginBuilderAttribute that has no values
of its own and uses reflection?

        @PluginAttribute(value = "pattern", defaultStringValue =
PatternLayout.DEFAULT_CONVERSION_PATTERN)
        private String pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;

        @PluginConfiguration
        private Configuration configuration = null;

        @PluginElement("Replace")
        private RegexReplacement regexReplacement = null;

        @PluginAttribute(value = "charset", defaultStringValue = "UTF-8")
        private Charset charset = Charsets.UTF_8;

        @PluginAttribute(value = "alwaysWriteExceptions",
defaultBooleanValue = true)
        private boolean alwaysWriteExceptions = true;

        @PluginAttribute(value = "noConsoleNoAnsi", defaultBooleanValue =
false)
        private boolean noConsoleNoAnsi = false;

        @PluginAttribute("header")
        private String header = null;

        @PluginAttribute("footer")
        private String footer = null;

Hold the phone people, the duplication of annotations is a big code smell
IMO.

What can be done about this? Duplication is a guaranteed recipe for code to
get out of sync.

What does this builder do for users?

Gary

-- 
E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to