Repository: logging-log4j2 Updated Branches: refs/heads/master 355d260ea -> a39420ae8
[LOG4J2-1695] Add a Builder to ScriptPatternSelector and deprecate ScriptPatternSelector.createSelector(). Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a39420ae Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a39420ae Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a39420ae Branch: refs/heads/master Commit: a39420ae896024b95ab2a22ff8539a06a54fb964 Parents: 355d260 Author: Gary Gregory <[email protected]> Authored: Fri Nov 11 16:15:29 2016 -0800 Committer: Gary Gregory <[email protected]> Committed: Fri Nov 11 16:15:29 2016 -0800 ---------------------------------------------------------------------- .../core/layout/ScriptPatternSelector.java | 146 +++++++++++++++---- src/changes/changes.xml | 3 + 2 files changed, 124 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a39420ae/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java index 7f926b7..29d02f3 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java @@ -22,9 +22,12 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.Node; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout.Builder; import org.apache.logging.log4j.core.pattern.PatternFormatter; import org.apache.logging.log4j.core.pattern.PatternParser; import org.apache.logging.log4j.core.script.AbstractScript; @@ -42,6 +45,86 @@ import java.util.Map; @Plugin(name = "ScriptPatternSelector", category = Node.CATEGORY, elementType = PatternSelector.ELEMENT_TYPE, printObject = true) public class ScriptPatternSelector implements PatternSelector { + /** + * 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<ScriptPatternSelector> { + + @PluginElement("Script") + private AbstractScript script; + + @PluginElement("PatternMatch") + private PatternMatch[] properties; + + @PluginBuilderAttribute("defaultPattern") + private String defaultPattern; + + @PluginBuilderAttribute("alwaysWriteExceptions") + private boolean alwaysWriteExceptions = true; + + @PluginBuilderAttribute("noConsoleNoAnsi") + private boolean noConsoleNoAnsi; + + @PluginConfiguration + private Configuration config; + + private Builder() { + // nothing + } + + @Override + public ScriptPatternSelector build() { + if (script == null) { + LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptFilter"); + return null; + } + if (script instanceof ScriptRef) { + if (config.getScriptManager().getScript(script.getName()) == null) { + LOGGER.error("No script with name {} has been declared.", script.getName()); + return null; + } + } + if (defaultPattern == null) { + defaultPattern = PatternLayout.DEFAULT_CONVERSION_PATTERN; + } + if (properties == null || properties.length == 0) { + LOGGER.warn("No marker patterns were provided"); + return null; + } + return new ScriptPatternSelector(script, properties, defaultPattern, alwaysWriteExceptions, noConsoleNoAnsi, config); + } + + public Builder withScript(AbstractScript script) { + this.script = script; + return this; + } + + public Builder withProperties(PatternMatch[] properties) { + this.properties = properties; + return this; + } + + public Builder withDefaultPattern(String defaultPattern) { + this.defaultPattern = defaultPattern; + return this; + } + + public Builder withAlwaysWriteExceptions(boolean alwaysWriteExceptions) { + this.alwaysWriteExceptions = alwaysWriteExceptions; + return this; + } + + public Builder withNoConsoleNoAnsi(boolean noConsoleNoAnsi) { + this.noConsoleNoAnsi = noConsoleNoAnsi; + return this; + } + + public Builder withConfiguration(Configuration config) { + this.config = config; + return this; + } + } + private final Map<String, PatternFormatter[]> formatterMap = new HashMap<>(); private final Map<String, String> patternMap = new HashMap<>(); @@ -98,31 +181,44 @@ public class ScriptPatternSelector implements PatternSelector { } - @PluginFactory - public static ScriptPatternSelector createSelector(@PluginElement("Script") final AbstractScript script, - @PluginElement("PatternMatch") final PatternMatch[] properties, - @PluginAttribute("defaultPattern") String defaultPattern, - @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions, - @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi, - @PluginConfiguration final Configuration config) { - if (script == null) { - LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptFilter"); - return null; - } - if (script instanceof ScriptRef) { - if (config.getScriptManager().getScript(script.getName()) == null) { - LOGGER.error("No script with name {} has been declared.", script.getName()); - return null; - } - } - if (defaultPattern == null) { - defaultPattern = PatternLayout.DEFAULT_CONVERSION_PATTERN; - } - if (properties == null || properties.length == 0) { - LOGGER.warn("No marker patterns were provided"); - return null; - } - return new ScriptPatternSelector(script, properties, defaultPattern, alwaysWriteExceptions, noConsoleNoAnsi, config); + /** + * Creates a builder for a custom ScriptPatternSelector. + * + * @return a ScriptPatternSelector builder. + */ + @PluginBuilderFactory + public static Builder newBuilder() { + return new Builder(); + } + + /** + * Deprecated, use {@link #newBuilder()} instead. + * + * @param script + * @param properties + * @param defaultPattern + * @param alwaysWriteExceptions + * @param noConsoleNoAnsi + * @param configuration + * @return a new ScriptPatternSelector + * @deprecated Use {@link #newBuilder()} instead. + */ + @Deprecated + public static ScriptPatternSelector createSelector( + @PluginElement("Script") final AbstractScript script, + @PluginElement("PatternMatch") final PatternMatch[] properties, + @PluginAttribute("defaultPattern") String defaultPattern, + @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions, + @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi, + @PluginConfiguration final Configuration configuration) { + final Builder builder = newBuilder(); + builder.withScript(script); + builder.withProperties(properties); + builder.withDefaultPattern(defaultPattern); + builder.withAlwaysWriteExceptions(alwaysWriteExceptions); + builder.withNoConsoleNoAnsi(noConsoleNoAnsi); + builder.withConfiguration(configuration); + return builder.build(); } @Override http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a39420ae/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a930722..bc67f37 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -114,6 +114,9 @@ <action issue="LOG4J2-1681" dev="rpopma" type="add"> Changed visibility of indexed getter methods in SortedArrayStringMap from package-protected to public. </action> + <action issue="LOG4J2-1695" dev="ggregory" type="add"> + Add a Builder to ScriptPatternSelector and deprecate ScriptPatternSelector.createSelector(). + </action> </release> <release version="2.7" date="2016-10-02" description="GA Release 2.7"> <action issue="LOG4J2-1618" dev="rpopma" type="fix" due-to="Raman Gupta">
