From 3bcfc1366c386f539ead2dac67a917d71c4f7cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Sun, 7 Jul 2024 20:44:37 +0200 Subject: [PATCH] add pmd, add subproject logging-ext, add missing @Override --- build.gradle | 2 + gradle/quality/pmd.gradle | 2 +- .../pmd/category/java/bestpractices.xml | 1243 +++++++++++------ logging-adapter-log4j/build.gradle | 1 + .../src/test/java/module-info.java | 4 +- .../log4j/test/ThreadContextMapTest.java | 2 +- .../java/org/slf4j/impl/test/LoggerTest.java | 3 +- logging-ext/build.gradle | 22 + logging-ext/src/main/java/module-info.java | 10 + .../CallerClassLoaderLogContextSelector.java | 4 +- .../ext}/ClassLoaderLogContextSelector.java | 5 +- .../ContextClassLoaderLogContextSelector.java | 5 +- .../ext}/ThreadLocalLogContextSelector.java | 5 +- .../formatters/ColorPatternFormatter.java | 85 +- .../logging/ext}/formatters/FormatStep.java | 2 +- .../logging/ext}/formatters/Formatters.java | 76 +- .../ext}/formatters/MultistepFormatter.java | 2 +- .../ext}/formatters/PatternFormatter.java | 5 +- .../ext}/formatters/StructuredFormatter.java | 3 +- .../ext}/formatters/TextBannerFormatter.java | 2 +- .../logging/ext}/formatters/XmlFormatter.java | 3 +- .../logging/ext}/handlers/AsyncHandler.java | 10 +- .../logging/ext}/handlers/DelayedHandler.java | 117 +- .../handlers/PeriodicRotatingFileHandler.java | 5 +- .../PeriodicSizeRotatingFileHandler.java | 6 +- .../logging/ext}/handlers/QueueHandler.java | 2 +- .../handlers/SizeRotatingFileHandler.java | 7 +- .../logging/ext}/handlers/SocketHandler.java | 8 +- .../logging/ext}/handlers/SyslogHandler.java | 10 +- .../logging/ext}/io/CountingOutputStream.java | 2 +- .../logging/ext/io}/IndentingXmlWriter.java | 6 +- .../logging/ext}/io/SslTcpOutputStream.java | 2 +- .../logging/ext/io}/StringBuilderWriter.java | 2 +- .../xbib/logging/ext}/io/TcpOutputStream.java | 4 +- .../xbib/logging/ext}/io/UdpOutputStream.java | 4 +- .../logging/ext}/net/ClientSocketFactory.java | 2 +- .../logging/ext}/util/ByteStringBuilder.java | 2 +- .../xbib/logging/ext}/util/SuffixRotator.java | 2 +- .../logging/ext/util/formatter}/ColorMap.java | 37 +- .../ext/util/formatter}/ColorPrintf.java | 6 +- .../ext/util/formatter}/ColorUtil.java | 19 +- .../logging/ext/util/formatter}/FlagSet.java | 2 +- .../util/formatter}/FormatStringParser.java | 4 +- .../ext/util/formatter}/GeneralFlag.java | 2 +- .../ext/util/formatter}/GeneralFlags.java | 2 +- .../ext/util/formatter}/NumericFlag.java | 2 +- .../ext/util/formatter}/NumericFlags.java | 2 +- .../logging/ext/util/formatter}/Printf.java | 96 +- logging-ext/src/test/java/module-info.java | 10 + .../ext/test}/AssertingErrorManager.java | 8 +- .../xbib/logging/ext/test/MapTestUtils.java | 61 + .../ext}/test/formatters/AbstractTest.java | 4 +- .../test/formatters/BannerFormatterTests.java | 9 +- .../formatters/PatternFormatterTests.java | 30 +- .../formatters/StackTraceFormatterTests.java | 3 +- .../test/formatters/XmlFormatterTests.java | 16 +- .../test/handlers/AbstractHandlerTest.java | 36 +- .../ext}/test/handlers/AsyncHandlerTests.java | 9 +- .../test/handlers/DelayedHandlerTests.java | 6 +- .../ext}/test/handlers/ExtHandlerTests.java | 6 +- .../ext}/test/handlers/QueueHandlerTests.java | 5 +- .../ext}/test/handlers/SimpleServer.java | 2 +- .../test/handlers/SocketHandlerTests.java | 61 +- .../test/handlers/SyslogHandlerTests.java | 9 +- .../logging/ext/test}/client-keystore.jks | Bin .../ext}/test/formatters/test-banner.txt | 0 .../ext}/test/formatters/xml-formatter.xsd | 0 .../logging/ext/test}/server-keystore.jks | Bin .../logging/integration/SystemLoggerIT.java | 2 + logging/src/main/java/module-info.java | 11 +- .../org/xbib/logging/ExtErrorManager.java | 1 + .../java/org/xbib/logging/ExtFormatter.java | 6 + .../java/org/xbib/logging/ExtHandler.java | 6 +- .../java/org/xbib/logging/ExtLogRecord.java | 11 +- .../java/org/xbib/logging/LogContext.java | 17 +- .../main/java/org/xbib/logging/Logger.java | 55 +- .../java/org/xbib/logging/LoggerFinder.java | 6 + .../src/main/java/org/xbib/logging/MDC.java | 4 +- .../src/main/java/org/xbib/logging/NDC.java | 4 +- .../java/org/xbib/logging/ThreadLocalMDC.java | 1 + .../java/org/xbib/logging/ThreadLocalNDC.java | 4 + .../org/xbib/logging/WrappedExtLogRecord.java | 6 + .../configuration/ContextConfiguration.java | 17 +- .../PropertyContextConfiguration.java | 1 + .../PropertyLogContextConfigurator.java | 4 +- .../errormanager/HandlerErrorManager.java | 2 + .../errormanager/OnlyOnceErrorManager.java | 1 + .../errormanager/SimpleErrorManager.java | 2 + .../logging/expression/CompositeNode.java | 3 + .../xbib/logging/expression/Expression.java | 15 +- .../logging/expression/ExpressionNode.java | 3 + .../xbib/logging/expression/LiteralNode.java | 3 + .../org/xbib/logging/expression/Node.java | 4 + .../logging/expression/ResolveContext.java | 33 +- .../xbib/logging/filters/AcceptAllFilter.java | 4 +- .../org/xbib/logging/filters/AllFilter.java | 2 + .../org/xbib/logging/filters/AnyFilter.java | 2 + .../xbib/logging/filters/DenyAllFilter.java | 2 + .../xbib/logging/filters/InvertFilter.java | 1 + .../logging/filters/LevelChangingFilter.java | 1 + .../org/xbib/logging/filters/LevelFilter.java | 2 + .../logging/filters/LevelRangeFilter.java | 5 + .../org/xbib/logging/filters/RegexFilter.java | 1 + .../logging/filters/SubstituteFilter.java | 2 + .../logging/formatters/DefaultFormatter.java | 79 ++ .../logging/formatters/SimpleFormatter.java | 66 +- .../xbib/logging/handlers/ConsoleHandler.java | 7 +- .../xbib/logging/handlers/FileHandler.java | 1 + .../logging/handlers/OutputStreamHandler.java | 32 +- .../xbib/logging/handlers/WriterHandler.java | 8 +- .../logging/io/UncloseableOutputStream.java | 5 + .../xbib/logging/io/UncloseableWriter.java | 10 + .../io/UninterruptibleOutputStream.java | 5 + .../xbib/logging/ref/CleanerReference.java | 3 + .../xbib/logging/ref/PhantomReference.java | 4 + .../java/org/xbib/logging/ref/References.java | 4 +- .../org/xbib/logging/ref/SoftReference.java | 4 + .../org/xbib/logging/ref/StrongReference.java | 5 + .../org/xbib/logging/ref/WeakReference.java | 4 + .../org/xbib/logging/util/CopyOnWriteMap.java | 15 + .../xbib/logging/util/CopyOnWriteWeakMap.java | 18 +- .../xbib/logging/util/FastCopyHashMap.java | 114 +- .../ObjectBuilder.java | 26 +- .../xbib/logging/util/StackWalkerUtil.java | 2 + logging/src/test/java/module-info.java | 4 - .../test/FileHandlerPerformanceTests.java | 4 +- .../org/xbib/logging/test/HandlerTests.java | 4 +- .../org/xbib/logging/test/LoggerTests.java | 9 +- .../logging/test/PropertyValuesTests.java | 22 +- .../PropertyConfigurationTests.java | 21 +- .../configs/default-logging.properties | 12 +- .../expected-spaced-value-logging.properties | 6 +- .../configs/expression-logging.properties | 8 +- .../configs/invalid-logging.properties | 8 +- .../configs/simple-logging.properties | 6 +- .../configs/spaced-value-logging.properties | 6 +- settings.gradle | 1 + 137 files changed, 1790 insertions(+), 1101 deletions(-) create mode 100644 logging-ext/build.gradle create mode 100644 logging-ext/src/main/java/module-info.java rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/CallerClassLoaderLogContextSelector.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/ClassLoaderLogContextSelector.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/ContextClassLoaderLogContextSelector.java (95%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/ThreadLocalLogContextSelector.java (94%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/ColorPatternFormatter.java (64%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/FormatStep.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/Formatters.java (97%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/MultistepFormatter.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/PatternFormatter.java (95%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/StructuredFormatter.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/TextBannerFormatter.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/formatters/XmlFormatter.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/AsyncHandler.java (95%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/DelayedHandler.java (81%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/PeriodicRotatingFileHandler.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/PeriodicSizeRotatingFileHandler.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/QueueHandler.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/SizeRotatingFileHandler.java (97%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/SocketHandler.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/handlers/SyslogHandler.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/io/CountingOutputStream.java (96%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/io}/IndentingXmlWriter.java (98%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/io/SslTcpOutputStream.java (98%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/io}/StringBuilderWriter.java (97%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/io/TcpOutputStream.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/io/UdpOutputStream.java (95%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/net/ClientSocketFactory.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/util/ByteStringBuilder.java (99%) rename {logging/src/main/java/org/xbib/logging => logging-ext/src/main/java/org/xbib/logging/ext}/util/SuffixRotator.java (99%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/ColorMap.java (91%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/ColorPrintf.java (97%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/ColorUtil.java (62%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/FlagSet.java (98%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/FormatStringParser.java (98%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/GeneralFlag.java (70%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/GeneralFlags.java (97%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/NumericFlag.java (73%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/NumericFlags.java (97%) rename {logging/src/main/java/org/xbib/logging/formatters => logging-ext/src/main/java/org/xbib/logging/ext/util/formatter}/Printf.java (96%) create mode 100644 logging-ext/src/test/java/module-info.java rename {logging/src/test/java/org/xbib/logging/test/handlers => logging-ext/src/test/java/org/xbib/logging/ext/test}/AssertingErrorManager.java (92%) create mode 100644 logging-ext/src/test/java/org/xbib/logging/ext/test/MapTestUtils.java rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/formatters/AbstractTest.java (90%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/formatters/BannerFormatterTests.java (94%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/formatters/PatternFormatterTests.java (92%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/formatters/StackTraceFormatterTests.java (99%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/formatters/XmlFormatterTests.java (98%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/AbstractHandlerTest.java (84%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/AsyncHandlerTests.java (94%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/DelayedHandlerTests.java (98%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/ExtHandlerTests.java (96%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/QueueHandlerTests.java (95%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/SimpleServer.java (99%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/SocketHandlerTests.java (82%) rename {logging/src/test/java/org/xbib/logging => logging-ext/src/test/java/org/xbib/logging/ext}/test/handlers/SyslogHandlerTests.java (97%) rename {logging/src/test/resources => logging-ext/src/test/resources/org/xbib/logging/ext/test}/client-keystore.jks (100%) rename {logging/src/test/resources/org/xbib/logging => logging-ext/src/test/resources/org/xbib/logging/ext}/test/formatters/test-banner.txt (100%) rename {logging/src/test/resources/org/xbib/logging => logging-ext/src/test/resources/org/xbib/logging/ext}/test/formatters/xml-formatter.xsd (100%) rename {logging/src/test/resources => logging-ext/src/test/resources/org/xbib/logging/ext/test}/server-keystore.jks (100%) create mode 100644 logging/src/main/java/org/xbib/logging/formatters/DefaultFormatter.java rename logging/src/main/java/org/xbib/logging/{configuration => util}/ObjectBuilder.java (95%) diff --git a/build.gradle b/build.gradle index 2e1866c..8fc282a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { + id 'pmd' id 'maven-publish' id 'signing' id "io.github.gradle-nexus.publish-plugin" version "2.0.0-rc-1" @@ -30,6 +31,7 @@ subprojects { apply from: rootProject.file('gradle/compile/java.gradle') apply from: rootProject.file('gradle/test/junit5.gradle') apply from: rootProject.file('gradle/publish/maven.gradle') + apply from: rootProject.file('gradle/quality/pmd.gradle') } apply from: rootProject.file('gradle/publish/sonatype.gradle') apply from: rootProject.file('gradle/publish/forgejo.gradle') diff --git a/gradle/quality/pmd.gradle b/gradle/quality/pmd.gradle index 55fcfda..87a1312 100644 --- a/gradle/quality/pmd.gradle +++ b/gradle/quality/pmd.gradle @@ -12,6 +12,6 @@ tasks.withType(Pmd) { pmd { ignoreFailures = true consoleOutput = false - toolVersion = "6.51.0" + toolVersion = "7.3.0" ruleSetFiles = rootProject.files('gradle/quality/pmd/category/java/bestpractices.xml') } diff --git a/gradle/quality/pmd/category/java/bestpractices.xml b/gradle/quality/pmd/category/java/bestpractices.xml index 56a764d..a1a14b9 100644 --- a/gradle/quality/pmd/category/java/bestpractices.xml +++ b/gradle/quality/pmd/category/java/bestpractices.xml @@ -1,4 +1,4 @@ - + The abstract class does not contain any abstract methods. An abstract class suggests an incomplete implementation, which is to be completed by subclasses implementing the abstract methods. If the class is intended to be used as a base class only (not to be instantiated - directly) a protected constructor can be provided prevent direct instantiation. + directly) a protected constructor can be provided to prevent direct instantiation. 3 - - - - - - - - Instantiation by way of private constructors from outside of the constructor's class often causes the + Instantiation by way of private constructors from outside the constructor's class often causes the generation of an accessor. A factory method, or non-privatization of the constructor can eliminate this situation. The generated class file is actually an interface. It gives the accessing class the ability to invoke a new hidden package scope constructor that takes the interface as a supplementary parameter. This turns a private constructor effectively into one with package scope, and is challenging to discern. + + _Note:_ This rule is only executed for Java 10 or lower. + Since Java 11, [JEP 181: Nest-Based Access Control](https://openjdk.org/jeps/181) has been implemented. This + means that in Java 11 and above accessor classes are not generated anymore. 3 @@ -80,13 +71,18 @@ public class Outer { language="java" since="5.5.4" maximumLanguageVersion="10" - message="Avoid autogenerated methods to access private fields and methods of inner / outer classes" + message="Consider giving this member package visibility to access it from {0} without a synthetic accessor method" class="net.sourceforge.pmd.lang.java.rule.bestpractices.AccessorMethodGenerationRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#accessormethodgeneration"> - When accessing a private field / method from another class, the Java compiler will generate a accessor methods + When accessing private fields / methods from another class, the Java compiler will generate accessor methods with package-private visibility. This adds overhead, and to the dex method count on Android. This situation can be avoided by changing the visibility of the field / method from private to package-private. + + + _Note:_ This rule is only executed for Java 10 or lower. + Since Java 11, [JEP 181: Nest-Based Access Control](https://openjdk.org/jeps/181) has been implemented. This + means that in Java 11 and above accessor classes are not generated anymore. 3 @@ -133,11 +129,61 @@ public class Foo { + + + Declaring a MessageDigest instance as a field make this instance directly available to multiple threads. + Such sharing of MessageDigest instances should be avoided if possible since it leads to wrong results + if the access is not synchronized correctly. + Just create a new instance and use it locally, where you need it. + Creating a new instance is easier than synchronizing access to a shared instance. + + 3 + + + + + + + + + + + + Avoid printStackTrace(); use a logger call instead. @@ -147,9 +193,7 @@ public class Foo { @@ -169,6 +213,40 @@ class Foo { + + + Reassigning exception variables caught in a catch statement should be avoided because of: + + 1) If it is needed, multi catch can be easily added and code will still compile. + + 2) Following the principle of least surprise we want to make sure that a variable caught in a catch statement + is always the one thrown in a try block. + + 3 + + + - Reassigning values to incoming parameters is not recommended. Use temporary local variables instead. + Reassigning values to incoming parameters of a method or constructor is not recommended, as this can + make the code more difficult to understand. The code is often read with the assumption that parameter values + don't change and an assignment violates therefore the principle of least astonishment. This is especially a + problem if the parameter is documented e.g. in the method's javadoc and the new content differs from the original + documented content. + + Use temporary local variables instead. This allows you to assign a new name, which makes the code better + understandable. + + Note that this rule considers both methods and constructors. If there are multiple assignments for a formal + parameter, then only the first assignment is reported. 2 @@ -243,7 +336,7 @@ public class Foo { language="java" since="4.2" message="StringBuffers can grow quite a lot, and so may become a source of memory leak (if the owning class has a long life time)." - class="net.sourceforge.pmd.lang.rule.XPathRule" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#avoidstringbufferfield"> StringBuffers/StringBuilders can grow considerably, and so may become a source of memory leaks @@ -254,7 +347,7 @@ public class Foo { @@ -320,12 +413,12 @@ if (rst.next()) { // result is properly examined and used - Avoid constants in interfaces. Interfaces should define types, constants are implementation details - better placed in classes or enums. See Effective Java, item 19. + Using constants in interfaces is a bad practice. Interfaces define types, constants are implementation details better placed in classes or enums. If the constants are best viewed as members of an enumerated type, you should export them with an enum type. + For other scenarios, consider using a utility class. See Effective Java's 'Use interfaces only to define types'. 3 @@ -333,7 +426,7 @@ if (rst.next()) { // result is properly examined and used @@ -368,7 +461,7 @@ public interface YetAnotherConstantInterface { language="java" since="1.5" message="The default label should be the last label in a switch statement" - class="net.sourceforge.pmd.lang.rule.XPathRule" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#defaultlabelnotlastinswitchstmt"> By convention, the default label should be the last label in a switch statement. @@ -378,9 +471,7 @@ public interface YetAnotherConstantInterface { @@ -403,11 +494,53 @@ public class Foo { + + + Double brace initialisation is a pattern to initialise eg collections concisely. But it implicitly + generates a new .class file, and the object holds a strong reference to the enclosing object. For those + reasons, it is preferable to initialize the object normally, even though it's verbose. + + This rule counts any anonymous class which only has a single initializer as an instance of double-brace + initialization. There is currently no way to find out whether a method called in the initializer is not + accessible from outside the anonymous class, and those legit cases should be suppressed for the time being. + + 3 + + + + + + + + (){{ + add("a"); + add("b"); + add("c"); +}}; + +// the better way is to not create an anonymous class: +List a = new ArrayList<>(); +a.add("a"); +a.add("b"); +a.add("c"); +return a; +]]> + + + @@ -439,7 +572,7 @@ public class MyClass { language="java" since="6.11.0" message="Too many control variables in the 'for' statement" - class="net.sourceforge.pmd.lang.rule.XPathRule" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#forloopvariablecount"> Having a lot of control variables in a 'for' loop makes it harder to see what range of values @@ -471,13 +604,26 @@ for (int i = 0, j = 0; i < 10; i++, j += 2) { Whenever using a log level, one should check if the loglevel is actually enabled, or otherwise skip the associate String creation and manipulation. + + An alternative to checking the log level are substituting parameters, formatters or lazy logging + with lambdas. The available alternatives depend on the actual logging framework. 2 calculateExpensiveLoggingText()); ]]> @@ -486,8 +632,7 @@ for (int i = 0, j = 0; i < 10; i++, j += 2) { language="java" since="4.0" message="JUnit 4 indicates test suites via annotations, not the suite method." - class="net.sourceforge.pmd.lang.rule.XPathRule" - typeResolution="true" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#junit4suitesshouldusesuiteannotation"> In JUnit 3, test suites are indicated by the suite() method. In JUnit 4, suites are indicated @@ -498,9 +643,8 @@ for (int i = 0, j = 0; i < 10; i++, j += 2) { @@ -526,8 +670,7 @@ public class GoodTest { language="java" since="4.0" message="JUnit 4 tests that clean up tests should use the @After annotation, JUnit5 tests should use @AfterEach or @AfterAll" - class="net.sourceforge.pmd.lang.rule.XPathRule" - typeResolution="true" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#junit4testshoulduseafterannotation"> In JUnit 3, the tearDown method was used to clean up all data entities required in running tests. @@ -539,13 +682,14 @@ public class GoodTest { @@ -570,8 +714,7 @@ public class MyTest2 { language="java" since="4.0" message="JUnit 4 tests that set up tests should use the @Before annotation, JUnit5 tests should use @BeforeEach or @BeforeAll" - class="net.sourceforge.pmd.lang.rule.XPathRule" - typeResolution="true" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#junit4testshouldusebeforeannotation"> In JUnit 3, the setUp method was used to set up all data entities required in running tests. @@ -583,13 +726,15 @@ public class MyTest2 { @@ -613,36 +758,40 @@ public class MyTest2 { In JUnit 3, the framework executed all methods which started with the word test as a unit test. In JUnit 4, only methods annotated with the @Test annotation are executed. In JUnit 5, one of the following annotations should be used for tests: @Test, @RepeatedTest, @TestFactory, @TestTemplate or @ParameterizedTest. + In TestNG, only methods annotated with the @Test annotation are executed. 3 - + + + 3 + + + + + + + + + + + + Unit tests should not contain too many asserts. Many asserts are indicative of a complex test, for which @@ -700,25 +914,6 @@ public class Foo extends TestCase { This rule checks for JUnit4, JUnit5 and TestNG Tests, as well as methods starting with "test". 3 - - - - - $maximumAsserts] -]]> - - - + + + Position literals first in all String comparisons, if the second argument is null then NullPointerExceptions + can be avoided, they will just return false. Note that switching literal positions for compareTo and + compareToIgnoreCase may change the result, see examples. + + 3 + + 0); // should be: "bar".compareTo(x) < 0 + } + boolean bar(String x) { + return (x.compareToIgnoreCase("bar") > 0); // should be: "bar".compareToIgnoreCase(x) < 0 + } + boolean bar(String x) { + return x.contentEquals("bar"); // should be "bar".contentEquals(x) + } +} +]]> + + + - The use of implementation types (i.e., HashSet) as object references limits your ability to use alternate - implementations in the future as requirements change. Whenever available, referencing objects - by their interface types (i.e, Set) provides much more flexibility. + Excessive coupling to implementation types (e.g., `HashSet`) limits your ability to use alternate + implementations in the future as requirements change. Whenever available, declare variables + and parameters using a more general type (e.g, `Set`). + + This rule reports uses of concrete collection types. User-defined types that should be treated + the same as interfaces can be configured with the property `allowedTypes`. 3 @@ -862,7 +1094,6 @@ public class SecureSystem { since="6.2.0" minimumLanguageVersion="1.5" message="The method ''{0}'' is missing an @Override annotation." - typeResolution="true" class="net.sourceforge.pmd.lang.java.rule.bestpractices.MissingOverrideRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#missingoverride"> @@ -885,12 +1116,12 @@ public class SecureSystem { - Java allows the use of several variables declaration of the same type on one line. However, it - can lead to quite messy code. This rule looks for several declarations on the same line. + Java allows the use of several variables declaration of the same type on one line. + However, it can lead to quite messy code. This rule looks for several declarations on the same line. 4 @@ -908,7 +1139,6 @@ public class SecureSystem { ]]> - @@ -926,100 +1156,27 @@ String name, - - - Position literals first in comparisons, if the second argument is null then NullPointerExceptions - can be avoided, they will just return false. - - 3 - - - - - - - - - - - - - - - Position literals first in comparisons, if the second argument is null then NullPointerExceptions - can be avoided, they will just return false. - - 3 - - - - - - - - - - - - - Throwing a new exception from a catch block without passing the original exception into the - new exception will cause the original stack trace to be lost making it difficult to debug - effectively. + Reports exceptions that are thrown from within a catch block, yet don't refer to the + exception parameter declared by that catch block. The stack trace of the original + exception could be lost, which makes the thrown exception less informative. + + To preserve the stack trace, the original exception may be used as the cause of + the new exception, using `Throwable#initCause`, or passed as a constructor argument + to the new exception. It may also be preserved using `Throwable#addSuppressed`. + The rule actually assumes that any method or constructor that takes the original + exception as argument preserves the original stack trace. + + The rule allows `InvocationTargetException` and `PrivilegedActionException` to be + replaced by their cause exception. The discarded part of the stack trace is in those + cases only JDK-internal code, which is not very useful. The rule also ignores exceptions + whose name starts with `ignored`. 3 @@ -1029,7 +1186,7 @@ public class Foo { try{ Integer.parseInt("a"); } catch (Exception e) { - throw new Exception(e); // first possibility to create exception chain + throw new Exception(e); // Ok, this initializes the cause of the new exception } try { Integer.parseInt("a"); @@ -1037,10 +1194,11 @@ public class Foo { throw (IllegalStateException)new IllegalStateException().initCause(e); // second possibility to create exception chain. } } - void bad() { + void wrong() { try{ Integer.parseInt("a"); } catch (Exception e) { + // Violation: this only preserves the message and not the stack trace throw new Exception(e.getMessage()); } } @@ -1049,11 +1207,41 @@ public class Foo { + + + Reports usages of primitive wrapper constructors. They are deprecated + since Java 9 and should not be used. Even before Java 9, they can + be replaced with usage of the corresponding static `valueOf` factory method + (which may be automatically inserted by the compiler since Java 1.5). + This has the advantage that it may reuse common instances instead of creating + a new instance each time. + + Note that for `Boolean`, the named constants `Boolean.TRUE` and `Boolean.FALSE` + are preferred instead of `Boolean.valueOf`. + + 3 + + + + + + Consider replacing Enumeration usages with the newer java.util.Iterator @@ -1063,7 +1251,7 @@ public class Foo { @@ -1087,7 +1275,7 @@ public class Foo implements Enumeration { language="java" since="3.4" message="Consider replacing this Hashtable with the newer java.util.Map" - class="net.sourceforge.pmd.lang.rule.XPathRule" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#replacehashtablewithmap"> Consider replacing Hashtable usage with the newer java.util.Map if thread safety is not required. @@ -1095,7 +1283,9 @@ public class Foo implements Enumeration { 3 - //Type/ReferenceType/ClassOrInterfaceType[@Image='Hashtable'] + @@ -1113,7 +1303,7 @@ public class Foo { language="java" since="3.4" message="Consider replacing this Vector with the newer java.util.List" - class="net.sourceforge.pmd.lang.rule.XPathRule" + class="net.sourceforge.pmd.lang.rule.xpath.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#replacevectorwithlist"> Consider replacing Vector usages with the newer java.util.ArrayList if expensive thread-safe operations are not required. @@ -1121,11 +1311,14 @@ public class Foo { 3 - //Type/ReferenceType/ClassOrInterfaceType[@Image='Vector'] + + + + Reports test assertions that may be simplified using a more specific + assertion method. This enables better error messages, and makes the + assertions more readable. + + 3 + + + + + - All switch statements should include a default option to catch any unspecified values. + Switch statements should be exhaustive, to make their control flow + easier to follow. This can be achieved by adding a `default` case, or, + if the switch is on an enum type, by ensuring there is one switch branch + for each enum constant. 3 - @@ -1171,8 +1403,8 @@ public void bar() { References to System.(out|err).print are usually intended for debugging purposes and can remain in @@ -1184,11 +1416,9 @@ public void bar() { @@ -1206,6 +1436,162 @@ class Foo{ ]]> + + + Reports explicit array creation when a varargs is expected. + For instance: + ```java + Arrays.asList(new String[] { "foo", "bar", }); + ``` + can be replaced by: + ```java + Arrays.asList("foo", "bar"); + ``` + + 3 + + + + + + + Reports assignments to variables that are never used before the variable is overwritten, + or goes out of scope. Unused assignments are those for which + 1. The variable is never read after the assignment, or + 2. The assigned value is always overwritten by other assignments before the next read of + the variable. + + The rule tracks assignements to fields of `this`, and static fields of the current class. + This may cause some false positives in timing-sensitive concurrent code, which the rule cannot detect. + + The rule may be suppressed with the standard `@SuppressWarnings("unused")` tag. + + The rule subsumes {% rule "UnusedLocalVariable" %}, and {% rule "UnusedFormalParameter" %}. + Those violations are filtered + out by default, in case you already have enabled those rules, but may be enabled with the property + `reportUnusedVariables`. Variables whose name starts with `ignored` or `unused` are filtered out, as + is standard practice for exceptions. + + Limitations: + * The rule currently cannot know which method calls throw exceptions, or which exceptions they throw. + In the body of a try block, every method or constructor call is assumed to throw. This may cause false-negatives. + The only other language construct that is assumed to throw is the `throw` statement, in particular, + things like `assert` statements, or NullPointerExceptions on dereference are ignored. + * The rule cannot resolve assignments across constructors, when they're called with the special + `this(...)` syntax. This may cause false-negatives. + + Both of those limitations may be partly relaxed in PMD 7. + + 3 + + + + + + + + + + + + + - Avoid passing parameters to methods or constructors without actually referencing them in the method body. + Reports parameters of methods and constructors that are not referenced them in the method body. + Parameters whose name starts with `ignored` or `unused` are filtered out. + + Removing unused formal parameters from public methods could cause a ripple effect through the code base. + Hence, by default, this rule only considers private methods. To include non-private methods, set the + `checkAll` property to `true`. + 3 @@ -1228,28 +1620,6 @@ public class Foo { - - - Avoid unused import statements to prevent unwanted dependencies. - This rule will also find unused on demand imports, i.e. import com.foo.*. - - 4 - - - - - Detects when a local variable is declared and/or assigned, but not used. + Variables whose name starts with `ignored` or `unused` are filtered out. 3 @@ -1279,6 +1650,12 @@ public class Foo { externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#unusedprivatefield"> Detects when a private field is declared and/or assigned a value, but not used. + + Since PMD 6.50.0 private fields are ignored, if the fields are annotated with any annotation or the + enclosing class has any annotation. Annotations often enable a framework (such as dependency injection, mocking + or e.g. Lombok) which use the fields by reflection or other means. This usage can't be detected by static code analysis. + Previously these frameworks where explicitly allowed by listing their annotations in the property + "ignoredAnnotations", but that turned out to be prone of false positive for any not explicitly considered framework. 3 @@ -1314,193 +1691,6 @@ public class Something { - - - This rule detects JUnit assertions in object equality. These assertions should be made by more specific methods, like assertEquals. - - 3 - - - - - - - - - - - - - - - This rule detects JUnit assertions in object references equality. These assertions should be made by - more specific methods, like assertNull, assertNotNull. - - 3 - - - - - - - - - - - - - - - This rule detects JUnit assertions in object references equality. These assertions should be made - by more specific methods, like assertSame, assertNotSame. - - 3 - - - - - - - - - - - - - - - When asserting a value is the same as a literal or Boxed boolean, use assertTrue/assertFalse, instead of assertEquals. - - 3 - - - - - - - - - - - - + + + + Wherever possible, use `EnumSet` or `EnumMap` instead of `HashSet` and `HashMap` when the keys + are of an enum type. The specialized enum collections are more space- and time-efficient. + This rule reports constructor expressions for hash sets or maps whose key + type is an enum type. + + 3 + + newSet() { + return new HashSet<>(); // Could be EnumSet.noneOf(Example.class) + } + + public static Map newMap() { + return new HashMap<>(); // Could be new EnumMap<>(Example.class) + } + } + ]]> + + + + + + Starting with Java 7, StandardCharsets provides constants for common Charset objects, such as UTF-8. + Using the constants is less error prone, and can provide a small performance advantage compared to `Charset.forName(...)` + since no scan across the internal `Charset` caches is needed. + + 3 + + + + + + + + + + + + Java 7 introduced the try-with-resources statement. This statement ensures that each resource is closed at the end @@ -1549,23 +1818,6 @@ public class Foo { preserved. 3 - - - - - - - - - - Java 5 introduced the varargs parameter declaration for methods and constructors. This syntactic + Java 5 introduced the varargs parameter declaration for methods and constructors. This syntactic sugar provides flexibility for users of these methods and constructors, allowing them to avoid having to deal with the creation of an array. + + Byte arrays in any method and String arrays in `public static void main(String[])` methods are ignored. 4 - @@ -1643,6 +1885,79 @@ public class Foo { // Ahh, varargs tastes much better... } } +]]> + + + + + + `do {} while (true);` requires reading the end of the statement before it is + apparent that it loops forever, whereas `while (true) {}` is easier to understand. + + `do {} while (false);` is redundant, and if an inner variable scope is required, + a block `{}` is sufficient. + + `while (false) {}` will never execute the block and can be removed in its entirety. + + 3 + + + = 1]] +| +(: while loops with conditional and'ed boolean literals, maybe parenthesized :) +//WhileStatement[(InfixExpression[@Operator = ('&', '&&')]) + (: at least one false literal :) + [count(BooleanLiteral[@True = false()]) >= 1]] +| +(: do-while loops with conditional or'ed boolean literals, maybe parenthesized :) +//DoStatement[(InfixExpression[@Operator = ('|', '||')]) + (: at least one true literal :) + [count(BooleanLiteral[@True = true()]) >= 1 + (: or only boolean literal and no no var access :) + or count(BooleanLiteral) >= 1 + and count(VariableAccess) = 0 + ]] +| +(: do-while loops with conditional and'ed boolean literals, maybe parenthesized :) +//DoStatement[(InfixExpression[@Operator = ('&', '&&')]) + (: at least one false literal :) + [count(BooleanLiteral[@True = false()]) >= 1 + (: or only boolean literal and no no var access :) + or count(BooleanLiteral) >= 1 + and count(VariableAccess) = 0 + ]] + ]]> + + + + diff --git a/logging-adapter-log4j/build.gradle b/logging-adapter-log4j/build.gradle index e701382..33006d3 100644 --- a/logging-adapter-log4j/build.gradle +++ b/logging-adapter-log4j/build.gradle @@ -1,6 +1,7 @@ dependencies { api project(':logging') api libs.log4j.core + testImplementation project(':logging-ext') } def moduleName = 'org.xbib.logging.log4j.test' diff --git a/logging-adapter-log4j/src/test/java/module-info.java b/logging-adapter-log4j/src/test/java/module-info.java index af8a1c9..2a92b61 100644 --- a/logging-adapter-log4j/src/test/java/module-info.java +++ b/logging-adapter-log4j/src/test/java/module-info.java @@ -1,8 +1,8 @@ module org.xbib.logging.log4j.test { - requires transitive java.logging; + requires transitive org.xbib.logging.ext; requires org.apache.logging.log4j; requires org.junit.jupiter.api; - requires transitive org.xbib.logging; requires org.xbib.logging.adapter.log4j; exports org.xbib.logging.log4j.test to org.junit.platform.commons; + opens org.xbib.logging.log4j.test to org.junit.platform.commons; } diff --git a/logging-adapter-log4j/src/test/java/org/xbib/logging/log4j/test/ThreadContextMapTest.java b/logging-adapter-log4j/src/test/java/org/xbib/logging/log4j/test/ThreadContextMapTest.java index 8c69079..5d88d0a 100644 --- a/logging-adapter-log4j/src/test/java/org/xbib/logging/log4j/test/ThreadContextMapTest.java +++ b/logging-adapter-log4j/src/test/java/org/xbib/logging/log4j/test/ThreadContextMapTest.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; import org.xbib.logging.MDC; import org.xbib.logging.NDC; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.ext.formatters.PatternFormatter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/logging-adapter-slf4j/src/test/java/org/slf4j/impl/test/LoggerTest.java b/logging-adapter-slf4j/src/test/java/org/slf4j/impl/test/LoggerTest.java index 37ac40d..2a37ca3 100644 --- a/logging-adapter-slf4j/src/test/java/org/slf4j/impl/test/LoggerTest.java +++ b/logging-adapter-slf4j/src/test/java/org/slf4j/impl/test/LoggerTest.java @@ -23,6 +23,7 @@ import org.slf4j.Marker; import org.slf4j.helpers.BasicMarkerFactory; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; @@ -58,7 +59,7 @@ public class LoggerTest { @Test public void testLogger() { final Logger logger = LoggerFactory.getLogger(LoggerTest.class); - assertTrue(logger instanceof Slf4jLogger, expectedTypeMessage(Slf4jLogger.class, logger.getClass())); + assertInstanceOf(Slf4jLogger.class, logger, expectedTypeMessage(Slf4jLogger.class, logger.getClass())); // Ensure the logger logs something final String testMsg = "This is a test message"; diff --git a/logging-ext/build.gradle b/logging-ext/build.gradle new file mode 100644 index 0000000..dfceb9a --- /dev/null +++ b/logging-ext/build.gradle @@ -0,0 +1,22 @@ +dependencies { + api project(':logging') +} + +test { + systemProperty 'java.util.logging.manager', 'org.xbib.logging.LogManager' + systemProperty 'javax.net.ssl.keyStore', 'src/test/resources/org/xbib/logging/ext/test/server-keystore.jks' + systemProperty 'javax.net.ssl.keyStorePassword', 'testpassword' + systemProperty 'javax.net.ssl.trustStore', 'src/test/resources/org/xbib/logging/ext/test/client-keystore.jks' + systemProperty 'javax.net.ssl.trustStorePassword', 'testpassword' +} + +def moduleName = 'org.xbib.logging.ext.test' +def patchArgs = ['--patch-module', "$moduleName=" + files(sourceSets.test.resources.srcDirs).asPath ] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs +} diff --git a/logging-ext/src/main/java/module-info.java b/logging-ext/src/main/java/module-info.java new file mode 100644 index 0000000..1bbe51a --- /dev/null +++ b/logging-ext/src/main/java/module-info.java @@ -0,0 +1,10 @@ +module org.xbib.logging.ext { + requires transitive org.xbib.logging; + requires transitive java.xml; + exports org.xbib.logging.ext; + exports org.xbib.logging.ext.formatters; + exports org.xbib.logging.ext.handlers; + exports org.xbib.logging.ext.io; + exports org.xbib.logging.ext.net; + exports org.xbib.logging.ext.util; +} diff --git a/logging/src/main/java/org/xbib/logging/CallerClassLoaderLogContextSelector.java b/logging-ext/src/main/java/org/xbib/logging/ext/CallerClassLoaderLogContextSelector.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/CallerClassLoaderLogContextSelector.java rename to logging-ext/src/main/java/org/xbib/logging/ext/CallerClassLoaderLogContextSelector.java index 888ec45..b91223e 100644 --- a/logging/src/main/java/org/xbib/logging/CallerClassLoaderLogContextSelector.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/CallerClassLoaderLogContextSelector.java @@ -1,8 +1,10 @@ -package org.xbib.logging; +package org.xbib.logging.ext; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentMap; +import org.xbib.logging.LogContext; +import org.xbib.logging.LogContextSelector; import org.xbib.logging.util.CopyOnWriteMap; import org.xbib.logging.util.StackWalkerUtil; diff --git a/logging/src/main/java/org/xbib/logging/ClassLoaderLogContextSelector.java b/logging-ext/src/main/java/org/xbib/logging/ext/ClassLoaderLogContextSelector.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/ClassLoaderLogContextSelector.java rename to logging-ext/src/main/java/org/xbib/logging/ext/ClassLoaderLogContextSelector.java index 55d86f6..322c306 100644 --- a/logging/src/main/java/org/xbib/logging/ClassLoaderLogContextSelector.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/ClassLoaderLogContextSelector.java @@ -1,9 +1,11 @@ -package org.xbib.logging; +package org.xbib.logging.ext; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; +import org.xbib.logging.LogContext; +import org.xbib.logging.LogContextSelector; import org.xbib.logging.util.CopyOnWriteMap; import org.xbib.logging.util.StackWalkerUtil; @@ -84,6 +86,7 @@ public final class ClassLoaderLogContextSelector implements LogContextSelector { * {@inheritDoc} This instance will consult the call stack to see if any calling classloader is associated * with any log context. */ + @Override public LogContext getLogContext() { final LogContext result = StackWalkerUtil.logContextFinder(logApiClassLoaders, logContextFinder); if (result != null) { diff --git a/logging/src/main/java/org/xbib/logging/ContextClassLoaderLogContextSelector.java b/logging-ext/src/main/java/org/xbib/logging/ext/ContextClassLoaderLogContextSelector.java similarity index 95% rename from logging/src/main/java/org/xbib/logging/ContextClassLoaderLogContextSelector.java rename to logging-ext/src/main/java/org/xbib/logging/ext/ContextClassLoaderLogContextSelector.java index 21e5f59..17af5d5 100644 --- a/logging/src/main/java/org/xbib/logging/ContextClassLoaderLogContextSelector.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/ContextClassLoaderLogContextSelector.java @@ -1,6 +1,8 @@ -package org.xbib.logging; +package org.xbib.logging.ext; import java.util.concurrent.ConcurrentMap; +import org.xbib.logging.LogContext; +import org.xbib.logging.LogContextSelector; import org.xbib.logging.util.CopyOnWriteMap; import static java.lang.Thread.currentThread; @@ -28,6 +30,7 @@ public final class ContextClassLoaderLogContextSelector implements LogContextSel private final ConcurrentMap contextMap = new CopyOnWriteMap<>(); + @Override public LogContext getLogContext() { ClassLoader cl = currentThread().getContextClassLoader(); if (cl != null) { diff --git a/logging/src/main/java/org/xbib/logging/ThreadLocalLogContextSelector.java b/logging-ext/src/main/java/org/xbib/logging/ext/ThreadLocalLogContextSelector.java similarity index 94% rename from logging/src/main/java/org/xbib/logging/ThreadLocalLogContextSelector.java rename to logging-ext/src/main/java/org/xbib/logging/ext/ThreadLocalLogContextSelector.java index 468b1c6..898a6cd 100644 --- a/logging/src/main/java/org/xbib/logging/ThreadLocalLogContextSelector.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/ThreadLocalLogContextSelector.java @@ -1,4 +1,7 @@ -package org.xbib.logging; +package org.xbib.logging.ext; + +import org.xbib.logging.LogContext; +import org.xbib.logging.LogContextSelector; /** * A log context selector which stores the chosen log context in a thread-local. diff --git a/logging/src/main/java/org/xbib/logging/formatters/ColorPatternFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/ColorPatternFormatter.java similarity index 64% rename from logging/src/main/java/org/xbib/logging/formatters/ColorPatternFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/ColorPatternFormatter.java index aac7fd5..366a149 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/ColorPatternFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/ColorPatternFormatter.java @@ -1,10 +1,13 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.util.logging.Formatter; import java.util.logging.LogRecord; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; import org.xbib.logging.handlers.ConsoleHandler; +import org.xbib.logging.ext.util.formatter.ColorPrintf; +import org.xbib.logging.ext.util.formatter.ColorUtil; +import org.xbib.logging.ext.util.formatter.Printf; import static java.lang.Math.abs; /** @@ -25,7 +28,7 @@ public class ColorPatternFormatter extends PatternFormatter { public ColorPatternFormatter(int darken) { this.darken = darken; - printf = new ColorPrintf(darken); + this.printf = new ColorPrintf(darken); } public ColorPatternFormatter(int darken, final String pattern) { @@ -42,58 +45,32 @@ public class ColorPatternFormatter extends PatternFormatter { } private FormatStep colorize(final FormatStep step) { - switch (step.getItemType()) { - case LEVEL: - return new LevelColorStep(step, darken); - case SOURCE_CLASS_NAME: - return new ColorStep(step, 0xff, 0xff, 0x44, darken); - case DATE: - return new ColorStep(step, 0xc0, 0xc0, 0xc0, darken); - case SOURCE_FILE_NAME: - return new ColorStep(step, 0xff, 0xff, 0x44, darken); - case HOST_NAME: - return new ColorStep(step, 0x44, 0xff, 0x44, darken); - case SOURCE_LINE_NUMBER: - return new ColorStep(step, 0xff, 0xff, 0x44, darken); - case LINE_SEPARATOR: - return step; - case CATEGORY: - return new ColorStep(step, 0x44, 0x88, 0xff, darken); - case MDC: - return new ColorStep(step, 0x44, 0xff, 0xaa, darken); - case MESSAGE: - return new ColorStep(step, 0xff, 0xff, 0xff, darken); - case EXCEPTION_TRACE: - return new ColorStep(step, 0xff, 0x44, 0x44, darken); - case SOURCE_METHOD_NAME: - return new ColorStep(step, 0xff, 0xff, 0x44, darken); - case SOURCE_MODULE_NAME: - return new ColorStep(step, 0x88, 0xff, 0x44, darken); - case SOURCE_MODULE_VERSION: - return new ColorStep(step, 0x44, 0xff, 0x44, darken); - case NDC: - return new ColorStep(step, 0x44, 0xff, 0xaa, darken); - case PROCESS_ID: - return new ColorStep(step, 0xdd, 0xbb, 0x77, darken); - case PROCESS_NAME: - return new ColorStep(step, 0xdd, 0xdd, 0x77, darken); - case RELATIVE_TIME: - return new ColorStep(step, 0xc0, 0xc0, 0xc0, darken); - case RESOURCE_KEY: - return new ColorStep(step, 0x44, 0xff, 0x44, darken); - case SYSTEM_PROPERTY: - return new ColorStep(step, 0x88, 0x88, 0x00, darken); - case TEXT: - return new ColorStep(step, 0xd0, 0xd0, 0xd0, darken); - case THREAD_ID: - return new ColorStep(step, 0x44, 0xaa, 0x44, darken); - case THREAD_NAME: - return new ColorStep(step, 0x44, 0xaa, 0x44, darken); - case COMPOUND: - case GENERIC: - default: - return new ColorStep(step, 0xb0, 0xd0, 0xb0, darken); - } + return switch (step.getItemType()) { + case LEVEL -> new LevelColorStep(step, darken); + case SOURCE_CLASS_NAME -> new ColorStep(step, 0xff, 0xff, 0x44, darken); + case DATE -> new ColorStep(step, 0xc0, 0xc0, 0xc0, darken); + case SOURCE_FILE_NAME -> new ColorStep(step, 0xff, 0xff, 0x44, darken); + case HOST_NAME -> new ColorStep(step, 0x44, 0xff, 0x44, darken); + case SOURCE_LINE_NUMBER -> new ColorStep(step, 0xff, 0xff, 0x44, darken); + case LINE_SEPARATOR -> step; + case CATEGORY -> new ColorStep(step, 0x44, 0x88, 0xff, darken); + case MDC -> new ColorStep(step, 0x44, 0xff, 0xaa, darken); + case MESSAGE -> new ColorStep(step, 0xff, 0xff, 0xff, darken); + case EXCEPTION_TRACE -> new ColorStep(step, 0xff, 0x44, 0x44, darken); + case SOURCE_METHOD_NAME -> new ColorStep(step, 0xff, 0xff, 0x44, darken); + case SOURCE_MODULE_NAME -> new ColorStep(step, 0x88, 0xff, 0x44, darken); + case SOURCE_MODULE_VERSION -> new ColorStep(step, 0x44, 0xff, 0x44, darken); + case NDC -> new ColorStep(step, 0x44, 0xff, 0xaa, darken); + case PROCESS_ID -> new ColorStep(step, 0xdd, 0xbb, 0x77, darken); + case PROCESS_NAME -> new ColorStep(step, 0xdd, 0xdd, 0x77, darken); + case RELATIVE_TIME -> new ColorStep(step, 0xc0, 0xc0, 0xc0, darken); + case RESOURCE_KEY -> new ColorStep(step, 0x44, 0xff, 0x44, darken); + case SYSTEM_PROPERTY -> new ColorStep(step, 0x88, 0x88, 0x00, darken); + case TEXT -> new ColorStep(step, 0xd0, 0xd0, 0xd0, darken); + case THREAD_ID -> new ColorStep(step, 0x44, 0xaa, 0x44, darken); + case THREAD_NAME -> new ColorStep(step, 0x44, 0xaa, 0x44, darken); + default -> new ColorStep(step, 0xb0, 0xd0, 0xb0, darken); + }; } private String colorizePlain(final String str) { diff --git a/logging/src/main/java/org/xbib/logging/formatters/FormatStep.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/FormatStep.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/FormatStep.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/FormatStep.java index ffabda0..16fd93c 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/FormatStep.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/FormatStep.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.util.logging.Formatter; import org.xbib.logging.ExtLogRecord; diff --git a/logging/src/main/java/org/xbib/logging/formatters/Formatters.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/Formatters.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/formatters/Formatters.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/Formatters.java index 20a4118..2c1ac99 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/Formatters.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/Formatters.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.io.PrintWriter; import java.time.Duration; @@ -18,6 +18,8 @@ import java.util.logging.LogRecord; import java.util.regex.Pattern; import org.xbib.logging.ExtFormatter; import org.xbib.logging.ExtLogRecord; +import org.xbib.logging.ext.util.formatter.ColorMap; +import org.xbib.logging.ext.io.StringBuilderWriter; import org.xbib.logging.util.StackTraceFormatter; import static java.lang.Math.max; import static java.lang.Math.min; @@ -62,14 +64,17 @@ public final class Formatters { */ public static FormatStep textFormatStep(final String string) { return new FormatStep() { + @Override public void render(final StringBuilder builder, final ExtLogRecord record) { builder.append(string); } + @Override public int estimateLength() { return string.length(); } + @Override public ItemType getItemType() { return ItemType.TEXT; } @@ -173,10 +178,12 @@ public final class Formatters { this.maximumWidth = maximumWidth == 0 ? Integer.MAX_VALUE : maximumWidth; } + @Override public void render(final StringBuilder builder, final ExtLogRecord record) { render(null, builder, record); } + @Override public void render(Formatter formatter, StringBuilder builder, ExtLogRecord record) { final int minimumWidth = this.minimumWidth; final int maximumWidth = this.maximumWidth; @@ -222,6 +229,7 @@ public final class Formatters { } } + @Override public int estimateLength() { final int maximumWidth = this.maximumWidth; final int minimumWidth = this.minimumWidth; @@ -253,6 +261,7 @@ public final class Formatters { this.precision = precision; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { if (precision == null) { builder.append(applySegments(count, getSegmentedSubject(record))); @@ -296,6 +305,7 @@ public final class Formatters { return ItemType.CATEGORY; } + @Override public String getSegmentedSubject(final ExtLogRecord record) { return record.getLoggerName(); } @@ -341,6 +351,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_CLASS_NAME; } @@ -386,6 +397,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_MODULE_NAME; } @@ -415,6 +427,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_MODULE_VERSION; } @@ -454,10 +467,12 @@ public final class Formatters { final DateTimeFormatter dtf = DateTimeFormatter .ofPattern(formatString == null ? "yyyy-MM-dd HH:mm:ss,SSS" : formatString); + @Override public ItemType getItemType() { return ItemType.DATE; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { dtf.formatTo(record.getInstant().atZone(timeZone.toZoneId()), builder); } @@ -513,6 +528,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_FILE_NAME; } @@ -554,10 +570,13 @@ public final class Formatters { public static FormatStep processIdFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + + @Override public ItemType getItemType() { return ItemType.PROCESS_ID; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(record.getProcessId()); } @@ -578,10 +597,13 @@ public final class Formatters { final boolean truncateBeginning, final int maximumWidth, final boolean qualified) { return qualified ? hostnameFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth, null) : new SegmentedFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth, null) { + + @Override public ItemType getItemType() { return ItemType.HOST_NAME; } + @Override public String getSegmentedSubject(final ExtLogRecord record) { final String hostName = record.getHostName(); final int idx = hostName.indexOf('.'); @@ -604,10 +626,12 @@ public final class Formatters { public static FormatStep hostnameFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth, final String precision) { return new SegmentedFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth, null) { + @Override public ItemType getItemType() { return ItemType.HOST_NAME; } + @Override public String getSegmentedSubject(final ExtLogRecord record) { final String hostName = record.getHostName(); // Check for a specified precision. This is not passed to the constructor because we want truncate @@ -662,6 +686,7 @@ public final class Formatters { public static FormatStep locationInformationFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { final String fileName = record.getSourceFileName(); final int lineNumber = record.getSourceLineNumber(); @@ -717,6 +742,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_LINE_NUMBER; } @@ -747,6 +773,7 @@ public final class Formatters { public static FormatStep messageFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { String formatted; if (formatter == null @@ -764,6 +791,7 @@ public final class Formatters { } // not really correct but doesn't matter for now + @Override public ItemType getItemType() { return ItemType.MESSAGE; } @@ -797,6 +825,7 @@ public final class Formatters { public static FormatStep simpleMessageFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { String formatted; if (formatter == null @@ -837,10 +866,12 @@ public final class Formatters { public static FormatStep simpleMessageFormatStep(final ExtFormatter formatter, final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(formatter.formatMessage(record)); } + @Override public ItemType getItemType() { return ItemType.MESSAGE; } @@ -874,11 +905,14 @@ public final class Formatters { public static FormatStep exceptionFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth, final String argument, final boolean extended) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + // not really correct but doesn't matter for now + @Override public ItemType getItemType() { return ItemType.EXCEPTION_TRACE; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { doExceptionFormatStep(builder, record, argument, extended); } @@ -924,10 +958,12 @@ public final class Formatters { public static FormatStep resourceKeyFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.RESOURCE_KEY; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { final String key = record.getResourceKey(); if (key != null) @@ -962,6 +998,7 @@ public final class Formatters { public static FormatStep methodNameFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(record.getSourceMethodName()); } @@ -971,6 +1008,7 @@ public final class Formatters { return true; } + @Override public ItemType getItemType() { return ItemType.SOURCE_METHOD_NAME; } @@ -1004,10 +1042,12 @@ public final class Formatters { public static FormatStep lineSeparatorFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.SOURCE_LINE_NUMBER; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(separatorString); } @@ -1038,10 +1078,12 @@ public final class Formatters { public static FormatStep levelFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.LEVEL; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { final Level level = record.getLevel(); builder.append(level.getName()); @@ -1074,10 +1116,12 @@ public final class Formatters { public static FormatStep localizedLevelFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.LEVEL; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { final Level level = record.getLevel(); builder.append(level.getResourceBundleName() != null ? level.getLocalizedName() : level.getName()); @@ -1112,10 +1156,12 @@ public final class Formatters { public static FormatStep relativeTimeFormatStep(final long baseTime, final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.RELATIVE_TIME; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(Duration.between(Instant.ofEpochMilli(baseTime), record.getInstant()).toMillis()); } @@ -1154,10 +1200,12 @@ public final class Formatters { public static FormatStep threadIdFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.THREAD_ID; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(record.getLongThreadID()); } @@ -1188,10 +1236,12 @@ public final class Formatters { public static FormatStep threadNameFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.THREAD_NAME; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { builder.append(record.getThreadName()); } @@ -1223,10 +1273,12 @@ public final class Formatters { public static FormatStep ndcFormatStep(final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth, final int count) { return new SegmentedFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth, count) { + @Override public ItemType getItemType() { return ItemType.NDC; } + @Override public String getSegmentedSubject(final ExtLogRecord record) { return record.getNdc(); } @@ -1258,10 +1310,12 @@ public final class Formatters { public static FormatStep mdcFormatStep(final String key, final boolean leftJustify, final int minimumWidth, final boolean truncateBeginning, final int maximumWidth) { return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + @Override public ItemType getItemType() { return ItemType.MDC; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { if (key == null) { builder.append(new TreeMap<>(record.getMdcCopy())); @@ -1277,6 +1331,8 @@ public final class Formatters { public static FormatStep formatColor(final ColorMap colors, final String color) { return new FormatStep() { + + @Override public void render(final StringBuilder builder, final ExtLogRecord record) { String code = colors.getCode(color, record.getLevel()); if (code != null) { @@ -1284,6 +1340,7 @@ public final class Formatters { } } + @Override public int estimateLength() { return 7; } @@ -1309,10 +1366,13 @@ public final class Formatters { throw new IllegalArgumentException("System property requires a key for the lookup"); } return new JustifyingFormatStep(leftJustify, minimumWidth, truncateBeginning, maximumWidth) { + + @Override public ItemType getItemType() { return ItemType.SYSTEM_PROPERTY; } + @Override public void renderRaw(Formatter formatter, final StringBuilder builder, final ExtLogRecord record) { // Check for a default value final String[] parts = argument.split("(? 0 ? Integer.parseInt(len.toString()) : 0); - segments.put(pos, new Segment(i, text.length() > 0 ? text.toString() : null)); + final int i = (!len.isEmpty() ? Integer.parseInt(len.toString()) : 0); + segments.put(pos, new Segment(i, !text.isEmpty() ? text.toString() : null)); text = new StringBuilder(); len = new StringBuilder(); } else { text.append(c); } } - if (len.length() > 0 || text.length() > 0) { + if (!len.isEmpty() || !text.isEmpty()) { pos++; - final int i = (len.length() > 0 ? Integer.parseInt(len.toString()) : 0); - segments.put(pos, new Segment(i, text.length() > 0 ? text.toString() : null)); + final int i = (!len.isEmpty() ? Integer.parseInt(len.toString()) : 0); + segments.put(pos, new Segment(i, !text.isEmpty() ? text.toString() : null)); } return Collections.unmodifiableMap(segments); } @@ -1359,7 +1419,7 @@ public final class Formatters { StringBuilder cat = new StringBuilder(); for (char c : category.toCharArray()) { if (c == '.') { - if (cat.length() > 0) { + if (!cat.isEmpty()) { categorySegments.add(cat.toString()); cat = new StringBuilder(); } else { @@ -1369,7 +1429,7 @@ public final class Formatters { cat.append(c); } } - if (cat.length() > 0) { + if (!cat.isEmpty()) { categorySegments.add(cat.toString()); } return categorySegments; diff --git a/logging/src/main/java/org/xbib/logging/formatters/MultistepFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/MultistepFormatter.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/MultistepFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/MultistepFormatter.java index e150739..d28c1fa 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/MultistepFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/MultistepFormatter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import org.xbib.logging.ExtFormatter; import org.xbib.logging.ExtLogRecord; diff --git a/logging/src/main/java/org/xbib/logging/formatters/PatternFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/PatternFormatter.java similarity index 95% rename from logging/src/main/java/org/xbib/logging/formatters/PatternFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/PatternFormatter.java index e429c07..66f9be3 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/PatternFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/PatternFormatter.java @@ -1,4 +1,7 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; + +import org.xbib.logging.ext.util.formatter.ColorMap; +import org.xbib.logging.ext.util.formatter.FormatStringParser; /** * A formatter which uses a text pattern to format messages. diff --git a/logging/src/main/java/org/xbib/logging/formatters/StructuredFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/StructuredFormatter.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/formatters/StructuredFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/StructuredFormatter.java index 4ea1177..940af17 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/StructuredFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/StructuredFormatter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.io.Writer; import java.time.ZoneId; @@ -9,6 +9,7 @@ import java.util.IdentityHashMap; import java.util.Map; import org.xbib.logging.ExtFormatter; import org.xbib.logging.ExtLogRecord; +import org.xbib.logging.ext.io.StringBuilderWriter; import org.xbib.logging.util.PropertyValues; import org.xbib.logging.util.StackTraceFormatter; diff --git a/logging/src/main/java/org/xbib/logging/formatters/TextBannerFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/TextBannerFormatter.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/formatters/TextBannerFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/TextBannerFormatter.java index cfa2d74..dc7f446 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/TextBannerFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/TextBannerFormatter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.io.IOException; import java.io.InputStream; diff --git a/logging/src/main/java/org/xbib/logging/formatters/XmlFormatter.java b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/XmlFormatter.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/XmlFormatter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/formatters/XmlFormatter.java index 785f193..2c10754 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/XmlFormatter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/formatters/XmlFormatter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.formatters; import java.io.Writer; import java.util.Map; @@ -6,6 +6,7 @@ import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.xbib.logging.ExtLogRecord; +import org.xbib.logging.ext.io.IndentingXmlWriter; import org.xbib.logging.util.PropertyValues; /** diff --git a/logging/src/main/java/org/xbib/logging/handlers/AsyncHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/AsyncHandler.java similarity index 95% rename from logging/src/main/java/org/xbib/logging/handlers/AsyncHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/AsyncHandler.java index 52ba559..c280b9e 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/AsyncHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/AsyncHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -23,8 +23,8 @@ public class AsyncHandler extends ExtHandler { @SuppressWarnings("unused") private volatile int state; - private static final AtomicIntegerFieldUpdater stateUpdater = AtomicIntegerFieldUpdater - .newUpdater(AsyncHandler.class, "state"); + private static final AtomicIntegerFieldUpdater stateUpdater = + AtomicIntegerFieldUpdater.newUpdater(AsyncHandler.class, "state"); private static final int DEFAULT_QUEUE_LENGTH = 512; @@ -35,7 +35,7 @@ public class AsyncHandler extends ExtHandler { * @param threadFactory the thread factory to use to construct the handler thread */ public AsyncHandler(final int queueLength, final ThreadFactory threadFactory) { - recordQueue = new ArrayBlockingQueue(queueLength); + recordQueue = new ArrayBlockingQueue<>(queueLength); thread = threadFactory.newThread(new AsyncTask()); if (thread == null) { throw new IllegalArgumentException("Thread factory did not create a thread"); @@ -160,7 +160,7 @@ public class AsyncHandler extends ExtHandler { boolean intr = false; try { for (; ; ) { - ExtLogRecord rec = null; + ExtLogRecord rec; try { if (state == 2) { rec = recordQueue.poll(); diff --git a/logging/src/main/java/org/xbib/logging/handlers/DelayedHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/DelayedHandler.java similarity index 81% rename from logging/src/main/java/org/xbib/logging/handlers/DelayedHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/DelayedHandler.java index 5680da8..00a15a4 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/DelayedHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/DelayedHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.util.ArrayDeque; import java.util.Arrays; @@ -14,7 +14,7 @@ import java.util.logging.Level; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.LogContext; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.ext.formatters.PatternFormatter; import org.xbib.logging.util.StandardOutputStreams; /** @@ -148,69 +148,72 @@ public class DelayedHandler extends ExtHandler { * @param record the record */ private void enqueueOrdered(Deque q, ExtLogRecord record) { - assert lock.isHeldByCurrentThread(); - ExtLogRecord last = q.peekLast(); - if (last != null) { - // check the ordering - if (Long.compareUnsigned(last.getSequenceNumber(), record.getSequenceNumber()) > 0) { - // out of order; we have to re-sort.. typically, it's only going to be out of order by a couple though - q.pollLast(); - try { - enqueueOrdered(q, record); - } finally { - q.addLast(last); + if (lock.isHeldByCurrentThread()) { + ExtLogRecord last = q.peekLast(); + if (last != null) { + // check the ordering + if (Long.compareUnsigned(last.getSequenceNumber(), record.getSequenceNumber()) > 0) { + // out of order; we have to re-sort.. typically, it's only going to be out of order by a couple though + q.pollLast(); + try { + enqueueOrdered(q, record); + } finally { + q.addLast(last); + } + return; } - return; } + // order is OK + q.addLast(record); } - // order is OK - q.addLast(record); } private Supplier drain() { - assert lock.isHeldByCurrentThread(); - if (queues.isEmpty()) { - return () -> null; - } - List> values = List.copyOf(queues.values()); - queues.clear(); - int size = values.size(); - List current = Arrays.asList(new ExtLogRecord[size]); - // every queue must have at least one item in it - int i = 0; - for (Deque value : values) { - current.set(i++, value.removeFirst()); - } - return new Supplier() { - @Override - public ExtLogRecord get() { - ExtLogRecord min = null; - int minIdx = 0; - for (int i = 0; i < size; i++) { - ExtLogRecord item = current.get(i); - if (compareSeq(min, item) > 0) { - min = item; - minIdx = i; + if (lock.isHeldByCurrentThread()) { + if (queues.isEmpty()) { + return () -> null; + } + List> values = List.copyOf(queues.values()); + queues.clear(); + int size = values.size(); + List current = Arrays.asList(new ExtLogRecord[size]); + // every queue must have at least one item in it + int i = 0; + for (Deque value : values) { + current.set(i++, value.removeFirst()); + } + return new Supplier<>() { + @Override + public ExtLogRecord get() { + ExtLogRecord min = null; + int minIdx = 0; + for (int i = 0; i < size; i++) { + ExtLogRecord item = current.get(i); + if (compareSeq(min, item) > 0) { + min = item; + minIdx = i; + } + } + if (min == null) { + return null; + } + current.set(minIdx, values.get(minIdx).pollFirst()); + return min; + } + + private int compareSeq(ExtLogRecord min, ExtLogRecord testItem) { + if (min == null) { + // null is greater than everything + return testItem == null ? 0 : 1; + } else if (testItem == null) { + return -1; + } else { + return Long.compareUnsigned(min.getSequenceNumber(), testItem.getSequenceNumber()); } } - if (min == null) { - return null; - } - current.set(minIdx, values.get(minIdx).pollFirst()); - return min; - } - - private int compareSeq(ExtLogRecord min, ExtLogRecord testItem) { - if (min == null) { - // null is greater than everything - return testItem == null ? 0 : 1; - } else if (testItem == null) { - return -1; - } else { - return Long.compareUnsigned(min.getSequenceNumber(), testItem.getSequenceNumber()); - } - } - }; + }; + } + return () -> null; } @Override diff --git a/logging/src/main/java/org/xbib/logging/handlers/PeriodicRotatingFileHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicRotatingFileHandler.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/handlers/PeriodicRotatingFileHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicRotatingFileHandler.java index 6a9e22a..a22bf24 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/PeriodicRotatingFileHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicRotatingFileHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.io.File; import java.io.FileNotFoundException; @@ -11,7 +11,8 @@ import java.time.temporal.ChronoUnit; import java.util.TimeZone; import java.util.logging.ErrorManager; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.util.SuffixRotator; +import org.xbib.logging.handlers.FileHandler; +import org.xbib.logging.ext.util.SuffixRotator; /** * A file handler which rotates the log at a preset time interval. The interval is determined by the content of the diff --git a/logging/src/main/java/org/xbib/logging/handlers/PeriodicSizeRotatingFileHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicSizeRotatingFileHandler.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/handlers/PeriodicSizeRotatingFileHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicSizeRotatingFileHandler.java index cb56196..c9a0d0c 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/PeriodicSizeRotatingFileHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/PeriodicSizeRotatingFileHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.io.File; import java.io.FileNotFoundException; @@ -6,8 +6,8 @@ import java.io.IOException; import java.io.OutputStream; import java.util.logging.ErrorManager; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.io.CountingOutputStream; -import org.xbib.logging.util.SuffixRotator; +import org.xbib.logging.ext.io.CountingOutputStream; +import org.xbib.logging.ext.util.SuffixRotator; /** * A file handler which rotates the log at a preset time interval or the size of the log. diff --git a/logging/src/main/java/org/xbib/logging/handlers/QueueHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/QueueHandler.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/handlers/QueueHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/QueueHandler.java index 0bf1b60..547b618 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/QueueHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/QueueHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.util.ArrayDeque; import java.util.Deque; diff --git a/logging/src/main/java/org/xbib/logging/handlers/SizeRotatingFileHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SizeRotatingFileHandler.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/handlers/SizeRotatingFileHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/SizeRotatingFileHandler.java index 48d00cc..b480f6e 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/SizeRotatingFileHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SizeRotatingFileHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.io.File; import java.io.FileNotFoundException; @@ -6,8 +6,9 @@ import java.io.IOException; import java.io.OutputStream; import java.util.logging.ErrorManager; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.io.CountingOutputStream; -import org.xbib.logging.util.SuffixRotator; +import org.xbib.logging.handlers.FileHandler; +import org.xbib.logging.ext.io.CountingOutputStream; +import org.xbib.logging.ext.util.SuffixRotator; public class SizeRotatingFileHandler extends FileHandler { diff --git a/logging/src/main/java/org/xbib/logging/handlers/SocketHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SocketHandler.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/handlers/SocketHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/SocketHandler.java index fce6175..f61330a 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/SocketHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SocketHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.io.Closeable; import java.io.Flushable; @@ -15,10 +15,10 @@ import javax.net.SocketFactory; import javax.net.ssl.SSLSocketFactory; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.io.TcpOutputStream; -import org.xbib.logging.io.UdpOutputStream; +import org.xbib.logging.ext.io.TcpOutputStream; +import org.xbib.logging.ext.io.UdpOutputStream; import org.xbib.logging.io.UninterruptibleOutputStream; -import org.xbib.logging.net.ClientSocketFactory; +import org.xbib.logging.ext.net.ClientSocketFactory; /** * A handler used to communicate over a socket. diff --git a/logging/src/main/java/org/xbib/logging/handlers/SyslogHandler.java b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SyslogHandler.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/handlers/SyslogHandler.java rename to logging-ext/src/main/java/org/xbib/logging/ext/handlers/SyslogHandler.java index e573273..6f43556 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/SyslogHandler.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/handlers/SyslogHandler.java @@ -1,4 +1,4 @@ -package org.xbib.logging.handlers; +package org.xbib.logging.ext.handlers; import java.io.Closeable; import java.io.Flushable; @@ -24,10 +24,10 @@ import javax.net.SocketFactory; import javax.net.ssl.SSLSocketFactory; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.io.TcpOutputStream; -import org.xbib.logging.io.UdpOutputStream; -import org.xbib.logging.net.ClientSocketFactory; -import org.xbib.logging.util.ByteStringBuilder; +import org.xbib.logging.ext.io.TcpOutputStream; +import org.xbib.logging.ext.io.UdpOutputStream; +import org.xbib.logging.ext.net.ClientSocketFactory; +import org.xbib.logging.ext.util.ByteStringBuilder; import static java.time.temporal.ChronoField.DAY_OF_MONTH; import static java.time.temporal.ChronoField.HOUR_OF_DAY; import static java.time.temporal.ChronoField.MILLI_OF_SECOND; diff --git a/logging/src/main/java/org/xbib/logging/io/CountingOutputStream.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/CountingOutputStream.java similarity index 96% rename from logging/src/main/java/org/xbib/logging/io/CountingOutputStream.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/CountingOutputStream.java index 592b7f3..be7378d 100644 --- a/logging/src/main/java/org/xbib/logging/io/CountingOutputStream.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/CountingOutputStream.java @@ -1,4 +1,4 @@ -package org.xbib.logging.io; +package org.xbib.logging.ext.io; import java.io.IOException; import java.io.OutputStream; diff --git a/logging/src/main/java/org/xbib/logging/formatters/IndentingXmlWriter.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/IndentingXmlWriter.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/IndentingXmlWriter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/IndentingXmlWriter.java index 70f06dd..b70c4a1 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/IndentingXmlWriter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/IndentingXmlWriter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.io; import java.util.Iterator; import java.util.NoSuchElementException; @@ -10,7 +10,7 @@ import javax.xml.stream.XMLStreamWriter; /** * An XML stream writer which pretty prints the XML. */ -class IndentingXmlWriter implements XMLStreamWriter, XMLStreamConstants { +public class IndentingXmlWriter implements XMLStreamWriter, XMLStreamConstants { private static final String SPACES = " "; @@ -19,7 +19,7 @@ class IndentingXmlWriter implements XMLStreamWriter, XMLStreamConstants { private int state = START_DOCUMENT; private boolean indentEnd; - IndentingXmlWriter(final XMLStreamWriter delegate) { + public IndentingXmlWriter(final XMLStreamWriter delegate) { this.delegate = delegate; index = 0; indentEnd = false; diff --git a/logging/src/main/java/org/xbib/logging/io/SslTcpOutputStream.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/SslTcpOutputStream.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/io/SslTcpOutputStream.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/SslTcpOutputStream.java index 5a4b9aa..446f2de 100644 --- a/logging/src/main/java/org/xbib/logging/io/SslTcpOutputStream.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/SslTcpOutputStream.java @@ -1,4 +1,4 @@ -package org.xbib.logging.io; +package org.xbib.logging.ext.io; import java.io.Flushable; import java.io.IOException; diff --git a/logging/src/main/java/org/xbib/logging/formatters/StringBuilderWriter.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/StringBuilderWriter.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/formatters/StringBuilderWriter.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/StringBuilderWriter.java index 6f82da6..ba05e12 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/StringBuilderWriter.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/StringBuilderWriter.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.io; import java.io.Writer; diff --git a/logging/src/main/java/org/xbib/logging/io/TcpOutputStream.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/TcpOutputStream.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/io/TcpOutputStream.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/TcpOutputStream.java index 7efb571..e3949e6 100644 --- a/logging/src/main/java/org/xbib/logging/io/TcpOutputStream.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/TcpOutputStream.java @@ -1,4 +1,4 @@ -package org.xbib.logging.io; +package org.xbib.logging.ext.io; import java.io.Closeable; import java.io.Flushable; @@ -16,7 +16,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import javax.net.SocketFactory; -import org.xbib.logging.net.ClientSocketFactory; +import org.xbib.logging.ext.net.ClientSocketFactory; /** * An output stream that writes data to a {@link Socket socket}. diff --git a/logging/src/main/java/org/xbib/logging/io/UdpOutputStream.java b/logging-ext/src/main/java/org/xbib/logging/ext/io/UdpOutputStream.java similarity index 95% rename from logging/src/main/java/org/xbib/logging/io/UdpOutputStream.java rename to logging-ext/src/main/java/org/xbib/logging/ext/io/UdpOutputStream.java index 5c39032..ef1eff6 100644 --- a/logging/src/main/java/org/xbib/logging/io/UdpOutputStream.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/io/UdpOutputStream.java @@ -1,4 +1,4 @@ -package org.xbib.logging.io; +package org.xbib.logging.ext.io; import java.io.Flushable; import java.io.IOException; @@ -8,7 +8,7 @@ import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketAddress; import java.net.SocketException; -import org.xbib.logging.net.ClientSocketFactory; +import org.xbib.logging.ext.net.ClientSocketFactory; /** * An output stream that writes data to a {@link DatagramSocket DatagramSocket}. diff --git a/logging/src/main/java/org/xbib/logging/net/ClientSocketFactory.java b/logging-ext/src/main/java/org/xbib/logging/ext/net/ClientSocketFactory.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/net/ClientSocketFactory.java rename to logging-ext/src/main/java/org/xbib/logging/ext/net/ClientSocketFactory.java index 5c3a5ed..0cecbae 100644 --- a/logging/src/main/java/org/xbib/logging/net/ClientSocketFactory.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/net/ClientSocketFactory.java @@ -1,4 +1,4 @@ -package org.xbib.logging.net; +package org.xbib.logging.ext.net; import java.io.IOException; import java.net.DatagramSocket; diff --git a/logging/src/main/java/org/xbib/logging/util/ByteStringBuilder.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/ByteStringBuilder.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/util/ByteStringBuilder.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/ByteStringBuilder.java index 128c36b..41ab556 100644 --- a/logging/src/main/java/org/xbib/logging/util/ByteStringBuilder.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/ByteStringBuilder.java @@ -1,4 +1,4 @@ -package org.xbib.logging.util; +package org.xbib.logging.ext.util; import java.util.Arrays; diff --git a/logging/src/main/java/org/xbib/logging/util/SuffixRotator.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/SuffixRotator.java similarity index 99% rename from logging/src/main/java/org/xbib/logging/util/SuffixRotator.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/SuffixRotator.java index cf34d19..57c4882 100644 --- a/logging/src/main/java/org/xbib/logging/util/SuffixRotator.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/SuffixRotator.java @@ -1,4 +1,4 @@ -package org.xbib.logging.util; +package org.xbib.logging.ext.util; import java.io.IOException; import java.io.InputStream; diff --git a/logging/src/main/java/org/xbib/logging/formatters/ColorMap.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorMap.java similarity index 91% rename from logging/src/main/java/org/xbib/logging/formatters/ColorMap.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorMap.java index b9f4440..5d25b8d 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/ColorMap.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorMap.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.util.Collections; import java.util.HashMap; @@ -29,16 +29,16 @@ public class ColorMap { private static final String CLEAR = "\033[0m"; - static final boolean SUPPORTS_COLOR; + public static final boolean SUPPORTS_COLOR; private static final Map codes; private static final Map reverseCodes; - private static final Map levels = new HashMap(); - private static final Map reverseLevels = new HashMap(); + private static final Map levels = new HashMap<>(); + private static final Map reverseLevels = new HashMap<>(); - private static final NavigableMap defaultLevelMap = new TreeMap(); + private static final NavigableMap defaultLevelMap = new TreeMap<>(); - static final ColorMap DEFAULT_COLOR_MAP = new ColorMap(defaultLevelMap); + public static final ColorMap DEFAULT_COLOR_MAP = new ColorMap(defaultLevelMap); private final NavigableMap levelMap; @@ -90,12 +90,10 @@ public class ColorMap { static final String BRIGHT_CYAN_NAME = "brightcyan"; static final String BRIGHT_WHITE_NAME = "brightwhite"; - static final String CLEAR_NAME = "clear"; + public static final String CLEAR_NAME = "clear"; static { - // Turn color on by default for everything but Windows, unless ansicon is used - String os = System.getProperty("os.name"); - final boolean dft = os != null && (!os.toLowerCase(Locale.ROOT).contains("win") || System.getenv("ANSICON") != null); + final boolean dft = true; final String nocolor = System.getProperty("org.xbib.logging.nocolor"); SUPPORTS_COLOR = (nocolor == null ? dft : "false".equalsIgnoreCase(nocolor)); @@ -144,7 +142,7 @@ public class ColorMap { codes.put(BRIGHT_WHITE_NAME, BRIGHT_WHITE); codes.put(CLEAR_NAME, CLEAR); - reverseCodes = new HashMap(); + reverseCodes = new HashMap<>(); reverseCodes.put(DARK_BLACK, BLACK_NAME); reverseCodes.put(DARK_RED, RED_NAME); reverseCodes.put(DARK_GREEN, GREEN_NAME); @@ -170,27 +168,22 @@ public class ColorMap { } else { reverseCodes = codes = Collections.emptyMap(); } - } - static ColorMap create(String expression) { + public static ColorMap create(String expression) { if (expression == null || expression.length() < 3) { return DEFAULT_COLOR_MAP; } - - NavigableMap levelMap = new TreeMap(); - + NavigableMap levelMap = new TreeMap<>(); for (String pair : expression.split(",")) { String[] parts = pair.split(":"); if (parts.length != 2) { continue; } - String color = codes.get(parts[1].toLowerCase(Locale.ROOT)); if (color == null) { continue; } - try { int i = Integer.parseInt(parts[0]); levelMap.put(i, color); @@ -198,23 +191,19 @@ public class ColorMap { } catch (NumberFormatException e) { // eat } - Integer i = levels.get(parts[0].toLowerCase(Locale.ROOT)); if (i == null) { continue; } - levelMap.put(i, color); } - return new ColorMap(levelMap); } - String getCode(String name, java.util.logging.Level level) { + public String getCode(String name, java.util.logging.Level level) { if (name == null || !SUPPORTS_COLOR) { return null; } - String lower = name.toLowerCase(Locale.ROOT); if (lower.equals(LEVEL_NAME)) { Map.Entry entry = levelMap.floorEntry(level.intValue()); @@ -232,7 +221,7 @@ public class ColorMap { builder.append(level == null ? num : level).append(":").append(reverseCodes.get(entry.getValue())) .append(","); } - if (builder.length() > 0) { + if (!builder.isEmpty()) { builder.setLength(builder.length() - 1); } diff --git a/logging/src/main/java/org/xbib/logging/formatters/ColorPrintf.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorPrintf.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/formatters/ColorPrintf.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorPrintf.java index ad7900c..fb66537 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/ColorPrintf.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorPrintf.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.lang.reflect.Executable; import java.lang.reflect.Field; @@ -9,11 +9,11 @@ import java.util.Locale; import java.util.UUID; import org.xbib.logging.handlers.ConsoleHandler; -class ColorPrintf extends Printf { +public class ColorPrintf extends Printf { private final int darken; private final boolean trueColor = ConsoleHandler.isTrueColor(); - ColorPrintf(final int darken) { + public ColorPrintf(final int darken) { super(Locale.getDefault()); this.darken = darken; } diff --git a/logging/src/main/java/org/xbib/logging/formatters/ColorUtil.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorUtil.java similarity index 62% rename from logging/src/main/java/org/xbib/logging/formatters/ColorUtil.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorUtil.java index ec2ff71..5f7ae63 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/ColorUtil.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/ColorUtil.java @@ -1,22 +1,19 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; -/** - * This is a throwaway temp class. - */ -final class ColorUtil { +public final class ColorUtil { private ColorUtil() { } - static StringBuilder startFgColor(StringBuilder target, boolean trueColor, int r, int g, int b) { + public static StringBuilder startFgColor(StringBuilder target, boolean trueColor, int r, int g, int b) { return startColor(target, 38, trueColor, r, g, b); } - static StringBuilder startBgColor(StringBuilder target, boolean trueColor, int r, int g, int b) { + public static StringBuilder startBgColor(StringBuilder target, boolean trueColor, int r, int g, int b) { return startColor(target, 48, trueColor, r, g, b); } - static StringBuilder startColor(StringBuilder target, int mode, boolean trueColor, int r, int g, int b) { + public static StringBuilder startColor(StringBuilder target, int mode, boolean trueColor, int r, int g, int b) { if (trueColor) { return target.appendCodePoint(27).append('[').append(mode).append(';').append(2).append(';').append(clip(r)) .append(';').append(clip(g)).append(';').append(clip(b)).append('m'); @@ -34,15 +31,15 @@ final class ColorUtil { return Math.min(Math.max(0, color), 255); } - static StringBuilder endFgColor(StringBuilder target) { + public static StringBuilder endFgColor(StringBuilder target) { return endColor(target, 39); } - static StringBuilder endBgColor(StringBuilder target) { + public static StringBuilder endBgColor(StringBuilder target) { return endColor(target, 49); } - static StringBuilder endColor(StringBuilder target, int mode) { + public static StringBuilder endColor(StringBuilder target, int mode) { return target.appendCodePoint(27).append('[').append(mode).append('m'); } } diff --git a/logging/src/main/java/org/xbib/logging/formatters/FlagSet.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FlagSet.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/FlagSet.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FlagSet.java index 15504a1..bb2ea82 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/FlagSet.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FlagSet.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.util.AbstractSet; import java.util.Iterator; diff --git a/logging/src/main/java/org/xbib/logging/formatters/FormatStringParser.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FormatStringParser.java similarity index 98% rename from logging/src/main/java/org/xbib/logging/formatters/FormatStringParser.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FormatStringParser.java index 8bc8ee6..75b903b 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/FormatStringParser.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/FormatStringParser.java @@ -1,9 +1,11 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.util.ArrayList; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.xbib.logging.ext.formatters.Formatters; +import org.xbib.logging.ext.formatters.FormatStep; /** * A parser which can translate a log4j-style format string into a series of {@code FormatStep} instances. diff --git a/logging/src/main/java/org/xbib/logging/formatters/GeneralFlag.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlag.java similarity index 70% rename from logging/src/main/java/org/xbib/logging/formatters/GeneralFlag.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlag.java index 6572dc3..d2bc46a 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/GeneralFlag.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlag.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; /** * General formatting flags. diff --git a/logging/src/main/java/org/xbib/logging/formatters/GeneralFlags.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlags.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/formatters/GeneralFlags.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlags.java index 5b67529..33dd6e1 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/GeneralFlags.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/GeneralFlags.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.util.concurrent.atomic.AtomicReferenceArray; diff --git a/logging/src/main/java/org/xbib/logging/formatters/NumericFlag.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlag.java similarity index 73% rename from logging/src/main/java/org/xbib/logging/formatters/NumericFlag.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlag.java index ec17493..7deaeac 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/NumericFlag.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlag.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; enum NumericFlag { SIGN, diff --git a/logging/src/main/java/org/xbib/logging/formatters/NumericFlags.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlags.java similarity index 97% rename from logging/src/main/java/org/xbib/logging/formatters/NumericFlags.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlags.java index d664d40..93747fd 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/NumericFlags.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/NumericFlags.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.util.concurrent.atomic.AtomicReferenceArray; diff --git a/logging/src/main/java/org/xbib/logging/formatters/Printf.java b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/Printf.java similarity index 96% rename from logging/src/main/java/org/xbib/logging/formatters/Printf.java rename to logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/Printf.java index 1b392fc..572c7ca 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/Printf.java +++ b/logging-ext/src/main/java/org/xbib/logging/ext/util/formatter/Printf.java @@ -1,4 +1,4 @@ -package org.xbib.logging.formatters; +package org.xbib.logging.ext.util.formatter; import java.io.IOException; import java.math.BigDecimal; @@ -38,7 +38,15 @@ import static java.lang.Math.max; /** * A string formatter which can be customized. */ -class Printf { +public class Printf { + + private static final int ST_INITIAL = 0; + private static final int ST_PCT = 1; + private static final int ST_TIME = 2; + private static final int ST_WIDTH = 3; + private static final int ST_DOT = 4; + private static final int ST_PREC = 5; + private static final int ST_DOLLAR = 6; private static final String someSpaces = " "; //32 spaces private static final String someZeroes = "00000000000000000000000000000000"; //32 zeros @@ -60,14 +68,6 @@ class Printf { return locale; } - private static final int ST_INITIAL = 0; - private static final int ST_PCT = 1; - private static final int ST_TIME = 2; - private static final int ST_WIDTH = 3; - private static final int ST_DOT = 4; - private static final int ST_PREC = 5; - private static final int ST_DOLLAR = 6; - public String format(String format, Object... params) { return formatDirect(new StringBuilder(), format, params).toString(); } @@ -340,7 +340,7 @@ class Printf { appendStr(destination, genFlags, width, -1, b.toString()); break; } - case 'R': { + case 'R', 'T': { final StringBuilder b = new StringBuilder(); formatTimeField(b, ta, ChronoField.HOUR_OF_DAY, genFlags, -1, 2); b.append(':'); @@ -363,16 +363,6 @@ class Printf { appendStr(destination, genFlags, width, -1, b.toString()); break; } - case 'T': { - final StringBuilder b = new StringBuilder(); - formatTimeField(b, ta, ChronoField.HOUR_OF_DAY, genFlags, -1, 2); - b.append(':'); - formatTimeField(b, ta, ChronoField.MINUTE_OF_HOUR, genFlags, -1, 2); - b.append(':'); - formatTimeField(b, ta, ChronoField.SECOND_OF_MINUTE, genFlags, -1, 2); - appendStr(destination, genFlags, width, -1, b.toString()); - break; - } default: { throw unknownFormat(format, i); } @@ -482,9 +472,9 @@ class Printf { appendStr(destination, genFlags, width, precision, "null"); break; } else if (argVal instanceof Character) { - cpa = ((Character) argVal).charValue(); + cpa = (Character) argVal; } else if (argVal instanceof Integer) { - cpa = ((Integer) argVal).intValue(); + cpa = (Integer) argVal; } else { throw new IllegalFormatConversionException((char) cp, argVal.getClass()); } @@ -518,7 +508,6 @@ class Printf { formatFloatingPointDecimal(destination, item, genFlags, numFlags, width, precision); break; } else { - assert cp == 'g' || cp == 'G'; formatFloatingPointGeneral(destination, item, genFlags, numFlags, width, precision); break; } @@ -832,22 +821,31 @@ class Printf { } } - protected void formatFloatingPointGeneral(StringBuilder target, Number item, GeneralFlags genFlags, NumericFlags numFlags, + protected void formatFloatingPointGeneral(StringBuilder target, + Number item, + GeneralFlags genFlags, + NumericFlags numFlags, int width, int precision) { if (item == null) { appendStr(target, genFlags, width, precision, "null"); } else { boolean sci; - if (item instanceof BigDecimal) { - final BigDecimal mag = ((BigDecimal) item).abs(); - sci = mag.compareTo(NEG_TEN_EM4) < 0 || mag.compareTo(BigDecimal.valueOf(10, precision)) >= 0; - } else if (item instanceof Float) { - final float fv = Math.abs(item.floatValue()); - sci = Float.isFinite(fv) && (fv < 10e-4f || fv >= Math.pow(10, precision)); - } else { - assert item instanceof Double; - final double dv = Math.abs(item.doubleValue()); - sci = Double.isFinite(dv) && (dv < 10e-4f || dv >= Math.pow(10, precision)); + switch (item) { + case BigDecimal bigDecimal -> { + final BigDecimal mag = bigDecimal.abs(); + sci = mag.compareTo(NEG_TEN_EM4) < 0 || mag.compareTo(BigDecimal.valueOf(10, precision)) >= 0; + } + case Float v -> { + final float fv = Math.abs(item.floatValue()); + sci = Float.isFinite(fv) && (fv < 10e-4f || fv >= Math.pow(10, precision)); + } + case Double v -> { + final double dv = Math.abs(item.doubleValue()); + sci = Double.isFinite(dv) && (dv < 10e-4f || dv >= Math.pow(10, precision)); + } + default -> { + sci = false; + } } if (sci) { formatFloatingPointSci(target, item, genFlags, numFlags, width, precision); @@ -902,17 +900,18 @@ class Printf { target.append(iterator.current()); iterator.next(); // move } - assert iterator.getAttribute(NumberFormat.Field.INTEGER) != null; - if (zp && width > end) { - appendZeros(target, width - end); - } - // now continue to the end - while (iterator.getIndex() < end) { - target.append(iterator.current()); - iterator.next(); // move - } - if (lj && width > end) { - appendSpaces(target, width - end); + if (iterator.getAttribute(NumberFormat.Field.INTEGER) != null) { + if (zp && width > end) { + appendZeros(target, width - end); + } + // now continue to the end + while (iterator.getIndex() < end) { + target.append(iterator.current()); + iterator.next(); // move + } + if (lj && width > end) { + appendSpaces(target, width - end); + } } } @@ -937,10 +936,11 @@ class Printf { return 32 - Integer.numberOfLeadingZeros(item.intValue()); } else if (item instanceof Long) { return 64 - Long.numberOfLeadingZeros(item.longValue()); - } else { - assert item instanceof BigInteger; + } else if (item instanceof BigInteger) { return ((BigInteger) item).bitLength(); } + // impossible + return 0; } private static void appendOctal(StringBuilder target, final Number item) { diff --git a/logging-ext/src/test/java/module-info.java b/logging-ext/src/test/java/module-info.java new file mode 100644 index 0000000..0a51642 --- /dev/null +++ b/logging-ext/src/test/java/module-info.java @@ -0,0 +1,10 @@ +module org.xbib.logging.ext.test { + requires transitive org.junit.jupiter.api; + requires transitive org.xbib.logging.ext; + exports org.xbib.logging.ext.test; + exports org.xbib.logging.ext.test.formatters; + exports org.xbib.logging.ext.test.handlers; + opens org.xbib.logging.ext.test to org.junit.platform.commons; + opens org.xbib.logging.ext.test.formatters to org.junit.platform.commons; + opens org.xbib.logging.ext.test.handlers to org.junit.platform.commons; +} diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/AssertingErrorManager.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/AssertingErrorManager.java similarity index 92% rename from logging/src/test/java/org/xbib/logging/test/handlers/AssertingErrorManager.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/AssertingErrorManager.java index a41b698..0112d0b 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/AssertingErrorManager.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/AssertingErrorManager.java @@ -1,10 +1,9 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.ErrorManager; - import org.junit.jupiter.api.Assertions; public class AssertingErrorManager extends ErrorManager { @@ -43,10 +42,13 @@ public class AssertingErrorManager extends ErrorManager { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { pw.printf("LogManager error of type %s: %s%n", codeStr, msg); - ex.printStackTrace(pw); + if (ex != null) { + ex.printStackTrace(pw); + } Assertions.fail(sw.toString()); } catch (IOException e) { // This shouldn't happen, but just fail if it does + e.printStackTrace(); Assertions.fail(String.format("Failed to print error message: %s", e.getMessage())); } } diff --git a/logging-ext/src/test/java/org/xbib/logging/ext/test/MapTestUtils.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/MapTestUtils.java new file mode 100644 index 0000000..94a797a --- /dev/null +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/MapTestUtils.java @@ -0,0 +1,61 @@ +package org.xbib.logging.ext.test; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Supplier; +import org.junit.jupiter.api.Assertions; + +public class MapTestUtils { + + public MapTestUtils() { + } + + /** + * Compares the two maps have the same keys and same values in any order. + * + * @param m1 the first map used to compare the keys and values + * @param m2 the second map used to compare the keys and values + * @param the key type + * @param the value type + */ + @SuppressWarnings("WeakerAccess") + public static void compareMaps(final Map m1, final Map m2) { + Supplier failureMessage = () -> String.format("Keys did not match%n%s%n%s%n", m1.keySet(), m2.keySet()); + Assertions.assertTrue(m1.keySet().containsAll(m2.keySet()), failureMessage); + Assertions.assertTrue(m2.keySet().containsAll(m1.keySet()), failureMessage); + + // At this point we know that all the keys match + for (Map.Entry entry1 : m1.entrySet()) { + final V value2 = m2.get(entry1.getKey()); + Assertions.assertEquals(entry1.getValue(), value2, + () -> String.format("Value %s from the first map does not match value %s from the second map with key %s.", + entry1.getValue(), value2, entry1.getKey())); + } + } + + /** + * A helper to easily build maps. The resulting map is immutable and the order is predictable with the + * {@link #add(Object, Object)} order. + */ + public static class MapBuilder { + private final Map result; + + private MapBuilder(final Map result) { + this.result = result; + } + + public static MapBuilder create() { + return new MapBuilder<>(new LinkedHashMap()); + } + + public MapBuilder add(final K key, final V value) { + result.put(key, value); + return this; + } + + public Map build() { + return Collections.unmodifiableMap(result); + } + } +} diff --git a/logging/src/test/java/org/xbib/logging/test/formatters/AbstractTest.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/AbstractTest.java similarity index 90% rename from logging/src/test/java/org/xbib/logging/test/formatters/AbstractTest.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/AbstractTest.java index 8019b2b..fea4910 100644 --- a/logging/src/test/java/org/xbib/logging/test/formatters/AbstractTest.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/AbstractTest.java @@ -1,8 +1,8 @@ -package org.xbib.logging.test.formatters; +package org.xbib.logging.ext.test.formatters; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.ExtLogRecord.FormatStyle; -import org.xbib.logging.test.MapTestUtils; +import org.xbib.logging.ext.test.MapTestUtils; abstract class AbstractTest extends MapTestUtils { diff --git a/logging/src/test/java/org/xbib/logging/test/formatters/BannerFormatterTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/BannerFormatterTests.java similarity index 94% rename from logging/src/test/java/org/xbib/logging/test/formatters/BannerFormatterTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/BannerFormatterTests.java index ed957e1..f5016ff 100644 --- a/logging/src/test/java/org/xbib/logging/test/formatters/BannerFormatterTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/BannerFormatterTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.formatters; +package org.xbib.logging.ext.test.formatters; import java.io.IOException; import java.io.InputStream; @@ -7,11 +7,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; import java.util.function.Supplier; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.xbib.logging.formatters.PatternFormatter; -import org.xbib.logging.formatters.TextBannerFormatter; +import org.xbib.logging.ext.formatters.PatternFormatter; +import org.xbib.logging.ext.formatters.TextBannerFormatter; /** * Tests of the banner formatting capability. @@ -35,7 +34,7 @@ public class BannerFormatterTests { tbf = new TextBannerFormatter(createResourceSupplier("non-existent-banner.txt", fallbackSupplier), emptyFormatter); Assertions.assertEquals(FALLBACK_OK, tbf.getHead(null)); tbf = new TextBannerFormatter(createResourceSupplier("test-banner.txt", fallbackSupplier), emptyFormatter); - final InputStream is = getClass().getResourceAsStream("/org/xbib/logging/test/formatters/test-banner.txt"); + final InputStream is = getClass().getResourceAsStream("/org/xbib/logging/ext/test/formatters/test-banner.txt"); Assertions.assertNotNull(is); try (is) { final String s = new String(is.readAllBytes(), StandardCharsets.UTF_8); diff --git a/logging/src/test/java/org/xbib/logging/test/formatters/PatternFormatterTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/PatternFormatterTests.java similarity index 92% rename from logging/src/test/java/org/xbib/logging/test/formatters/PatternFormatterTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/PatternFormatterTests.java index b897d22..2bf7306 100644 --- a/logging/src/test/java/org/xbib/logging/test/formatters/PatternFormatterTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/PatternFormatterTests.java @@ -1,15 +1,15 @@ -package org.xbib.logging.test.formatters; +package org.xbib.logging.ext.test.formatters; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.MDC; import org.xbib.logging.NDC; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.ext.formatters.PatternFormatter; public class PatternFormatterTests { - static final String CATEGORY = "org.xbib.logging.formatters.PatternFormatterTests"; + static final String CATEGORY = "org.xbib.logging.ext.test.formatters.PatternFormatterTests"; static { // Set a system property @@ -20,7 +20,7 @@ public class PatternFormatterTests { } @Test - public void categories() throws Exception { + public void categories() { final ExtLogRecord record = createLogRecord("test"); PatternFormatter formatter = new PatternFormatter("%c"); Assertions.assertEquals(CATEGORY, formatter.format(record)); @@ -32,16 +32,16 @@ public class PatternFormatterTests { Assertions.assertEquals("formatters.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%c{1.}"); - Assertions.assertEquals("o.x.l.f.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o.x.l.e.t.f.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%c{1.~}"); - Assertions.assertEquals("o.~.~.~.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o.~.~.~.~.~.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%c{.}"); - Assertions.assertEquals("....PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("......PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%c{1~.}"); - Assertions.assertEquals("o~.x~.l~.f~.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o~.x~.l~.e~.t~.f~.PatternFormatterTests", formatter.format(record)); // Test a simple logger name record.setLoggerName("test"); @@ -56,7 +56,7 @@ public class PatternFormatterTests { } @Test - public void classNames() throws Exception { + public void classNames() { final ExtLogRecord record = createLogRecord("test"); PatternFormatter formatter = new PatternFormatter("%C"); Assertions.assertEquals(PatternFormatterTests.class.getName(), formatter.format(record)); @@ -68,16 +68,16 @@ public class PatternFormatterTests { Assertions.assertEquals("formatters.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%C{1.}"); - Assertions.assertEquals("o.x.l.t.f.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o.x.l.e.t.f.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%C{1.~}"); - Assertions.assertEquals("o.~.~.~.~.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o.~.~.~.~.~.PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%C{.}"); - Assertions.assertEquals(".....PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("......PatternFormatterTests", formatter.format(record)); formatter = new PatternFormatter("%C{1~.}"); - Assertions.assertEquals("o~.x~.l~.t~.f~.PatternFormatterTests", formatter.format(record)); + Assertions.assertEquals("o~.x~.l~.e~.t~.f~.PatternFormatterTests", formatter.format(record)); } @Test diff --git a/logging/src/test/java/org/xbib/logging/test/formatters/StackTraceFormatterTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/StackTraceFormatterTests.java similarity index 99% rename from logging/src/test/java/org/xbib/logging/test/formatters/StackTraceFormatterTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/StackTraceFormatterTests.java index 6e573f4..5ab074e 100644 --- a/logging/src/test/java/org/xbib/logging/test/formatters/StackTraceFormatterTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/StackTraceFormatterTests.java @@ -1,8 +1,7 @@ -package org.xbib.logging.test.formatters; +package org.xbib.logging.ext.test.formatters; import java.io.PrintWriter; import java.io.StringWriter; - import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.xbib.logging.util.StackTraceFormatter; diff --git a/logging/src/test/java/org/xbib/logging/test/formatters/XmlFormatterTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/XmlFormatterTests.java similarity index 98% rename from logging/src/test/java/org/xbib/logging/test/formatters/XmlFormatterTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/XmlFormatterTests.java index 2360643..b285649 100644 --- a/logging/src/test/java/org/xbib/logging/test/formatters/XmlFormatterTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/formatters/XmlFormatterTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.formatters; +package org.xbib.logging.ext.test.formatters; import java.io.StringReader; import java.time.ZoneId; @@ -6,7 +6,6 @@ import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; - import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,16 +17,15 @@ import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; - -import org.xbib.logging.ExtFormatter; -import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.Level; -import org.xbib.logging.formatters.StructuredFormatter; -import org.xbib.logging.formatters.StructuredFormatter.Key; -import org.xbib.logging.formatters.XmlFormatter; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.w3c.dom.Document; +import org.xbib.logging.ExtFormatter; +import org.xbib.logging.ExtLogRecord; +import org.xbib.logging.Level; +import org.xbib.logging.ext.formatters.StructuredFormatter; +import org.xbib.logging.ext.formatters.StructuredFormatter.Key; +import org.xbib.logging.ext.formatters.XmlFormatter; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/AbstractHandlerTest.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AbstractHandlerTest.java similarity index 84% rename from logging/src/test/java/org/xbib/logging/test/handlers/AbstractHandlerTest.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AbstractHandlerTest.java index f2048d6..2fce211 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/AbstractHandlerTest.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AbstractHandlerTest.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.io.BufferedReader; import java.io.IOException; @@ -19,11 +19,14 @@ import java.util.zip.GZIPInputStream; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.formatters.PatternFormatter; -import org.junit.jupiter.api.Assertions; +import org.xbib.logging.ext.formatters.PatternFormatter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.xbib.logging.ext.test.AssertingErrorManager; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public class AbstractHandlerTest { @@ -44,7 +47,7 @@ public class AbstractHandlerTest { @Test public void simple() { - Assertions.assertTrue(testInfo.getTestMethod().isPresent()); + assertTrue(testInfo.getTestMethod().isPresent()); } protected Path resolvePath(final String filename) throws IOException { @@ -56,8 +59,8 @@ public class AbstractHandlerTest { } protected Path logDirectory(final TestInfo testInfo) throws IOException { - Assertions.assertTrue(testInfo.getTestClass().isPresent()); - Assertions.assertTrue(testInfo.getTestMethod().isPresent()); + assertTrue(testInfo.getTestClass().isPresent()); + assertTrue(testInfo.getTestMethod().isPresent()); final Path dir = BASE_LOG_DIR.resolve(testInfo.getTestClass().get().getSimpleName() + "-" + testInfo.getTestMethod().get().getName()); if (Files.notExists(dir)) { @@ -124,7 +127,7 @@ public class AbstractHandlerTest { } } } - Assertions.fail(String.format("GZIP file %s missing contents: %s", path, expectedContains)); + fail(String.format("GZIP file %s missing contents: %s", path, expectedContains)); } /** @@ -142,11 +145,11 @@ public class AbstractHandlerTest { try (final FileSystem zipFs = FileSystems.newFileSystem(URI.create("jar:" + path.toUri().toASCIIString()), Collections.singletonMap("create", "true"))) { final Path file = zipFs.getPath(zipFs.getSeparator(), expectedFileName); - Assertions.assertTrue(Files.exists(file), () -> String.format("Expected file %s not found.", expectedFileName)); + assertTrue(Files.exists(file), () -> String.format("Expected file %s not found.", expectedFileName)); final List lines = Files.readAllLines(file, StandardCharsets.UTF_8); - Assertions.assertFalse(lines.isEmpty(), + assertFalse(lines.isEmpty(), () -> String.format("File %s appears to be empty in zip file %s.", expectedFileName, path)); - Assertions.assertTrue(lines.get(0).contains(expectedContains), + assertTrue(lines.getFirst().contains(expectedContains), () -> String.format("ZIP file %s missing contents: %s", path, expectedContains)); } } @@ -163,18 +166,17 @@ public class AbstractHandlerTest { lines1 = readAllLinesFromGzip(archive1); lines2 = readAllLinesFromGzip(archive2); } else { - Assertions.fail(String.format("Files %s and %s are not archives.", archive1, archive2)); + fail(String.format("Files %s and %s are not archives.", archive1, archive2)); } - // Assert the contents aren't empty - Assertions.assertFalse(lines1.isEmpty(), () -> String.format("Archive %s contained no data", archive1)); - Assertions.assertFalse(lines2.isEmpty(), () -> String.format("Archive %s contained no data", archive2)); + assertFalse(lines1.isEmpty(), () -> String.format("Archive %s contained no data", archive1)); + assertFalse(lines2.isEmpty(), () -> String.format("Archive %s contained no data", archive2)); final Collection copy1 = new ArrayList<>(lines1); final Collection copy2 = new ArrayList<>(lines2); boolean altered = copy1.removeAll(copy2); if (copy1.isEmpty()) { - Assertions.fail(String.format("The contents of %s and %s are identical and should not be", archive1, archive2)); + fail(String.format("The contents of %s and %s are identical and should not be", archive1, archive2)); } else if (altered) { final StringBuilder msg = new StringBuilder(1024) .append("The following contents are in both ") @@ -187,7 +189,7 @@ public class AbstractHandlerTest { msg.append(System.lineSeparator()).append(line); } } - Assertions.fail(msg.toString()); + fail(msg.toString()); } } @@ -195,7 +197,7 @@ public class AbstractHandlerTest { try (final FileSystem zipFs = FileSystems.newFileSystem(URI.create("jar:" + path.toUri().toASCIIString()), Collections.singletonMap("create", "true"))) { final Path file = zipFs.getPath(zipFs.getSeparator(), expectedFileName); - Assertions.assertTrue(Files.exists(file), () -> String.format("Expected file %s not found.", expectedFileName)); + assertTrue(Files.exists(file), () -> String.format("Expected file %s not found.", expectedFileName)); return Files.readAllLines(file, StandardCharsets.UTF_8); } } diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/AsyncHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AsyncHandlerTests.java similarity index 94% rename from logging/src/test/java/org/xbib/logging/test/handlers/AsyncHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AsyncHandlerTests.java index 8b7053e..afeff5f 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/AsyncHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/AsyncHandlerTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; @@ -9,13 +9,14 @@ import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; import org.xbib.logging.MDC; import org.xbib.logging.NDC; -import org.xbib.logging.formatters.PatternFormatter; -import org.xbib.logging.handlers.AsyncHandler; -import org.xbib.logging.handlers.AsyncHandler.OverflowAction; +import org.xbib.logging.ext.formatters.PatternFormatter; +import org.xbib.logging.ext.handlers.AsyncHandler; +import org.xbib.logging.ext.handlers.AsyncHandler.OverflowAction; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.xbib.logging.ext.test.AssertingErrorManager; public class AsyncHandlerTests { diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/DelayedHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/DelayedHandlerTests.java similarity index 98% rename from logging/src/test/java/org/xbib/logging/test/handlers/DelayedHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/DelayedHandlerTests.java index da1db83..25df53a 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/DelayedHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/DelayedHandlerTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.util.ArrayList; import java.util.Collections; @@ -11,8 +11,8 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import java.util.stream.Collectors; -import org.xbib.logging.handlers.DelayedHandler; -import org.xbib.logging.test.AssertingErrorManager; +import org.xbib.logging.ext.handlers.DelayedHandler; +import org.xbib.logging.ext.test.AssertingErrorManager; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.LogContext; diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/ExtHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/ExtHandlerTests.java similarity index 96% rename from logging/src/test/java/org/xbib/logging/test/handlers/ExtHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/ExtHandlerTests.java index b4c3861..098073b 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/ExtHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/ExtHandlerTests.java @@ -1,11 +1,11 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.util.logging.SimpleFormatter; -import org.xbib.logging.test.AssertingErrorManager; import org.xbib.logging.ExtHandler; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.ext.formatters.PatternFormatter; import org.junit.jupiter.api.Test; +import org.xbib.logging.ext.test.AssertingErrorManager; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/QueueHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/QueueHandlerTests.java similarity index 95% rename from logging/src/test/java/org/xbib/logging/test/handlers/QueueHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/QueueHandlerTests.java index ac47bbb..fc9cdd6 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/QueueHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/QueueHandlerTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.util.ArrayList; import java.util.Collection; @@ -8,8 +8,9 @@ import java.util.List; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; -import org.xbib.logging.handlers.QueueHandler; +import org.xbib.logging.ext.handlers.QueueHandler; import org.junit.jupiter.api.Test; +import org.xbib.logging.ext.test.AssertingErrorManager; import static org.junit.jupiter.api.Assertions.assertEquals; public class QueueHandlerTests extends AbstractHandlerTest { diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/SimpleServer.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SimpleServer.java similarity index 99% rename from logging/src/test/java/org/xbib/logging/test/handlers/SimpleServer.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SimpleServer.java index 58793a5..7ac915f 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/SimpleServer.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SimpleServer.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/SocketHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SocketHandlerTests.java similarity index 82% rename from logging/src/test/java/org/xbib/logging/test/handlers/SocketHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SocketHandlerTests.java index 1690582..fb8043f 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/SocketHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SocketHandlerTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.io.UnsupportedEncodingException; import java.net.InetAddress; @@ -12,11 +12,15 @@ import javax.net.ssl.SSLContext; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.LogContext; import org.xbib.logging.Logger; -import org.xbib.logging.formatters.PatternFormatter; -import org.xbib.logging.handlers.SocketHandler; -import org.xbib.logging.handlers.SocketHandler.Protocol; -import org.junit.jupiter.api.Assertions; +import org.xbib.logging.ext.formatters.PatternFormatter; +import org.xbib.logging.ext.handlers.SocketHandler; +import org.xbib.logging.ext.handlers.SocketHandler.Protocol; import org.junit.jupiter.api.Test; +import org.xbib.logging.ext.test.AssertingErrorManager; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; public class SocketHandlerTests extends AbstractHandlerTest { @@ -33,8 +37,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { final ExtLogRecord record = createLogRecord("Test TCP handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler", msg); + assertNotNull(msg); + assertEquals("Test TCP handler", msg); } } @@ -45,8 +49,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { final ExtLogRecord record = createLogRecord("Test TLS handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TLS handler", msg); + assertNotNull(msg); + assertEquals("Test TLS handler", msg); } } @@ -57,8 +61,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { final ExtLogRecord record = createLogRecord("Test UDP handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test UDP handler", msg); + assertNotNull(msg); + assertEquals("Test UDP handler", msg); } } @@ -73,20 +77,20 @@ public class SocketHandlerTests extends AbstractHandlerTest { ExtLogRecord record = createLogRecord("Test TCP handler " + port); handler.publish(record); String msg = server1.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler " + port, msg); + assertNotNull(msg); + assertEquals("Test TCP handler " + port, msg); // Change the port on the handler which should close the first connection and open a new one handler.setPort(altPort); record = createLogRecord("Test TCP handler " + altPort); handler.publish(record); msg = server2.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler " + altPort, msg); + assertNotNull(msg); + assertEquals("Test TCP handler " + altPort, msg); // There should be nothing on server1, we won't know if the real connection is closed but we shouldn't // have any data remaining on the first server - Assertions.assertNull(server1.peek(), "Expected no data on server1"); + assertNull(server1.peek(), "Expected no data on server1"); } } @@ -99,8 +103,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { final ExtLogRecord record = createLogRecord("Test TCP handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler", msg); + assertNotNull(msg); + assertEquals("Test TCP handler", msg); } // wait until the OS really release used port Thread.sleep(50); @@ -112,8 +116,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { final ExtLogRecord record = createLogRecord("Test TLS handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TLS handler", msg); + assertNotNull(msg); + assertEquals("Test TLS handler", msg); } } finally { if (handler != null) { @@ -128,15 +132,14 @@ public class SocketHandlerTests extends AbstractHandlerTest { try { // Publish a record to a running server - try ( - SimpleServer server = SimpleServer.createTcpServer()) { + try (SimpleServer server = SimpleServer.createTcpServer()) { handler = createHandler(Protocol.TCP, server.getPort()); handler.setErrorManager(AssertingErrorManager.of(ErrorManager.FLUSH_FAILURE)); final ExtLogRecord record = createLogRecord("Test TCP handler"); handler.publish(record); final String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler", msg); + assertNotNull(msg); + assertEquals("Test TCP handler", msg); } // wait until the OS really release used port Thread.sleep(50); @@ -158,8 +161,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { throw new RuntimeException(e); } }, 10); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler", msg); + assertNotNull(msg); + assertEquals("Test TCP handler", msg); } } finally { if (handler != null) { @@ -188,8 +191,8 @@ public class SocketHandlerTests extends AbstractHandlerTest { rootLogger.addHandler(socketHandler); rootLogger.info("Test TCP handler " + port + " 1"); String msg = server.timeoutPoll(); - Assertions.assertNotNull(msg); - Assertions.assertEquals("Test TCP handler " + port + " 1", msg); + assertNotNull(msg); + assertEquals("Test TCP handler " + port + " 1", msg); } } @@ -217,7 +220,7 @@ public class SocketHandlerTests extends AbstractHandlerTest { TimeUnit.MILLISECONDS.sleep(sleep); t -= sleep; } - Assertions.assertFalse((t <= 0), () -> String.format("Failed to get value in %d seconds.", timeout)); + assertFalse((t <= 0), () -> String.format("Failed to get value in %d seconds.", timeout)); return value; } } diff --git a/logging/src/test/java/org/xbib/logging/test/handlers/SyslogHandlerTests.java b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SyslogHandlerTests.java similarity index 97% rename from logging/src/test/java/org/xbib/logging/test/handlers/SyslogHandlerTests.java rename to logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SyslogHandlerTests.java index 20af40c..2abcfe5 100644 --- a/logging/src/test/java/org/xbib/logging/test/handlers/SyslogHandlerTests.java +++ b/logging-ext/src/test/java/org/xbib/logging/ext/test/handlers/SyslogHandlerTests.java @@ -1,4 +1,4 @@ -package org.xbib.logging.test.handlers; +package org.xbib.logging.ext.test.handlers; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; @@ -10,13 +10,14 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.xbib.logging.ExtLogRecord; -import org.xbib.logging.formatters.PatternFormatter; -import org.xbib.logging.handlers.SyslogHandler; -import org.xbib.logging.handlers.SyslogHandler.SyslogType; +import org.xbib.logging.ext.formatters.PatternFormatter; +import org.xbib.logging.ext.handlers.SyslogHandler; +import org.xbib.logging.ext.handlers.SyslogHandler.SyslogType; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.xbib.logging.ext.test.AssertingErrorManager; public class SyslogHandlerTests { diff --git a/logging/src/test/resources/client-keystore.jks b/logging-ext/src/test/resources/org/xbib/logging/ext/test/client-keystore.jks similarity index 100% rename from logging/src/test/resources/client-keystore.jks rename to logging-ext/src/test/resources/org/xbib/logging/ext/test/client-keystore.jks diff --git a/logging/src/test/resources/org/xbib/logging/test/formatters/test-banner.txt b/logging-ext/src/test/resources/org/xbib/logging/ext/test/formatters/test-banner.txt similarity index 100% rename from logging/src/test/resources/org/xbib/logging/test/formatters/test-banner.txt rename to logging-ext/src/test/resources/org/xbib/logging/ext/test/formatters/test-banner.txt diff --git a/logging/src/test/resources/org/xbib/logging/test/formatters/xml-formatter.xsd b/logging-ext/src/test/resources/org/xbib/logging/ext/test/formatters/xml-formatter.xsd similarity index 100% rename from logging/src/test/resources/org/xbib/logging/test/formatters/xml-formatter.xsd rename to logging-ext/src/test/resources/org/xbib/logging/ext/test/formatters/xml-formatter.xsd diff --git a/logging/src/test/resources/server-keystore.jks b/logging-ext/src/test/resources/org/xbib/logging/ext/test/server-keystore.jks similarity index 100% rename from logging/src/test/resources/server-keystore.jks rename to logging-ext/src/test/resources/org/xbib/logging/ext/test/server-keystore.jks diff --git a/logging/src/integration/java/org/xbib/logging/integration/SystemLoggerIT.java b/logging/src/integration/java/org/xbib/logging/integration/SystemLoggerIT.java index 47a36a3..c604044 100644 --- a/logging/src/integration/java/org/xbib/logging/integration/SystemLoggerIT.java +++ b/logging/src/integration/java/org/xbib/logging/integration/SystemLoggerIT.java @@ -12,8 +12,10 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +@Disabled public class SystemLoggerIT { private Path stdout; diff --git a/logging/src/main/java/module-info.java b/logging/src/main/java/module-info.java index c028590..bcc0897 100644 --- a/logging/src/main/java/module-info.java +++ b/logging/src/main/java/module-info.java @@ -1,3 +1,8 @@ +import org.xbib.logging.LogContextConfiguratorFactory; +import org.xbib.logging.LogManager; +import org.xbib.logging.LoggerFinder; +import org.xbib.logging.configuration.DefaultLogContextConfiguratorFactory; + module org.xbib.logging { uses org.xbib.logging.LogContextInitializer; uses org.xbib.logging.LogContextConfiguratorFactory; @@ -5,13 +10,15 @@ module org.xbib.logging { uses org.xbib.logging.NDCProvider; uses org.xbib.logging.MDCProvider; requires transitive java.logging; - requires java.xml; requires java.management; exports org.xbib.logging; exports org.xbib.logging.configuration; exports org.xbib.logging.filters; exports org.xbib.logging.formatters; exports org.xbib.logging.handlers; - exports org.xbib.logging.net; + exports org.xbib.logging.io; exports org.xbib.logging.util; + provides java.lang.System.LoggerFinder with LoggerFinder; + provides java.util.logging.LogManager with LogManager; + provides LogContextConfiguratorFactory with DefaultLogContextConfiguratorFactory; } diff --git a/logging/src/main/java/org/xbib/logging/ExtErrorManager.java b/logging/src/main/java/org/xbib/logging/ExtErrorManager.java index 5f22668..5134f58 100644 --- a/logging/src/main/java/org/xbib/logging/ExtErrorManager.java +++ b/logging/src/main/java/org/xbib/logging/ExtErrorManager.java @@ -28,6 +28,7 @@ public abstract class ExtErrorManager extends ErrorManager { }; } + @Override public void error(final String msg, final Exception ex, final int code) { super.error(msg, ex, code); } diff --git a/logging/src/main/java/org/xbib/logging/ExtFormatter.java b/logging/src/main/java/org/xbib/logging/ExtFormatter.java index 318310c..66ee8dd 100644 --- a/logging/src/main/java/org/xbib/logging/ExtFormatter.java +++ b/logging/src/main/java/org/xbib/logging/ExtFormatter.java @@ -37,6 +37,7 @@ public abstract class ExtFormatter extends Formatter { /** * {@inheritDoc} */ + @Override public final String format(final LogRecord record) { return format(ExtLogRecord.wrap(record)); } @@ -173,22 +174,27 @@ public abstract class ExtFormatter extends Formatter { this.delegate = Objects.requireNonNull(delegate, "delegate"); } + @Override public String format(final ExtLogRecord record) { return delegate.format(record); } + @Override public String formatMessage(final LogRecord record) { return delegate.formatMessage(record); } + @Override public boolean isCallerCalculationRequired() { return delegate.isCallerCalculationRequired(); } + @Override public String getHead(final Handler h) { return delegate.getHead(h); } + @Override public String getTail(final Handler h) { return delegate.getTail(h); } diff --git a/logging/src/main/java/org/xbib/logging/ExtHandler.java b/logging/src/main/java/org/xbib/logging/ExtHandler.java index 7139609..a1bbba0 100644 --- a/logging/src/main/java/org/xbib/logging/ExtHandler.java +++ b/logging/src/main/java/org/xbib/logging/ExtHandler.java @@ -15,6 +15,7 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import org.xbib.logging.errormanager.OnlyOnceErrorManager; import org.xbib.logging.util.AtomicArray; +import org.xbib.logging.util.StandardOutputStreams; /** * An extended logger handler. Use this class as a base class for log handlers which require {@code ExtLogRecord} @@ -63,6 +64,7 @@ public abstract class ExtHandler extends Handler implements AutoCloseable, Flush /** * {@inheritDoc} */ + @Override public void publish(final LogRecord record) { if (enabled && record != null && isLoggable(record)) { doPublish(ExtLogRecord.wrap(record)); @@ -480,9 +482,7 @@ public abstract class ExtHandler extends Handler implements AutoCloseable, Flush try { errorManager.error(msg, ex, code); } catch (Exception ex2) { - // use the same message as the JDK - System.err.println("Handler.reportError caught:"); - ex2.printStackTrace(); + StandardOutputStreams.printError(ex2, "Handler.reportError caught: " + ex2.getMessage()); } } } diff --git a/logging/src/main/java/org/xbib/logging/ExtLogRecord.java b/logging/src/main/java/org/xbib/logging/ExtLogRecord.java index d6d0d02..5ed213b 100644 --- a/logging/src/main/java/org/xbib/logging/ExtLogRecord.java +++ b/logging/src/main/java/org/xbib/logging/ExtLogRecord.java @@ -349,6 +349,7 @@ public class ExtLogRecord extends LogRecord { /** * {@inheritDoc} */ + @Override public String getSourceClassName() { calculateCaller(); return super.getSourceClassName(); @@ -357,6 +358,7 @@ public class ExtLogRecord extends LogRecord { /** * {@inheritDoc} */ + @Override public void setSourceClassName(final String sourceClassName) { calculateCaller = false; super.setSourceClassName(sourceClassName); @@ -365,6 +367,7 @@ public class ExtLogRecord extends LogRecord { /** * {@inheritDoc} */ + @Override public String getSourceMethodName() { calculateCaller(); return super.getSourceMethodName(); @@ -373,6 +376,7 @@ public class ExtLogRecord extends LogRecord { /** * {@inheritDoc} */ + @Override public void setSourceMethodName(final String sourceMethodName) { calculateCaller = false; super.setSourceMethodName(sourceMethodName); @@ -428,8 +432,9 @@ public class ExtLogRecord extends LogRecord { public String getFormattedMessage() { final ResourceBundle bundle = getResourceBundle(); String msg = getMessage(); - if (msg == null) + if (msg == null) { return null; + } if (bundle != null) { try { msg = bundle.getString(msg); @@ -540,6 +545,7 @@ public class ExtLogRecord extends LogRecord { * * @param message the new raw message */ + @Override public void setMessage(final String message) { setMessage(message, FormatStyle.MESSAGE_FORMAT); } @@ -561,6 +567,7 @@ public class ExtLogRecord extends LogRecord { * * @param parameters the log message parameters. (may be null) */ + @Override public void setParameters(final Object[] parameters) { super.setParameters(parameters); } @@ -570,6 +577,7 @@ public class ExtLogRecord extends LogRecord { * * @param bundle localization bundle (may be null) */ + @Override public void setResourceBundle(final ResourceBundle bundle) { super.setResourceBundle(bundle); } @@ -579,6 +587,7 @@ public class ExtLogRecord extends LogRecord { * * @param name localization bundle name (may be null) */ + @Override public void setResourceBundleName(final String name) { super.setResourceBundleName(name); } diff --git a/logging/src/main/java/org/xbib/logging/LogContext.java b/logging/src/main/java/org/xbib/logging/LogContext.java index fab0fbf..a969d19 100644 --- a/logging/src/main/java/org/xbib/logging/LogContext.java +++ b/logging/src/main/java/org/xbib/logging/LogContext.java @@ -22,7 +22,6 @@ import org.xbib.logging.ref.References; import org.xbib.logging.util.CopyOnWriteMap; import org.xbib.logging.util.CopyOnWriteWeakMap; - /** * A logging context, for producing isolated logging environments. */ @@ -62,6 +61,7 @@ public final class LogContext implements AutoCloseable { * before the class init is complete. */ private static final class LazyHolder { + private static final HashMap> INITIAL_LEVEL_MAP; private LazyHolder() { @@ -392,11 +392,7 @@ public final class LogContext implements AutoCloseable { /** * The default log context selector, which always returns the system log context. */ - public static final LogContextSelector DEFAULT_LOG_CONTEXT_SELECTOR = new LogContextSelector() { - public LogContext getLogContext() { - return SYSTEM_CONTEXT; - } - }; + public static final LogContextSelector DEFAULT_LOG_CONTEXT_SELECTOR = () -> SYSTEM_CONTEXT; private static volatile LogContextSelector logContextSelector = DEFAULT_LOG_CONTEXT_SELECTOR; @@ -548,10 +544,11 @@ public final class LogContext implements AutoCloseable { } private void recursivelyClose(final LoggerNode loggerNode) { - assert treeLock.isHeldByCurrentThread(); - for (LoggerNode child : loggerNode.getChildren()) { - recursivelyClose(child); + if (treeLock.isHeldByCurrentThread()) { + for (LoggerNode child : loggerNode.getChildren()) { + recursivelyClose(child); + } + loggerNode.close(); } - loggerNode.close(); } } diff --git a/logging/src/main/java/org/xbib/logging/Logger.java b/logging/src/main/java/org/xbib/logging/Logger.java index f9de1b7..0b00d41 100644 --- a/logging/src/main/java/org/xbib/logging/Logger.java +++ b/logging/src/main/java/org/xbib/logging/Logger.java @@ -76,11 +76,10 @@ public final class Logger extends java.util.logging.Logger { this.loggerNode = loggerNode; } - // Filter mgmt - /** * {@inheritDoc} */ + @Override public void setFilter(Filter filter) { loggerNode.setFilter(filter); } @@ -88,17 +87,17 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public Filter getFilter() { return loggerNode.getFilter(); } - // Level mgmt - /** * {@inheritDoc} This implementation grabs a lock, so that only one thread may update the log level of any * logger at a time, in order to allow readers to never block (though there is a window where retrieving the * log level reflects an older effective level than the actual level). */ + @Override public void setLevel(Level newLevel) { // We have to propagate our level to an internal data structure in the superclass super.setLevel(newLevel); @@ -127,6 +126,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public Level getLevel() { return loggerNode.getLevel(); } @@ -134,6 +134,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public boolean isLoggable(Level level) { return loggerNode.isLoggableLevel(level.intValue()); } @@ -193,11 +194,10 @@ public final class Logger extends java.util.logging.Logger { return loggerNode.detach(key); } - // Handler mgmt - /** * {@inheritDoc} */ + @Override public void addHandler(Handler handler) { if (handler == null) { throw new NullPointerException("handler is null"); @@ -208,6 +208,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void removeHandler(Handler handler) { if (handler == null) { return; @@ -218,6 +219,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public Handler[] getHandlers() { final Handler[] handlers = loggerNode.getHandlers(); return handlers.length > 0 ? handlers.clone() : handlers; @@ -290,6 +292,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void setUseParentHandlers(boolean useParentHandlers) { loggerNode.setUseParentHandlers(useParentHandlers); } @@ -297,6 +300,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public boolean getUseParentHandlers() { return loggerNode.getUseParentHandlers(); } @@ -322,11 +326,10 @@ public final class Logger extends java.util.logging.Logger { return loggerNode.getUseParentFilters(); } - // Parent/child - /** * {@inheritDoc} */ + @Override public Logger getParent() { final LoggerNode parentNode = loggerNode.getParent(); return parentNode == null ? null : parentNode.createLogger(); @@ -335,6 +338,7 @@ public final class Logger extends java.util.logging.Logger { /** * Not allowed. This method may never be called. */ + @Override public void setParent(java.util.logging.Logger parent) { throw new UnsupportedOperationException(); } @@ -363,6 +367,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void log(LogRecord record) { if (!loggerNode.isLoggableLevel(record.getLevel().intValue())) { return; @@ -373,6 +378,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void entering(final String sourceClass, final String sourceMethod) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -386,6 +392,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void entering(final String sourceClass, final String sourceMethod, final Object param1) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -400,6 +407,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void entering(final String sourceClass, final String sourceMethod, final Object[] params) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -420,6 +428,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void exiting(final String sourceClass, final String sourceMethod) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -433,6 +442,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void exiting(final String sourceClass, final String sourceMethod, final Object result) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -447,6 +457,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void throwing(final String sourceClass, final String sourceMethod, final Throwable thrown) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -461,6 +472,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void severe(final String msg) { if (!loggerNode.isLoggableLevel(SEVERE_INT)) { return; @@ -481,6 +493,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void warning(final String msg) { if (!loggerNode.isLoggableLevel(WARNING_INT)) { return; @@ -501,6 +514,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void info(final String msg) { if (!loggerNode.isLoggableLevel(INFO_INT)) { return; @@ -521,6 +535,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void config(final String msg) { if (!loggerNode.isLoggableLevel(CONFIG_INT)) { return; @@ -541,6 +556,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void fine(final String msg) { if (!loggerNode.isLoggableLevel(FINE_INT)) { return; @@ -561,6 +577,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void finer(final String msg) { if (!loggerNode.isLoggableLevel(FINER_INT)) { return; @@ -581,6 +598,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void finest(final String msg) { if (!loggerNode.isLoggableLevel(FINEST_INT)) { return; @@ -601,6 +619,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void log(final Level level, final String msg) { if (!loggerNode.isLoggableLevel(level.intValue())) { return; @@ -621,6 +640,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void log(final Level level, final String msg, final Object param1) { if (!loggerNode.isLoggableLevel(level.intValue())) { return; @@ -633,6 +653,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void log(final Level level, final String msg, final Object[] params) { if (!loggerNode.isLoggableLevel(level.intValue())) { return; @@ -646,6 +667,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void log(final Level level, final String msg, final Throwable thrown) { if (!loggerNode.isLoggableLevel(level.intValue())) { return; @@ -668,6 +690,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg) { if (!loggerNode.isLoggableLevel(level.intValue())) { return; @@ -693,6 +716,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg, final Object param1) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -708,6 +732,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg, final Object[] params) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -724,6 +749,7 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ + @Override public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg, final Throwable thrown) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -752,7 +778,8 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ - @Deprecated(since = "3.0", forRemoval = true) + @Deprecated(since = "0.0.1", forRemoval = true) + @Override public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName, final String msg) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -765,7 +792,8 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ - @Deprecated(since = "3.0", forRemoval = true) + @Deprecated(since = "0.0.1", forRemoval = true) + @Override public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName, final String msg, final Object param1) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -778,7 +806,8 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ - @Deprecated(since = "3.0", forRemoval = true) + @Deprecated(since = "0.0.1", forRemoval = true) + @Override public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName, final String msg, final Object[] params) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -791,7 +820,8 @@ public final class Logger extends java.util.logging.Logger { /** * {@inheritDoc} */ - @Deprecated(since = "3.0", forRemoval = true) + @Deprecated(since = "0.0.1", forRemoval = true) + @Override public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName, final String msg, final Throwable thrown) { if (!loggerNode.isLoggableLevel(level.intValue())) { @@ -981,6 +1011,7 @@ public final class Logger extends java.util.logging.Logger { } } + @Override public String toString() { return "Logger '" + getName() + "' in context " + loggerNode.getContext(); } diff --git a/logging/src/main/java/org/xbib/logging/LoggerFinder.java b/logging/src/main/java/org/xbib/logging/LoggerFinder.java index f329cfc..994ce99 100644 --- a/logging/src/main/java/org/xbib/logging/LoggerFinder.java +++ b/logging/src/main/java/org/xbib/logging/LoggerFinder.java @@ -72,32 +72,38 @@ public class LoggerFinder extends System.LoggerFinder { return delegate.isLoggable(LEVELS.getOrDefault(level, java.util.logging.Level.INFO)); } + @Override public void log(final Level level, final String msg) { log(level, null, msg, (Object[]) null); } + @Override public void log(final Level level, final Supplier msgSupplier) { if (isLoggable(level)) { log(level, null, msgSupplier.get(), (Object[]) null); } } + @Override public void log(final Level level, final Object obj) { if (isLoggable(level)) { this.log(level, null, obj.toString(), (Object[]) null); } } + @Override public void log(final Level level, final String msg, final Throwable thrown) { this.log(level, null, msg, thrown); } + @Override public void log(final Level level, final Supplier msgSupplier, final Throwable thrown) { if (isLoggable(level)) { this.log(level, null, msgSupplier.get(), thrown); } } + @Override public void log(final Level level, final String format, final Object... params) { this.log(level, null, format, params); } diff --git a/logging/src/main/java/org/xbib/logging/MDC.java b/logging/src/main/java/org/xbib/logging/MDC.java index 6842686..08837be 100644 --- a/logging/src/main/java/org/xbib/logging/MDC.java +++ b/logging/src/main/java/org/xbib/logging/MDC.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.Map; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; +import org.xbib.logging.util.StandardOutputStreams; /** * Mapped diagnostic context. This is a thread-local map used to hold loggable information. @@ -32,8 +33,7 @@ public final class MDC { } return iterator.next(); } catch (ServiceConfigurationError | RuntimeException e) { - System.err.print("Warning: failed to load MDC Provider: "); - e.printStackTrace(System.err); + StandardOutputStreams.printError(e, "Warning: failed to load MDC Provider: " + e.getMessage()); } } diff --git a/logging/src/main/java/org/xbib/logging/NDC.java b/logging/src/main/java/org/xbib/logging/NDC.java index 8edb181..c9351f4 100644 --- a/logging/src/main/java/org/xbib/logging/NDC.java +++ b/logging/src/main/java/org/xbib/logging/NDC.java @@ -3,6 +3,7 @@ package org.xbib.logging; import java.util.Iterator; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; +import org.xbib.logging.util.StandardOutputStreams; /** * Nested diagnostic context. This is basically a thread-local stack that holds a string which can be included @@ -32,8 +33,7 @@ public final class NDC { } return iterator.next(); } catch (ServiceConfigurationError | RuntimeException e) { - System.err.print("Warning: failed to load NDC Provider: "); - e.printStackTrace(System.err); + StandardOutputStreams.printError(e, "Warning: failed to load NDC Provider: " + e.getMessage()); } } diff --git a/logging/src/main/java/org/xbib/logging/ThreadLocalMDC.java b/logging/src/main/java/org/xbib/logging/ThreadLocalMDC.java index 4c6447b..95e9434 100644 --- a/logging/src/main/java/org/xbib/logging/ThreadLocalMDC.java +++ b/logging/src/main/java/org/xbib/logging/ThreadLocalMDC.java @@ -4,6 +4,7 @@ import java.util.Map; import org.xbib.logging.util.FastCopyHashMap; final class ThreadLocalMDC implements MDCProvider { + private static final Holder mdc = new Holder(); @Override diff --git a/logging/src/main/java/org/xbib/logging/ThreadLocalNDC.java b/logging/src/main/java/org/xbib/logging/ThreadLocalNDC.java index 7694aa8..d550ec8 100644 --- a/logging/src/main/java/org/xbib/logging/ThreadLocalNDC.java +++ b/logging/src/main/java/org/xbib/logging/ThreadLocalNDC.java @@ -3,6 +3,7 @@ package org.xbib.logging; import java.util.Arrays; final class ThreadLocalNDC implements NDCProvider { + private static final Holder ndc = new Holder(); @Override @@ -56,6 +57,8 @@ final class ThreadLocalNDC implements NDCProvider { } private static final class Holder extends ThreadLocal> { + + @Override protected Stack initialValue() { return new Stack<>(); } @@ -107,6 +110,7 @@ final class ThreadLocalNDC implements NDCProvider { return n < sp ? (T) data[n] : null; } + @Override public String toString() { final StringBuilder b = new StringBuilder(); final int sp = this.sp; diff --git a/logging/src/main/java/org/xbib/logging/WrappedExtLogRecord.java b/logging/src/main/java/org/xbib/logging/WrappedExtLogRecord.java index 16da652..b7c38ca 100644 --- a/logging/src/main/java/org/xbib/logging/WrappedExtLogRecord.java +++ b/logging/src/main/java/org/xbib/logging/WrappedExtLogRecord.java @@ -19,10 +19,12 @@ class WrappedExtLogRecord extends ExtLogRecord { this.logRecord = logRecord; } + @Override public String getLoggerName() { return logRecord.getLoggerName(); } + @Override public void setLoggerName(final String name) { super.setLoggerName(name); logRecord.setLoggerName(name); @@ -126,11 +128,13 @@ class WrappedExtLogRecord extends ExtLogRecord { return super.getSourceLineNumber(); } + @Override public void setSourceLineNumber(final int sourceLineNumber) { resolved = true; super.setSourceLineNumber(sourceLineNumber); } + @Override public String getSourceFileName() { if (!resolved) { resolve(); @@ -173,12 +177,14 @@ class WrappedExtLogRecord extends ExtLogRecord { @Deprecated @SuppressWarnings("deprecation") + @Override public int getThreadID() { return logRecord.getThreadID(); } @Deprecated @SuppressWarnings("deprecation") + @Override public void setThreadID(final int threadID) { super.setThreadID(threadID); logRecord.setThreadID(threadID); diff --git a/logging/src/main/java/org/xbib/logging/configuration/ContextConfiguration.java b/logging/src/main/java/org/xbib/logging/configuration/ContextConfiguration.java index 168592b..24314ab 100644 --- a/logging/src/main/java/org/xbib/logging/configuration/ContextConfiguration.java +++ b/logging/src/main/java/org/xbib/logging/configuration/ContextConfiguration.java @@ -26,14 +26,20 @@ import org.xbib.logging.Logger; * wrapped and considered a {@linkplain ConfigurationResource#of(Supplier) lazy resource}. *

*/ -@SuppressWarnings({"UnusedReturnValue", "unused"}) public class ContextConfiguration implements AutoCloseable { + public static final Logger.AttachmentKey CONTEXT_CONFIGURATION_KEY = new Logger.AttachmentKey<>(); + private final LogContext context; + private final Map> errorManagers; + private final Map> filters; + private final Map> formatters; + private final Map> handlers; + private final Map> objects; /** @@ -383,10 +389,10 @@ public class ContextConfiguration implements AutoCloseable { } private static void closeResources(final Map> resources) { - final var iter = resources.entrySet().iterator(); - while (iter.hasNext()) { - var entry = iter.next(); - iter.remove(); + final var iterator = resources.entrySet().iterator(); + while (iterator.hasNext()) { + var entry = iterator.next(); + iterator.remove(); try { entry.getValue().close(); } catch (Throwable ignore) { @@ -394,5 +400,4 @@ public class ContextConfiguration implements AutoCloseable { } } } - } diff --git a/logging/src/main/java/org/xbib/logging/configuration/PropertyContextConfiguration.java b/logging/src/main/java/org/xbib/logging/configuration/PropertyContextConfiguration.java index 4c6bae4..afb70fa 100644 --- a/logging/src/main/java/org/xbib/logging/configuration/PropertyContextConfiguration.java +++ b/logging/src/main/java/org/xbib/logging/configuration/PropertyContextConfiguration.java @@ -18,6 +18,7 @@ import org.xbib.logging.configuration.filters.FilterExpressions; import org.xbib.logging.expression.Expression; import org.xbib.logging.filters.AcceptAllFilter; import org.xbib.logging.filters.DenyAllFilter; +import org.xbib.logging.util.ObjectBuilder; import org.xbib.logging.util.StandardOutputStreams; /** diff --git a/logging/src/main/java/org/xbib/logging/configuration/PropertyLogContextConfigurator.java b/logging/src/main/java/org/xbib/logging/configuration/PropertyLogContextConfigurator.java index d349dfa..1a86508 100644 --- a/logging/src/main/java/org/xbib/logging/configuration/PropertyLogContextConfigurator.java +++ b/logging/src/main/java/org/xbib/logging/configuration/PropertyLogContextConfigurator.java @@ -13,7 +13,7 @@ import java.util.logging.Logger; import org.xbib.logging.Level; import org.xbib.logging.LogContext; import org.xbib.logging.LogContextConfigurator; -import org.xbib.logging.formatters.SimpleFormatter; +import org.xbib.logging.formatters.DefaultFormatter; import org.xbib.logging.handlers.ConsoleHandler; import org.xbib.logging.util.StandardOutputStreams; @@ -64,7 +64,7 @@ public class PropertyLogContextConfigurator implements LogContextConfigurator { logContextConfigurator.configure(context, null); } else { // Configure a default console handler, thread formatter and associated with the root logger - final ConsoleHandler handler = new ConsoleHandler(new SimpleFormatter()); + final ConsoleHandler handler = new ConsoleHandler(new DefaultFormatter()); handler.setLevel(Level.INFO); handler.setAutoFlush(true); final Logger rootLogger = context.getLogger(""); diff --git a/logging/src/main/java/org/xbib/logging/errormanager/HandlerErrorManager.java b/logging/src/main/java/org/xbib/logging/errormanager/HandlerErrorManager.java index 53f3c81..a755d6d 100644 --- a/logging/src/main/java/org/xbib/logging/errormanager/HandlerErrorManager.java +++ b/logging/src/main/java/org/xbib/logging/errormanager/HandlerErrorManager.java @@ -7,6 +7,7 @@ import org.xbib.logging.ExtErrorManager; * An error manager which publishes errors to a handler. */ public final class HandlerErrorManager extends ExtErrorManager { + private static final ThreadLocal handlingError = new ThreadLocal<>(); private final Handler handler; @@ -20,6 +21,7 @@ public final class HandlerErrorManager extends ExtErrorManager { this.handler = handler; } + @Override public void error(final String msg, final Exception ex, final int code) { if (handlingError.get() != Boolean.TRUE) { handlingError.set(Boolean.TRUE); diff --git a/logging/src/main/java/org/xbib/logging/errormanager/OnlyOnceErrorManager.java b/logging/src/main/java/org/xbib/logging/errormanager/OnlyOnceErrorManager.java index 9035fa5..17a3f21 100644 --- a/logging/src/main/java/org/xbib/logging/errormanager/OnlyOnceErrorManager.java +++ b/logging/src/main/java/org/xbib/logging/errormanager/OnlyOnceErrorManager.java @@ -29,6 +29,7 @@ public final class OnlyOnceErrorManager extends ExtErrorManager { /** * {@inheritDoc} */ + @Override public void error(final String msg, final Exception ex, final int code) { ErrorManager delegate = this.delegate; if (delegate == null) { diff --git a/logging/src/main/java/org/xbib/logging/errormanager/SimpleErrorManager.java b/logging/src/main/java/org/xbib/logging/errormanager/SimpleErrorManager.java index 372141d..94f4196 100644 --- a/logging/src/main/java/org/xbib/logging/errormanager/SimpleErrorManager.java +++ b/logging/src/main/java/org/xbib/logging/errormanager/SimpleErrorManager.java @@ -7,6 +7,8 @@ import org.xbib.logging.util.StandardOutputStreams; * An error manager which simply prints a message the system error stream. */ public class SimpleErrorManager extends ExtErrorManager { + + @Override public void error(final String msg, final Exception ex, final int code) { StandardOutputStreams.printError(ex, "LogManager error of type %s: %s%n", nameForCode(code), msg); } diff --git a/logging/src/main/java/org/xbib/logging/expression/CompositeNode.java b/logging/src/main/java/org/xbib/logging/expression/CompositeNode.java index daa758a..cc727cd 100644 --- a/logging/src/main/java/org/xbib/logging/expression/CompositeNode.java +++ b/logging/src/main/java/org/xbib/logging/expression/CompositeNode.java @@ -14,6 +14,7 @@ final class CompositeNode extends Node { this.subNodes = subNodes.toArray(NO_NODES); } + @Override void emit(final ResolveContext context, final ExceptionBiConsumer, StringBuilder, E> resolveFunction) throws E { for (Node subNode : subNodes) { @@ -21,12 +22,14 @@ final class CompositeNode extends Node { } } + @Override void catalog(final HashSet strings) { for (Node node : subNodes) { node.catalog(strings); } } + @Override public String toString() { StringBuilder b = new StringBuilder(); b.append('*'); diff --git a/logging/src/main/java/org/xbib/logging/expression/Expression.java b/logging/src/main/java/org/xbib/logging/expression/Expression.java index c9dea3a..8b0812c 100644 --- a/logging/src/main/java/org/xbib/logging/expression/Expression.java +++ b/logging/src/main/java/org/xbib/logging/expression/Expression.java @@ -323,9 +323,8 @@ public final class Expression { // otherwise treat it as a properly terminated expression start = itr.getNextIdx(); continue; - } else { + } else if (itr.peekNext() == '}') { // TP 11 - assert itr.peekNext() == '}'; itr.next(); // consume if (general) { if (!itr.hasNext()) { @@ -357,11 +356,9 @@ public final class Expression { start = itr.getNextIdx(); continue; } - //throw Assert.unreachableCode(); } - } else { + } else if (itr.peekNext() == '}') { // TP 12 - assert itr.peekNext() == '}'; itr.next(); // consume list.add(new ExpressionNode(general, keyNode, Node.NULL)); if (general) { @@ -394,7 +391,6 @@ public final class Expression { start = itr.getNextIdx(); continue; } - //throw Assert.unreachableCode(); } case '$': { // $$ @@ -440,7 +436,6 @@ public final class Expression { throw invalidExpressionSyntax(itr.getStr(), idx); } } - //throw Assert.unreachableCode(); } case ':': { // $: @@ -474,7 +469,6 @@ public final class Expression { throw invalidExpressionSyntax(itr.getStr(), idx); } } - //throw Assert.unreachableCode(); } default: { // $ followed by anything else @@ -493,10 +487,8 @@ public final class Expression { // TP 27 throw invalidExpressionSyntax(itr.getStr(), idx); } - //throw Assert.unreachableCode(); } } - //throw Assert.unreachableCode(); } case ':': { if (endOnColon) { @@ -511,7 +503,6 @@ public final class Expression { // plain content always continue; } - //throw Assert.unreachableCode(); } case '{': { if (!flags.contains(Flag.NO_SMART_BRACES)) { @@ -539,7 +530,6 @@ public final class Expression { // treat as plain content continue; } - //throw Assert.unreachableCode(); } case '\\': { if (flags.contains(Flag.ESCAPES)) { @@ -617,7 +607,6 @@ public final class Expression { continue; } } - //throw Assert.unreachableCode(); } final int length = itr.getStr().length(); if (length > start) { diff --git a/logging/src/main/java/org/xbib/logging/expression/ExpressionNode.java b/logging/src/main/java/org/xbib/logging/expression/ExpressionNode.java index f2937a9..ee771a3 100644 --- a/logging/src/main/java/org/xbib/logging/expression/ExpressionNode.java +++ b/logging/src/main/java/org/xbib/logging/expression/ExpressionNode.java @@ -13,6 +13,7 @@ class ExpressionNode extends Node { this.defaultValue = defaultValue; } + @Override void emit(final ResolveContext context, final ExceptionBiConsumer, StringBuilder, E> resolveFunction) throws E { ExpressionNode oldCurrent = context.setCurrent(this); @@ -23,6 +24,7 @@ class ExpressionNode extends Node { } } + @Override void catalog(final HashSet strings) { if (key instanceof LiteralNode) { strings.add(key.toString()); @@ -44,6 +46,7 @@ class ExpressionNode extends Node { return defaultValue; } + @Override public String toString() { return String.format("Expr<%s:%s>", key, defaultValue); } diff --git a/logging/src/main/java/org/xbib/logging/expression/LiteralNode.java b/logging/src/main/java/org/xbib/logging/expression/LiteralNode.java index 7989b7b..04af003 100644 --- a/logging/src/main/java/org/xbib/logging/expression/LiteralNode.java +++ b/logging/src/main/java/org/xbib/logging/expression/LiteralNode.java @@ -30,14 +30,17 @@ class LiteralNode extends Node { this(literalValue, 0, literalValue.length()); } + @Override void emit(final ResolveContext context, final ExceptionBiConsumer, StringBuilder, E> resolveFunction) throws E { context.getStringBuilder().append(literalValue, start, end); } + @Override void catalog(final HashSet strings) { } + @Override public String toString() { final String toString = this.toString; return toString != null ? toString : (this.toString = literalValue.substring(start, end)); diff --git a/logging/src/main/java/org/xbib/logging/expression/Node.java b/logging/src/main/java/org/xbib/logging/expression/Node.java index a7ac760..20ca64a 100644 --- a/logging/src/main/java/org/xbib/logging/expression/Node.java +++ b/logging/src/main/java/org/xbib/logging/expression/Node.java @@ -21,13 +21,17 @@ abstract class Node { } static final Node NULL = new Node() { + + @Override void emit(final ResolveContext context, final ExceptionBiConsumer, StringBuilder, E> resolveFunction) throws E { } + @Override void catalog(final HashSet strings) { } + @Override public String toString() { return "<>"; } diff --git a/logging/src/main/java/org/xbib/logging/expression/ResolveContext.java b/logging/src/main/java/org/xbib/logging/expression/ResolveContext.java index 228f1c5..f35325d 100644 --- a/logging/src/main/java/org/xbib/logging/expression/ResolveContext.java +++ b/logging/src/main/java/org/xbib/logging/expression/ResolveContext.java @@ -9,8 +9,11 @@ package org.xbib.logging.expression; * @param the exception type that can be thrown by the expansion function */ public final class ResolveContext { + private final ExceptionBiConsumer, StringBuilder, E> function; + private StringBuilder builder; + private ExpressionNode current; ResolveContext(final ExceptionBiConsumer, StringBuilder, E> function, final StringBuilder builder) { @@ -27,8 +30,9 @@ public final class ResolveContext { * @throws E if the recursive expansion threw an exception */ public String getKey() throws E { - if (current == null) + if (current == null) { throw new IllegalStateException(); + } final Node key = current.getKey(); if (key instanceof LiteralNode) { return key.toString(); @@ -49,22 +53,24 @@ public final class ResolveContext { * @throws E if the recursive expansion threw an exception */ public void expandDefault(StringBuilder target) throws E { - if (current == null) + if (current == null) { throw new IllegalStateException(); + } emitToBuilder(target, current.getDefaultValue()); } private void emitToBuilder(final StringBuilder target, final Node node) throws E { - if (node == Node.NULL) { - } else if (node instanceof LiteralNode) { - target.append(node); - } else { - final StringBuilder old = builder; - try { - builder = target; - node.emit(this, function); - } finally { - builder = old; + if (node != Node.NULL) { + if (node instanceof LiteralNode) { + target.append(node); + } else { + final StringBuilder old = builder; + try { + builder = target; + node.emit(this, function); + } finally { + builder = old; + } } } } @@ -89,8 +95,9 @@ public final class ResolveContext { * @throws E if the recursive expansion threw an exception */ public String getExpandedDefault() throws E { - if (current == null) + if (current == null) { throw new IllegalStateException(); + } final Node defaultValue = current.getDefaultValue(); if (defaultValue instanceof LiteralNode) { return defaultValue.toString(); diff --git a/logging/src/main/java/org/xbib/logging/filters/AcceptAllFilter.java b/logging/src/main/java/org/xbib/logging/filters/AcceptAllFilter.java index 57c7a20..8b27ec3 100644 --- a/logging/src/main/java/org/xbib/logging/filters/AcceptAllFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/AcceptAllFilter.java @@ -7,6 +7,7 @@ import java.util.logging.LogRecord; * An accept-all filter. */ public final class AcceptAllFilter implements Filter { + private AcceptAllFilter() { } @@ -18,6 +19,7 @@ public final class AcceptAllFilter implements Filter { * @param record ignored * @return {@code true} */ + @Override public boolean isLoggable(final LogRecord record) { return true; } @@ -30,4 +32,4 @@ public final class AcceptAllFilter implements Filter { public static AcceptAllFilter getInstance() { return INSTANCE; } -} \ No newline at end of file +} diff --git a/logging/src/main/java/org/xbib/logging/filters/AllFilter.java b/logging/src/main/java/org/xbib/logging/filters/AllFilter.java index cd0bfe1..b347b87 100644 --- a/logging/src/main/java/org/xbib/logging/filters/AllFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/AllFilter.java @@ -10,6 +10,7 @@ import java.util.logging.LogRecord; * this instance always returns {@code true}. */ public final class AllFilter implements Filter { + private final Filter[] filters; /** @@ -59,6 +60,7 @@ public final class AllFilter implements Filter { * @param record the log record * @return {@code true} if all the constituent filters return {@code true} */ + @Override public boolean isLoggable(final LogRecord record) { for (Filter filter : filters) { if (!filter.isLoggable(record)) { diff --git a/logging/src/main/java/org/xbib/logging/filters/AnyFilter.java b/logging/src/main/java/org/xbib/logging/filters/AnyFilter.java index 79e9bcb..2ef6d1e 100644 --- a/logging/src/main/java/org/xbib/logging/filters/AnyFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/AnyFilter.java @@ -10,6 +10,7 @@ import java.util.logging.LogRecord; * instance always returns {@code false}. */ public final class AnyFilter implements Filter { + private final Filter[] filters; /** @@ -59,6 +60,7 @@ public final class AnyFilter implements Filter { * @param record the log record * @return {@code true} if any of the constituent filters return {@code true} */ + @Override public boolean isLoggable(final LogRecord record) { for (Filter filter : filters) { if (filter.isLoggable(record)) { diff --git a/logging/src/main/java/org/xbib/logging/filters/DenyAllFilter.java b/logging/src/main/java/org/xbib/logging/filters/DenyAllFilter.java index 86be1f4..0264631 100644 --- a/logging/src/main/java/org/xbib/logging/filters/DenyAllFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/DenyAllFilter.java @@ -7,6 +7,7 @@ import java.util.logging.LogRecord; * A deny-all filter. */ public final class DenyAllFilter implements Filter { + private DenyAllFilter() { } @@ -18,6 +19,7 @@ public final class DenyAllFilter implements Filter { * @param record ignored * @return {@code false} */ + @Override public boolean isLoggable(final LogRecord record) { return false; } diff --git a/logging/src/main/java/org/xbib/logging/filters/InvertFilter.java b/logging/src/main/java/org/xbib/logging/filters/InvertFilter.java index 3dce29a..0ccdc0f 100644 --- a/logging/src/main/java/org/xbib/logging/filters/InvertFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/InvertFilter.java @@ -24,6 +24,7 @@ public final class InvertFilter implements Filter { * @param record the log record * @return {@code true} if the target filter returns {@code false}, {@code false} otherwise */ + @Override public boolean isLoggable(final LogRecord record) { return !target.isLoggable(record); } diff --git a/logging/src/main/java/org/xbib/logging/filters/LevelChangingFilter.java b/logging/src/main/java/org/xbib/logging/filters/LevelChangingFilter.java index 3ba317a..17ef3ee 100644 --- a/logging/src/main/java/org/xbib/logging/filters/LevelChangingFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/LevelChangingFilter.java @@ -27,6 +27,7 @@ public final class LevelChangingFilter implements Filter { * @param record the record to inspect and possibly update * @return {@code true} always */ + @Override public boolean isLoggable(final LogRecord record) { record.setLevel(newLevel); return true; diff --git a/logging/src/main/java/org/xbib/logging/filters/LevelFilter.java b/logging/src/main/java/org/xbib/logging/filters/LevelFilter.java index 97f96c0..3c34671 100644 --- a/logging/src/main/java/org/xbib/logging/filters/LevelFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/LevelFilter.java @@ -12,6 +12,7 @@ import java.util.logging.LogRecord; * A filter which excludes messages of a certain level or levels */ public final class LevelFilter implements Filter { + private final Set includedLevels; /** @@ -38,6 +39,7 @@ public final class LevelFilter implements Filter { * @param record the log record * @return {@code true} if the level is in the inclusion list */ + @Override public boolean isLoggable(final LogRecord record) { return includedLevels.contains(record.getLevel()); } diff --git a/logging/src/main/java/org/xbib/logging/filters/LevelRangeFilter.java b/logging/src/main/java/org/xbib/logging/filters/LevelRangeFilter.java index 0950394..e4137f5 100644 --- a/logging/src/main/java/org/xbib/logging/filters/LevelRangeFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/LevelRangeFilter.java @@ -8,9 +8,13 @@ import java.util.logging.LogRecord; * Log only messages that fall within a level range. */ public final class LevelRangeFilter implements Filter { + private final int min; + private final int max; + private final boolean minInclusive; + private final boolean maxInclusive; /** @@ -37,6 +41,7 @@ public final class LevelRangeFilter implements Filter { * @param record the log record * @return {@code true} if the record's level falls within the range specified for this instance */ + @Override public boolean isLoggable(final LogRecord record) { final int iv = record.getLevel().intValue(); return (minInclusive ? min <= iv : min < iv) && (maxInclusive ? iv <= max : iv < max); diff --git a/logging/src/main/java/org/xbib/logging/filters/RegexFilter.java b/logging/src/main/java/org/xbib/logging/filters/RegexFilter.java index 1157478..f67428f 100644 --- a/logging/src/main/java/org/xbib/logging/filters/RegexFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/RegexFilter.java @@ -11,6 +11,7 @@ import org.xbib.logging.ExtLogRecord; * regular expression is checked against the raw (unformatted) message. */ public final class RegexFilter implements Filter { + private final Pattern pattern; /** diff --git a/logging/src/main/java/org/xbib/logging/filters/SubstituteFilter.java b/logging/src/main/java/org/xbib/logging/filters/SubstituteFilter.java index df4945f..3c40b6d 100644 --- a/logging/src/main/java/org/xbib/logging/filters/SubstituteFilter.java +++ b/logging/src/main/java/org/xbib/logging/filters/SubstituteFilter.java @@ -14,7 +14,9 @@ import org.xbib.logging.ExtLogRecord.FormatStyle; public final class SubstituteFilter implements Filter { private final Pattern pattern; + private final String replacement; + private final boolean replaceAll; /** diff --git a/logging/src/main/java/org/xbib/logging/formatters/DefaultFormatter.java b/logging/src/main/java/org/xbib/logging/formatters/DefaultFormatter.java new file mode 100644 index 0000000..8b33a4d --- /dev/null +++ b/logging/src/main/java/org/xbib/logging/formatters/DefaultFormatter.java @@ -0,0 +1,79 @@ +package org.xbib.logging.formatters; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.function.Function; +import java.util.logging.Formatter; +import java.util.logging.LogManager; +import java.util.logging.LogRecord; +import org.xbib.logging.util.StackTraceFormatter; + +public class DefaultFormatter extends Formatter { + + private static final String PROPERTY_KEY = "org.xbib.logging.formatters.DefaultFormatter.format"; + + private static final String DEFAULT_FORMAT = + "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] [%5$s] %6$s %7$s%n"; + + private static final String DEFAULT_FORMAT_STRING = getFormat(DefaultFormatter::getLoggingProperty); + + private final ThreadMXBean threadMXBean; + + public DefaultFormatter() { + this.threadMXBean = ManagementFactory.getThreadMXBean(); + } + + @Override + public String format(LogRecord record) { + ZonedDateTime zdt = ZonedDateTime.ofInstant(record.getInstant(), ZoneId.systemDefault()); + String source; + if (record.getSourceClassName() != null) { + source = record.getSourceClassName(); + if (record.getSourceMethodName() != null) { + source += " " + record.getSourceMethodName(); + } + } else { + source = record.getLoggerName(); + } + String message = formatMessage(record); + String throwable = ""; + if (record.getThrown() != null) { + StringBuilder sb = new StringBuilder(); + StackTraceFormatter.renderStackTrace(sb, record.getThrown(), -1); + throwable = sb.toString(); + } + return String.format(DEFAULT_FORMAT_STRING, + zdt, + source, + record.getLoggerName(), + record.getLevel().getName(), + threadMXBean.getThreadInfo(record.getLongThreadID()).getThreadName(), + message, + throwable); + } + + private static String getLoggingProperty(String name) { + return LogManager.getLogManager().getProperty(name); + } + + private static String getFormat(Function defaultPropertyGetter) { + String format = System.getProperty(PROPERTY_KEY); + if (format == null && defaultPropertyGetter != null) { + format = defaultPropertyGetter.apply(PROPERTY_KEY); + } + if (format != null) { + try { + // validate the user-defined format string + String.format(format, ZonedDateTime.now(), "", "", "", "", ""); + } catch (IllegalArgumentException e) { + // illegal syntax; fall back to the default format + format = DEFAULT_FORMAT; + } + } else { + format = DEFAULT_FORMAT; + } + return format; + } +} diff --git a/logging/src/main/java/org/xbib/logging/formatters/SimpleFormatter.java b/logging/src/main/java/org/xbib/logging/formatters/SimpleFormatter.java index 75bc625..3d3d79a 100644 --- a/logging/src/main/java/org/xbib/logging/formatters/SimpleFormatter.java +++ b/logging/src/main/java/org/xbib/logging/formatters/SimpleFormatter.java @@ -1,80 +1,16 @@ package org.xbib.logging.formatters; -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadMXBean; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.function.Function; import java.util.logging.Formatter; -import java.util.logging.LogManager; import java.util.logging.LogRecord; -import org.xbib.logging.util.StackTraceFormatter; public class SimpleFormatter extends Formatter { - private static final String PROPERTY_KEY = "org.xbib.logging.formatters.SimpleFormatter.format"; - - private static final String DEFAULT_FORMAT = - "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] [%5$s] %6$s %7$s%n"; - - private final ThreadMXBean threadMXBean; - public SimpleFormatter() { - this.threadMXBean = ManagementFactory.getThreadMXBean(); } @Override public String format(LogRecord record) { - ZonedDateTime zdt = ZonedDateTime.ofInstant(record.getInstant(), ZoneId.systemDefault()); - String source; - if (record.getSourceClassName() != null) { - source = record.getSourceClassName(); - if (record.getSourceMethodName() != null) { - source += " " + record.getSourceMethodName(); - } - } else { - source = record.getLoggerName(); - } - String message = formatMessage(record); - String throwable = ""; - if (record.getThrown() != null) { - StringBuilder sb = new StringBuilder(); - StackTraceFormatter.renderStackTrace(sb, record.getThrown(), -1); - throwable = sb.toString(); - } - return String.format(DEFAULT_FORMAT_STRING, - zdt, - source, - record.getLoggerName(), - record.getLevel().getName(), - threadMXBean.getThreadInfo(record.getLongThreadID()).getThreadName(), - message, - throwable); - } - - private static String getLoggingProperty(String name) { - return LogManager.getLogManager().getProperty(name); - } - - private static final String DEFAULT_FORMAT_STRING = getFormat(SimpleFormatter::getLoggingProperty); - - private static String getFormat(Function defaultPropertyGetter) { - String format = System.getProperty(PROPERTY_KEY); - if (format == null && defaultPropertyGetter != null) { - format = defaultPropertyGetter.apply(PROPERTY_KEY); - } - if (format != null) { - try { - // validate the user-defined format string - String.format(format, ZonedDateTime.now(), "", "", "", "", ""); - } catch (IllegalArgumentException e) { - // illegal syntax; fall back to the default format - format = DEFAULT_FORMAT; - } - } else { - format = DEFAULT_FORMAT; - } - return format; + return formatMessage(record); } } diff --git a/logging/src/main/java/org/xbib/logging/handlers/ConsoleHandler.java b/logging/src/main/java/org/xbib/logging/handlers/ConsoleHandler.java index 6f5378f..e233b70 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/ConsoleHandler.java +++ b/logging/src/main/java/org/xbib/logging/handlers/ConsoleHandler.java @@ -7,7 +7,6 @@ import java.io.Writer; import java.util.logging.ErrorManager; import java.util.logging.Formatter; import org.xbib.logging.errormanager.HandlerErrorManager; -import org.xbib.logging.formatters.Formatters; import org.xbib.logging.io.UncloseableOutputStream; import org.xbib.logging.io.UncloseableWriter; import org.xbib.logging.util.CharsetUtil; @@ -53,7 +52,7 @@ public class ConsoleHandler extends OutputStreamHandler { * Construct a new instance. */ public ConsoleHandler() { - this(Formatters.nullFormatter()); + this(nullFormatter()); } /** @@ -71,7 +70,7 @@ public class ConsoleHandler extends OutputStreamHandler { * @param target the target to write to, or {@code null} to start with an uninitialized target */ public ConsoleHandler(final Target target) { - this(target, Formatters.nullFormatter()); + this(target, nullFormatter()); } /** @@ -120,6 +119,7 @@ public class ConsoleHandler extends OutputStreamHandler { } } + @Override public void setErrorManager(final ErrorManager em) { if (em == localErrorManager) { // ignore to avoid loops @@ -153,6 +153,7 @@ public class ConsoleHandler extends OutputStreamHandler { /** * {@inheritDoc} */ + @Override public void setOutputStream(final OutputStream outputStream) { super.setOutputStream(wrap(outputStream)); } diff --git a/logging/src/main/java/org/xbib/logging/handlers/FileHandler.java b/logging/src/main/java/org/xbib/logging/handlers/FileHandler.java index d008aa9..1c289a4 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/FileHandler.java +++ b/logging/src/main/java/org/xbib/logging/handlers/FileHandler.java @@ -13,6 +13,7 @@ import java.util.logging.Formatter; public class FileHandler extends OutputStreamHandler { private File file; + private boolean append; /** diff --git a/logging/src/main/java/org/xbib/logging/handlers/OutputStreamHandler.java b/logging/src/main/java/org/xbib/logging/handlers/OutputStreamHandler.java index cd4ee80..8f88c53 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/OutputStreamHandler.java +++ b/logging/src/main/java/org/xbib/logging/handlers/OutputStreamHandler.java @@ -6,7 +6,7 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.logging.ErrorManager; import java.util.logging.Formatter; -import org.xbib.logging.formatters.Formatters; +import java.util.logging.LogRecord; import org.xbib.logging.io.UncloseableOutputStream; import org.xbib.logging.io.UninterruptibleOutputStream; @@ -22,7 +22,7 @@ public class OutputStreamHandler extends WriterHandler { * Construct a new instance with no formatter. */ public OutputStreamHandler() { - setFormatter(Formatters.nullFormatter()); + setFormatter(nullFormatter()); } /** @@ -60,6 +60,7 @@ public class OutputStreamHandler extends WriterHandler { } } + @Override public Charset getCharset() { lock.lock(); try { @@ -72,6 +73,7 @@ public class OutputStreamHandler extends WriterHandler { /** * {@inheritDoc} Setting a writer will replace any target output stream. */ + @Override public void setWriter(final Writer writer) { lock.lock(); try { @@ -119,17 +121,29 @@ public class OutputStreamHandler extends WriterHandler { } } - OutputStream getOutputStream() { - assert lock.isHeldByCurrentThread(); - return outputStream; - } - private Writer getNewWriter(OutputStream newOutputStream) { if (newOutputStream == null) { return null; } - final UninterruptibleOutputStream outputStream = new UninterruptibleOutputStream( - new UncloseableOutputStream(newOutputStream)); + final UninterruptibleOutputStream outputStream = + new UninterruptibleOutputStream(new UncloseableOutputStream(newOutputStream)); return new OutputStreamWriter(outputStream, getCharset()); } + + private static final Formatter NULL_FORMATTER = new Formatter() { + + @Override + public String format(final LogRecord record) { + return ""; + } + }; + + /** + * Get the null formatter, which outputs nothing. + * + * @return the null formatter + */ + public static Formatter nullFormatter() { + return NULL_FORMATTER; + } } diff --git a/logging/src/main/java/org/xbib/logging/handlers/WriterHandler.java b/logging/src/main/java/org/xbib/logging/handlers/WriterHandler.java index a6f2c47..01d6854 100644 --- a/logging/src/main/java/org/xbib/logging/handlers/WriterHandler.java +++ b/logging/src/main/java/org/xbib/logging/handlers/WriterHandler.java @@ -29,6 +29,7 @@ public class WriterHandler extends ExtHandler { /** * {@inheritDoc} */ + @Override protected void doPublish(final ExtLogRecord record) { final String formatted; final Formatter formatter = getFormatter(); @@ -107,11 +108,6 @@ public class WriterHandler extends ExtHandler { } } - Writer getWriter() { - assert lock.isHeldByCurrentThread(); - return writer; - } - /** * Determine whether head encoding checking is turned on. * @@ -193,6 +189,7 @@ public class WriterHandler extends ExtHandler { /** * Flush this logger. */ + @Override public void flush() { // todo - maybe this synch is not really needed... if there's a perf detriment, drop it lock.lock(); @@ -207,6 +204,7 @@ public class WriterHandler extends ExtHandler { /** * Close this logger. */ + @Override public void close() { setWriter(null); super.close(); diff --git a/logging/src/main/java/org/xbib/logging/io/UncloseableOutputStream.java b/logging/src/main/java/org/xbib/logging/io/UncloseableOutputStream.java index 04cdedc..ce579ef 100644 --- a/logging/src/main/java/org/xbib/logging/io/UncloseableOutputStream.java +++ b/logging/src/main/java/org/xbib/logging/io/UncloseableOutputStream.java @@ -11,22 +11,27 @@ public final class UncloseableOutputStream extends OutputStream { this.delegate = delegate; } + @Override public void write(final int b) throws IOException { delegate.write(b); } + @Override public void write(final byte[] b) throws IOException { delegate.write(b); } + @Override public void write(final byte[] b, final int off, final int len) throws IOException { delegate.write(b, off, len); } + @Override public void flush() throws IOException { delegate.flush(); } + @Override public void close() { // ignore } diff --git a/logging/src/main/java/org/xbib/logging/io/UncloseableWriter.java b/logging/src/main/java/org/xbib/logging/io/UncloseableWriter.java index a6b6c07..3a48b04 100644 --- a/logging/src/main/java/org/xbib/logging/io/UncloseableWriter.java +++ b/logging/src/main/java/org/xbib/logging/io/UncloseableWriter.java @@ -13,42 +13,52 @@ public final class UncloseableWriter extends Writer { this.delegate = delegate; } + @Override public void write(final int c) throws IOException { delegate.write(c); } + @Override public void write(final char[] cbuf) throws IOException { delegate.write(cbuf); } + @Override public void write(final char[] cbuf, final int off, final int len) throws IOException { delegate.write(cbuf, off, len); } + @Override public void write(final String str) throws IOException { delegate.write(str); } + @Override public void write(final String str, final int off, final int len) throws IOException { delegate.write(str, off, len); } + @Override public Writer append(final CharSequence csq) throws IOException { return delegate.append(csq); } + @Override public Writer append(final CharSequence csq, final int start, final int end) throws IOException { return delegate.append(csq, start, end); } + @Override public Writer append(final char c) throws IOException { return delegate.append(c); } + @Override public void flush() throws IOException { delegate.flush(); } + @Override public void close() { // ignore } diff --git a/logging/src/main/java/org/xbib/logging/io/UninterruptibleOutputStream.java b/logging/src/main/java/org/xbib/logging/io/UninterruptibleOutputStream.java index 015cb62..6fe553f 100644 --- a/logging/src/main/java/org/xbib/logging/io/UninterruptibleOutputStream.java +++ b/logging/src/main/java/org/xbib/logging/io/UninterruptibleOutputStream.java @@ -27,6 +27,7 @@ public final class UninterruptibleOutputStream extends OutputStream { * @param b the byte to write * @throws IOException if an error occurs */ + @Override public void write(final int b) throws IOException { boolean intr = false; try { @@ -56,6 +57,7 @@ public final class UninterruptibleOutputStream extends OutputStream { * @param len the length of the array to write * @throws IOException if an error occurs */ + @Override public void write(final byte[] b, int off, int len) throws IOException { boolean intr = false; try { @@ -83,6 +85,7 @@ public final class UninterruptibleOutputStream extends OutputStream { * * @throws IOException if an error occurs */ + @Override public void flush() throws IOException { boolean intr = false; try { @@ -105,6 +108,7 @@ public final class UninterruptibleOutputStream extends OutputStream { * * @throws IOException if an error occurs */ + @Override public void close() throws IOException { boolean intr = false; try { @@ -127,6 +131,7 @@ public final class UninterruptibleOutputStream extends OutputStream { * * @return the string */ + @Override public String toString() { return "uninterruptible " + out.toString(); } diff --git a/logging/src/main/java/org/xbib/logging/ref/CleanerReference.java b/logging/src/main/java/org/xbib/logging/ref/CleanerReference.java index 3344bd0..b2addb8 100644 --- a/logging/src/main/java/org/xbib/logging/ref/CleanerReference.java +++ b/logging/src/main/java/org/xbib/logging/ref/CleanerReference.java @@ -8,6 +8,7 @@ import java.util.concurrent.ConcurrentHashMap; * A special version of {@link PhantomReference} that is strongly retained until it is reaped by the collection thread. */ public class CleanerReference extends PhantomReference { + private static final Set> set = Collections.newSetFromMap(new ConcurrentHashMap<>()); /** @@ -26,10 +27,12 @@ public class CleanerReference extends PhantomReference { set.remove(this); } + @Override public final int hashCode() { return super.hashCode(); } + @Override public final boolean equals(final Object obj) { return super.equals(obj); } diff --git a/logging/src/main/java/org/xbib/logging/ref/PhantomReference.java b/logging/src/main/java/org/xbib/logging/ref/PhantomReference.java index aee4ae9..fafc144 100644 --- a/logging/src/main/java/org/xbib/logging/ref/PhantomReference.java +++ b/logging/src/main/java/org/xbib/logging/ref/PhantomReference.java @@ -40,18 +40,22 @@ public class PhantomReference extends java.lang.ref.PhantomReference im this.attachment = attachment; } + @Override public A getAttachment() { return attachment; } + @Override public Type getType() { return Type.PHANTOM; } + @Override public Reaper getReaper() { return reaper; } + @Override public String toString() { return "phantom reference"; } diff --git a/logging/src/main/java/org/xbib/logging/ref/References.java b/logging/src/main/java/org/xbib/logging/ref/References.java index 7a0fd1b..a6c93b3 100644 --- a/logging/src/main/java/org/xbib/logging/ref/References.java +++ b/logging/src/main/java/org/xbib/logging/ref/References.java @@ -6,13 +6,14 @@ import java.lang.ref.ReferenceQueue; * A set of utility methods for reference types. */ public final class References { + private References() { } private static final Reference NULL = new StrongReference<>(null); static final class BuildTimeHolder { - static final ReferenceQueue REAPER_QUEUE = new ReferenceQueue(); + static final ReferenceQueue REAPER_QUEUE = new ReferenceQueue<>(); } static final class ReaperThread extends Thread { @@ -33,6 +34,7 @@ public final class References { return null; } + @Override public void run() { for (; ; ) try { diff --git a/logging/src/main/java/org/xbib/logging/ref/SoftReference.java b/logging/src/main/java/org/xbib/logging/ref/SoftReference.java index 0347114..29a6c8a 100644 --- a/logging/src/main/java/org/xbib/logging/ref/SoftReference.java +++ b/logging/src/main/java/org/xbib/logging/ref/SoftReference.java @@ -59,18 +59,22 @@ public class SoftReference extends java.lang.ref.SoftReference implemen this.attachment = attachment; } + @Override public Reaper getReaper() { return reaper; } + @Override public A getAttachment() { return attachment; } + @Override public Type getType() { return Type.SOFT; } + @Override public String toString() { return "soft reference to " + get(); } diff --git a/logging/src/main/java/org/xbib/logging/ref/StrongReference.java b/logging/src/main/java/org/xbib/logging/ref/StrongReference.java index 9b120d8..368e515 100644 --- a/logging/src/main/java/org/xbib/logging/ref/StrongReference.java +++ b/logging/src/main/java/org/xbib/logging/ref/StrongReference.java @@ -31,22 +31,27 @@ public class StrongReference implements Reference { this(referent, null); } + @Override public T get() { return referent; } + @Override public void clear() { referent = null; } + @Override public A getAttachment() { return attachment; } + @Override public Type getType() { return Type.STRONG; } + @Override public String toString() { return "strong reference to " + get(); } diff --git a/logging/src/main/java/org/xbib/logging/ref/WeakReference.java b/logging/src/main/java/org/xbib/logging/ref/WeakReference.java index 09ed3e9..67b7859 100644 --- a/logging/src/main/java/org/xbib/logging/ref/WeakReference.java +++ b/logging/src/main/java/org/xbib/logging/ref/WeakReference.java @@ -59,18 +59,22 @@ public class WeakReference extends java.lang.ref.WeakReference implemen this.reaper = reaper; } + @Override public A getAttachment() { return attachment; } + @Override public Type getType() { return Type.WEAK; } + @Override public Reaper getReaper() { return reaper; } + @Override public String toString() { return "weak reference to " + get(); } diff --git a/logging/src/main/java/org/xbib/logging/util/CopyOnWriteMap.java b/logging/src/main/java/org/xbib/logging/util/CopyOnWriteMap.java index 65b8cf0..433c9b7 100644 --- a/logging/src/main/java/org/xbib/logging/util/CopyOnWriteMap.java +++ b/logging/src/main/java/org/xbib/logging/util/CopyOnWriteMap.java @@ -19,27 +19,33 @@ public final class CopyOnWriteMap extends AbstractMap implements Con super(); } + @Override public V get(final Object key) { return map.get(key); } + @Override public boolean containsKey(final Object key) { return map.containsKey(key); } + @Override public int size() { return map.size(); } + @Override public boolean containsValue(final Object value) { return map.containsValue(value); } @SuppressWarnings("unchecked") + @Override public void clear() { map = new FastCopyHashMap<>(32, 0.25f); } + @Override public V put(final K key, final V value) { FastCopyHashMap oldVal, newVal; V result; @@ -51,6 +57,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con return result; } + @Override public V remove(final Object key) { FastCopyHashMap oldVal, newVal; V result; @@ -66,6 +73,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con } @SuppressWarnings("unchecked") + @Override public CopyOnWriteMap clone() { try { return (CopyOnWriteMap) super.clone(); @@ -74,6 +82,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con } } + @Override public V putIfAbsent(final K key, final V value) { FastCopyHashMap oldVal, newVal; do { @@ -88,6 +97,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con } @SuppressWarnings("unchecked") + @Override public boolean remove(final Object key, final Object value) { FastCopyHashMap oldVal, newVal; do { @@ -106,6 +116,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con return true; } + @Override public boolean replace(final K key, final V oldValue, final V newValue) { FastCopyHashMap oldVal, newVal; do { @@ -120,6 +131,7 @@ public final class CopyOnWriteMap extends AbstractMap implements Con return true; } + @Override public V replace(final K key, final V value) { FastCopyHashMap oldVal, newVal; V result; @@ -135,14 +147,17 @@ public final class CopyOnWriteMap extends AbstractMap implements Con return result; } + @Override public Set keySet() { return Collections.unmodifiableSet(map.keySet()); } + @Override public Collection values() { return Collections.unmodifiableCollection(map.values()); } + @Override public Set> entrySet() { return Collections.unmodifiableSet(map.entrySet()); } diff --git a/logging/src/main/java/org/xbib/logging/util/CopyOnWriteWeakMap.java b/logging/src/main/java/org/xbib/logging/util/CopyOnWriteWeakMap.java index 3f8f6ae..417d401 100644 --- a/logging/src/main/java/org/xbib/logging/util/CopyOnWriteWeakMap.java +++ b/logging/src/main/java/org/xbib/logging/util/CopyOnWriteWeakMap.java @@ -26,14 +26,13 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements private volatile FastCopyHashMap> map = empty(); private FastCopyHashMap> cleanCopyForRemove() { - assert Thread.holdsLock(this); final Map> oldMap = map; final Queue queue = this.queue; if (oldMap.isEmpty()) { queue.clear(); return empty(); } - final FastCopyHashMap> newMap = new FastCopyHashMap>(oldMap); + final FastCopyHashMap> newMap = new FastCopyHashMap<>(oldMap); Node ref; while ((ref = queue.poll()) != null) { final Object key = ref.getKey(); @@ -49,7 +48,6 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements } private FastCopyHashMap> cleanCopyForMod() { - assert Thread.holdsLock(this); final Map> oldMap = map; final Queue queue = this.queue; if (oldMap.isEmpty()) { @@ -71,6 +69,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements return newMap; } + @Override public V putIfAbsent(final K key, final V value) { if (key == null) { throw new IllegalArgumentException("key is null"); @@ -92,6 +91,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements } } + @Override public boolean remove(final Object key, final Object value) { synchronized (this) { final Node oldNode = map.get(key); @@ -106,6 +106,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements return false; } + @Override public boolean replace(final K key, final V oldValue, final V newValue) { if (newValue == null) { throw new IllegalArgumentException("newValue is null"); @@ -126,6 +127,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements return false; } + @Override public V replace(final K key, final V value) { if (value == null) { throw new IllegalArgumentException("value is null"); @@ -142,18 +144,22 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements } } + @Override public int size() { return map.size(); } + @Override public boolean isEmpty() { return map.isEmpty(); } + @Override public boolean containsKey(final Object key) { return map.containsKey(key); } + @Override public boolean containsValue(final Object value) { if (value == null) return false; @@ -165,11 +171,13 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements return false; } + @Override public V get(final Object key) { final Node node = map.get(key); return node == null ? null : node.get(); } + @Override public V put(final K key, final V value) { if (key == null) { throw new IllegalArgumentException("key is null"); @@ -185,6 +193,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements } } + @Override public V remove(final Object key) { if (key == null) return null; @@ -196,12 +205,14 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements } } + @Override public void clear() { synchronized (this) { map = empty(); } } + @Override public Set> entrySet() { final FastCopyHashMap> snapshot = map; final Map copyMap = new HashMap(); @@ -231,6 +242,7 @@ public final class CopyOnWriteWeakMap extends AbstractMap implements @SuppressWarnings("unchecked") private static final class Queue extends ReferenceQueue { + @Override public Node poll() { return (Node) super.poll(); } diff --git a/logging/src/main/java/org/xbib/logging/util/FastCopyHashMap.java b/logging/src/main/java/org/xbib/logging/util/FastCopyHashMap.java index 41a972d..9f08835 100644 --- a/logging/src/main/java/org/xbib/logging/util/FastCopyHashMap.java +++ b/logging/src/main/java/org/xbib/logging/util/FastCopyHashMap.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; +import java.util.Arrays; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Iterator; @@ -153,14 +154,17 @@ public class FastCopyHashMap extends AbstractMap implements Map extends AbstractMap implements Map extends AbstractMap implements Map e : table) if (e != null && eq(value, e.value)) @@ -211,6 +217,7 @@ public class FastCopyHashMap extends AbstractMap implements Map extends AbstractMap implements Map map) { int size = map.size(); if (size == 0) @@ -286,6 +294,7 @@ public class FastCopyHashMap extends AbstractMap implements Map extends AbstractMap implements Map[] table = this.table; - for (int i = 0; i < table.length; i++) - table[i] = null; - + Arrays.fill(table, null); size = 0; } @SuppressWarnings("unchecked") + @Override public FastCopyHashMap clone() { try { FastCopyHashMap clone = (FastCopyHashMap) super.clone(); @@ -363,54 +372,27 @@ public class FastCopyHashMap extends AbstractMap implements Map e = table[i]; - if (e != null) { - - total++; - int target = index(e.hash, table.length); - if (i == target) - optimal++; - else { - int skew = Math.abs(i - target); - if (skew > maxSkew) - maxSkew = skew; - totalSkew += skew; - } - - } - } - - System.out.println(" Size: " + size); - System.out.println(" Real Size: " + total); - System.out.println(" Optimal: " + optimal + " (" + (float) optimal * 100 / total + "%)"); - System.out.println(" Average Distance:" + ((float) totalSkew / (total - optimal))); - System.out.println(" Max Distance: " + maxSkew); - } - + @Override public Set> entrySet() { - if (entrySet == null) + if (entrySet == null) { entrySet = new EntrySet(); - + } return entrySet; } + @Override public Set keySet() { - if (keySet == null) + if (keySet == null) { keySet = new KeySet(); - + } return keySet; } + @Override public Collection values() { - if (values == null) + if (values == null) { values = new Values(); - + } return values; } @@ -457,18 +439,6 @@ public class FastCopyHashMap extends AbstractMap implements Map(key, hash, value); } - private void writeObject(java.io.ObjectOutputStream s) throws IOException { - s.defaultWriteObject(); - s.writeInt(size); - - for (Entry e : table) { - if (e != null) { - s.writeObject(unmaskNull(e.key)); - s.writeObject(e.value); - } - } - } - private static final class Entry { final K key; final int hash; @@ -488,6 +458,7 @@ public class FastCopyHashMap extends AbstractMap implements Map[] table = FastCopyHashMap.this.table; + @Override public boolean hasNext() { if (hasNext) return true; @@ -518,10 +489,11 @@ public class FastCopyHashMap extends AbstractMap implements Map extends AbstractMap implements Map { + @Override public K next() { return unmaskNull(nextEntry().key); } } private class ValueIterator extends FastCopyHashMapIterator { + @Override public V next() { return nextEntry().value; } @@ -591,10 +565,12 @@ public class FastCopyHashMap extends AbstractMap implements Map> { private class WriteThroughEntry extends SimpleEntry { + WriteThroughEntry(K key, V value) { super(key, value); } + @Override public V setValue(V value) { if (table != FastCopyHashMap.this.table) FastCopyHashMap.this.put(getKey(), value); @@ -603,72 +579,85 @@ public class FastCopyHashMap extends AbstractMap implements Map next() { Entry e = nextEntry(); return new WriteThroughEntry(unmaskNull(e.key), e.value); } - } private class KeySet extends AbstractSet { + @Override public Iterator iterator() { return new KeyIterator(); } + @Override public void clear() { FastCopyHashMap.this.clear(); } + @Override public boolean contains(Object o) { return containsKey(o); } + @Override public boolean remove(Object o) { int size = size(); FastCopyHashMap.this.remove(o); return size() < size; } + @Override public int size() { return FastCopyHashMap.this.size(); } } private class Values extends AbstractCollection { + @Override public Iterator iterator() { return new ValueIterator(); } + @Override public void clear() { FastCopyHashMap.this.clear(); } + @Override public int size() { return FastCopyHashMap.this.size(); } } private class EntrySet extends AbstractSet> { + @Override public Iterator> iterator() { return new EntryIterator(); } + @Override public boolean contains(Object o) { - if (!(o instanceof Map.Entry entry)) + if (!(o instanceof Map.Entry entry)) { return false; - + } Object value = get(entry.getKey()); return eq(entry.getValue(), value); } + @Override public void clear() { FastCopyHashMap.this.clear(); } + @Override public boolean isEmpty() { return FastCopyHashMap.this.isEmpty(); } + @Override public int size() { return FastCopyHashMap.this.size(); } @@ -688,34 +677,41 @@ public class FastCopyHashMap extends AbstractMap implements Map e)) + } + if (!(o instanceof Map.Entry e)) { return false; + } return eq(key, e.getKey()) && eq(value, e.getValue()); } + @Override public int hashCode() { return (key == null ? 0 : hash(key)) ^ (value == null ? 0 : hash(value)); } + @Override public String toString() { return getKey() + "=" + getValue(); } diff --git a/logging/src/main/java/org/xbib/logging/configuration/ObjectBuilder.java b/logging/src/main/java/org/xbib/logging/util/ObjectBuilder.java similarity index 95% rename from logging/src/main/java/org/xbib/logging/configuration/ObjectBuilder.java rename to logging/src/main/java/org/xbib/logging/util/ObjectBuilder.java index 0b50f35..8b5c28e 100644 --- a/logging/src/main/java/org/xbib/logging/configuration/ObjectBuilder.java +++ b/logging/src/main/java/org/xbib/logging/util/ObjectBuilder.java @@ -1,4 +1,4 @@ -package org.xbib.logging.configuration; +package org.xbib.logging.util; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -13,18 +13,26 @@ import java.util.TimeZone; import java.util.function.Supplier; import java.util.logging.Level; import java.util.regex.Pattern; +import org.xbib.logging.configuration.ContextConfiguration; /** * Helper to lazily build an object. */ @SuppressWarnings({"UnusedReturnValue"}) -class ObjectBuilder { +public class ObjectBuilder { + private final ContextConfiguration contextConfiguration; + private final Class baseClass; + private final String className; + private final Map constructorProperties; + private final Map properties; + private final Set definedProperties; + private final Set postConstructMethods; private ObjectBuilder(final ContextConfiguration contextConfiguration, @@ -46,7 +54,7 @@ class ObjectBuilder { * @param the type being created * @return a new {@link ObjectBuilder} */ - static ObjectBuilder of(final ContextConfiguration contextConfiguration, + public static ObjectBuilder of(final ContextConfiguration contextConfiguration, final Class baseClass, final String className) { return new ObjectBuilder<>(contextConfiguration, baseClass, className); } @@ -61,7 +69,7 @@ class ObjectBuilder { * @param value a string representing the value * @return this builder */ - ObjectBuilder addConstructorProperty(final String name, final String value) { + public ObjectBuilder addConstructorProperty(final String name, final String value) { constructorProperties.put(name, value); return this; } @@ -73,7 +81,7 @@ class ObjectBuilder { * @param methodNames the name of the method to execute * @return this builder */ - ObjectBuilder addPostConstructMethods(final String... methodNames) { + public ObjectBuilder addPostConstructMethods(final String... methodNames) { if (methodNames != null) { Collections.addAll(postConstructMethods, methodNames); } @@ -87,7 +95,7 @@ class ObjectBuilder { * @param value a string representing the value * @return this builder */ - ObjectBuilder addProperty(final String name, final String value) { + public ObjectBuilder addProperty(final String name, final String value) { properties.put(name, value); return this; } @@ -100,7 +108,7 @@ class ObjectBuilder { * @param value a supplier for the property value * @return this builder */ - ObjectBuilder addDefinedProperty(final String name, final Class type, final Supplier value) { + public ObjectBuilder addDefinedProperty(final String name, final Class type, final Supplier value) { definedProperties.add(new PropertyValue(name, type, value)); return this; } @@ -111,7 +119,7 @@ class ObjectBuilder { * @param moduleName the module name or {@code null} to use this class loader * @return this builder */ - ObjectBuilder setModuleName(final String moduleName) { + public ObjectBuilder setModuleName(final String moduleName) { return this; } @@ -120,7 +128,7 @@ class ObjectBuilder { * * @return a supplier which can create the object */ - Supplier build() { + public Supplier build() { if (className == null) { throw new IllegalArgumentException("className is null"); } diff --git a/logging/src/main/java/org/xbib/logging/util/StackWalkerUtil.java b/logging/src/main/java/org/xbib/logging/util/StackWalkerUtil.java index 91b6256..c109b9b 100644 --- a/logging/src/main/java/org/xbib/logging/util/StackWalkerUtil.java +++ b/logging/src/main/java/org/xbib/logging/util/StackWalkerUtil.java @@ -53,6 +53,7 @@ public final class StackWalkerUtil { this.logRecord = logRecord; } + @Override public Void apply(final Stream stream) { final String loggerClassName = logRecord.getLoggerClassName(); final Iterator iterator = stream.iterator(); @@ -93,6 +94,7 @@ public final class StackWalkerUtil { this.rejectClassLoaders = rejectClassLoaders; } + @Override public Class apply(final Stream stream) { final Iterator iterator = stream.iterator(); while (iterator.hasNext()) { diff --git a/logging/src/test/java/module-info.java b/logging/src/test/java/module-info.java index 3ce675e..648f2aa 100644 --- a/logging/src/test/java/module-info.java +++ b/logging/src/test/java/module-info.java @@ -1,14 +1,10 @@ module org.xbib.logging.test { - requires java.logging; - requires java.xml; requires transitive org.junit.jupiter.api; requires transitive org.xbib.logging; exports org.xbib.logging.test; exports org.xbib.logging.test.configuration; - exports org.xbib.logging.test.formatters; exports org.xbib.logging.test.handlers; opens org.xbib.logging.test to org.junit.platform.commons; opens org.xbib.logging.test.configuration to org.junit.platform.commons; - opens org.xbib.logging.test.formatters to org.junit.platform.commons; opens org.xbib.logging.test.handlers to org.junit.platform.commons; } diff --git a/logging/src/test/java/org/xbib/logging/test/FileHandlerPerformanceTests.java b/logging/src/test/java/org/xbib/logging/test/FileHandlerPerformanceTests.java index 0616fca..d7474ae 100644 --- a/logging/src/test/java/org/xbib/logging/test/FileHandlerPerformanceTests.java +++ b/logging/src/test/java/org/xbib/logging/test/FileHandlerPerformanceTests.java @@ -7,13 +7,13 @@ import java.util.logging.Formatter; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.formatters.SimpleFormatter; import org.xbib.logging.handlers.FileHandler; import org.junit.jupiter.api.Test; public class FileHandlerPerformanceTests { - private static final Formatter testFormatter = new PatternFormatter("%m\n"); + private static final Formatter testFormatter = new SimpleFormatter(); public FileHandlerPerformanceTests() { } diff --git a/logging/src/test/java/org/xbib/logging/test/HandlerTests.java b/logging/src/test/java/org/xbib/logging/test/HandlerTests.java index f27b22a..02a2e1f 100644 --- a/logging/src/test/java/org/xbib/logging/test/HandlerTests.java +++ b/logging/src/test/java/org/xbib/logging/test/HandlerTests.java @@ -15,7 +15,7 @@ import java.util.logging.LogRecord; import org.xbib.logging.ExtHandler; import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.formatters.SimpleFormatter; import org.xbib.logging.handlers.FileHandler; import org.xbib.logging.handlers.OutputStreamHandler; import org.xbib.logging.handlers.WriterHandler; @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; public final class HandlerTests { - private final Formatter testFormatter = new PatternFormatter("%m"); + private final Formatter testFormatter = new SimpleFormatter(); public HandlerTests() { } diff --git a/logging/src/test/java/org/xbib/logging/test/LoggerTests.java b/logging/src/test/java/org/xbib/logging/test/LoggerTests.java index 8c8bb7d..c02f666 100644 --- a/logging/src/test/java/org/xbib/logging/test/LoggerTests.java +++ b/logging/src/test/java/org/xbib/logging/test/LoggerTests.java @@ -22,8 +22,8 @@ import org.xbib.logging.LogContextInitializer; import org.xbib.logging.Logger; import org.xbib.logging.LoggerNode; import org.xbib.logging.filters.RegexFilter; -import org.xbib.logging.formatters.PatternFormatter; import org.junit.jupiter.api.Test; +import org.xbib.logging.formatters.DefaultFormatter; public final class LoggerTests { @@ -98,8 +98,9 @@ public final class LoggerTests { boolean f1 = false; final Handler[] handlers = logger.getHandlers(); for (Handler handler : handlers) { - if (handler == h1) + if (handler == h1) { f1 = true; + } } assertTrue(f1, "Handler 1 missing"); assertEquals(3, handlers.length, "Extra handlers missing"); @@ -244,11 +245,11 @@ public final class LoggerTests { } private static final class ListHandler extends ExtHandler { - final List messages = Collections.synchronizedList(new ArrayList()); + final List messages = Collections.synchronizedList(new ArrayList<>()); ListHandler() { super(); - setFormatter(new PatternFormatter("%s")); + setFormatter(new DefaultFormatter()); } @Override diff --git a/logging/src/test/java/org/xbib/logging/test/PropertyValuesTests.java b/logging/src/test/java/org/xbib/logging/test/PropertyValuesTests.java index 9a337f3..25481ea 100644 --- a/logging/src/test/java/org/xbib/logging/test/PropertyValuesTests.java +++ b/logging/src/test/java/org/xbib/logging/test/PropertyValuesTests.java @@ -3,7 +3,6 @@ package org.xbib.logging.test; import java.util.EnumMap; import java.util.Map; -import org.xbib.logging.formatters.StructuredFormatter.Key; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.xbib.logging.util.PropertyValues; @@ -131,4 +130,25 @@ public class PropertyValuesTests extends MapTestUtils { Assertions.assertTrue(PropertyValues.stringToMap(null).isEmpty(), "Expected an empty map"); Assertions.assertTrue(PropertyValues.stringToMap("").isEmpty(), "Expected an empty map"); } + + public enum Key { + EXCEPTION_CAUSED_BY("causedBy"), + HOST_NAME("hostName"), + MESSAGE("message"); + + private final String key; + + Key(final String key) { + this.key = key; + } + + /** + * Returns the name of the key for the structure. + * + * @return the name of they key + */ + public String getKey() { + return key; + } + } } diff --git a/logging/src/test/java/org/xbib/logging/test/configuration/PropertyConfigurationTests.java b/logging/src/test/java/org/xbib/logging/test/configuration/PropertyConfigurationTests.java index cc81859..5bee413 100644 --- a/logging/src/test/java/org/xbib/logging/test/configuration/PropertyConfigurationTests.java +++ b/logging/src/test/java/org/xbib/logging/test/configuration/PropertyConfigurationTests.java @@ -24,16 +24,17 @@ import org.xbib.logging.ExtLogRecord; import org.xbib.logging.Level; import org.xbib.logging.LogContext; import org.xbib.logging.configuration.PropertyContextConfiguration; -import org.xbib.logging.formatters.PatternFormatter; +import org.xbib.logging.formatters.SimpleFormatter; import org.xbib.logging.handlers.ConsoleHandler; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; public class PropertyConfigurationTests { - private static final String DEFAULT_PATTERN = "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"; + //private static final String DEFAULT_PATTERN = "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"; private LogContext logContext; @@ -57,7 +58,7 @@ public class PropertyConfigurationTests { @Test public void readConfigs() throws Exception { final Path configDir = Paths.get(System.getProperty("user.dir"), "src", "test", "resources", "configs"); - Assertions.assertTrue(Files.exists(configDir), "Missing config dir: " + configDir); + assertTrue(Files.exists(configDir), "Missing config dir: " + configDir); try (Stream stream = Files.walk(configDir).filter(Files::isRegularFile)) { stream.forEach((configFile) -> { try ( @@ -102,7 +103,7 @@ public class PropertyConfigurationTests { Assertions.assertNotNull(logger); final TestHandler testHandler = findType(TestHandler.class, logger.getHandlers()); Assertions.assertNotNull(testHandler, "Failed to find TestHandler"); - Assertions.assertTrue(TestHandler.INITIALIZED); + assertTrue(TestHandler.INITIALIZED); } @Test @@ -127,11 +128,11 @@ public class PropertyConfigurationTests { final Logger rootLogger = logContext.getLogger(""); final TestHandler handler = findType(TestHandler.class, rootLogger.getHandlers()); Assertions.assertNotNull(handler); - Assertions.assertTrue(TestHandler.INITIALIZED); + assertTrue(TestHandler.INITIALIZED); final ErrorManager errorManager = handler.getErrorManager(); - Assertions.assertTrue(errorManager instanceof TestErrorManager); - Assertions.assertTrue(TestErrorManager.INITIALIZED); + assertTrue(errorManager instanceof TestErrorManager); + assertTrue(TestErrorManager.INITIALIZED); } @Test @@ -219,12 +220,10 @@ public class PropertyConfigurationTests { // Configure a handler config.setProperty("handler.CONSOLE", ConsoleHandler.class.getName()); config.setProperty("handler.CONSOLE.level", "TRACE"); - config.setProperty("handler.CONSOLE.formatter", "PATTERN"); + config.setProperty("handler.CONSOLE.formatter", "SIMPLE"); // Configure a formatter - config.setProperty("formatter.PATTERN", PatternFormatter.class.getName()); - config.setProperty("formatter.PATTERN.properties", "pattern"); - config.setProperty("formatter.PATTERN.pattern", DEFAULT_PATTERN); + config.setProperty("formatter.SIMPLE", SimpleFormatter.class.getName()); return config; } diff --git a/logging/src/test/resources/configs/default-logging.properties b/logging/src/test/resources/configs/default-logging.properties index af89bd2..7f50f0c 100644 --- a/logging/src/test/resources/configs/default-logging.properties +++ b/logging/src/test/resources/configs/default-logging.properties @@ -19,14 +19,14 @@ logger.org.xbib.filter2.filter=FILTER logger./../Weird/Path.level=INFO handler.CONSOLE=org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN +handler.CONSOLE.formatter=SIMPLE handler.CONSOLE.properties=autoFlush,target handler.CONSOLE.autoFlush=true handler.CONSOLE.target=SYSTEM_OUT handler.CONSOLE.filter=FILTER handler.FILE=org.xbib.logging.handlers.FileHandler -handler.FILE.formatter=PATTERN +handler.FILE.formatter=SIMPLE handler.FILE.level=TRACE handler.FILE.properties=autoFlush,append,fileName handler.FILE.constructorProperties=fileName,append @@ -49,11 +49,7 @@ errorManager.DFT=org.xbib.logging.errormanager.OnlyOnceErrorManager errorManagers=OTHER errorManager.OTHER=java.util.logging.ErrorManager -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter formatters=OTHER -formatter.OTHER=org.xbib.logging.formatters.PatternFormatter -formatter.OTHER.properties=pattern -formatter.OTHER.pattern=%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n +formatter.OTHER=org.xbib.logging.formatters.SimpleFormatter diff --git a/logging/src/test/resources/configs/expected-spaced-value-logging.properties b/logging/src/test/resources/configs/expected-spaced-value-logging.properties index 96fd1ea..786ddb4 100644 --- a/logging/src/test/resources/configs/expected-spaced-value-logging.properties +++ b/logging/src/test/resources/configs/expected-spaced-value-logging.properties @@ -9,7 +9,7 @@ logger.org.xbib.logging.useParentHandlers=true logger.org.xbib.logging.level=INFO handler.CONSOLE=org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN +handler.CONSOLE.formatter=SIMPLE handler.CONSOLE.properties=autoFlush,target handler.CONSOLE.autoFlush=\u0020true\u0020 handler.CONSOLE.target=\u0020SYSTEM_OUT @@ -21,6 +21,4 @@ filter.FILTER=org.xbib.logging.filters.AcceptAllFilter errorManager.DFT=org.xbib.logging.errormanager.OnlyOnceErrorManager -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern='\u0020'%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter diff --git a/logging/src/test/resources/configs/expression-logging.properties b/logging/src/test/resources/configs/expression-logging.properties index ed95a5c..9568d4d 100644 --- a/logging/src/test/resources/configs/expression-logging.properties +++ b/logging/src/test/resources/configs/expression-logging.properties @@ -8,7 +8,7 @@ logger.org.xbib.logging.useParentHandlers=${logging.use.parent.handlers:true} logger.org.xbib.logging.level=${default.log.level:INFO} handler.CONSOLE=org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN +handler.CONSOLE.formatter=SIMPLE handler.CONSOLE.properties=autoFlush,target,encoding,filter handler.CONSOLE.autoFlush=${handler.autoFlush:true} handler.CONSOLE.target=${handler.console.target:SYSTEM_OUT} @@ -16,7 +16,7 @@ handler.CONSOLE.filter=${handler.console.filter:FILTER} handler.CONSOLE.encoding=${handler.encoding:UTF-8} handler.FILE=org.xbib.logging.handlers.FileHandler -handler.FILE.formatter=PATTERN +handler.FILE.formatter=SIMPLE handler.FILE.level=${handler.level:TRACE} handler.FILE.properties=autoFlush,append,fileName,errorManager,encoding,filter handler.FILE.constructorProperties=fileName,append @@ -29,8 +29,6 @@ handler.FILE.errorManager=${handler.errorManager:DFT} errorManager.DFT=org.xbib.logging.errormanager.OnlyOnceErrorManager -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern=${format.pattern:%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n} +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter filter.FILTER=org.xbib.logging.filters.AcceptAllFilter \ No newline at end of file diff --git a/logging/src/test/resources/configs/invalid-logging.properties b/logging/src/test/resources/configs/invalid-logging.properties index b04bc0d..7e1b177 100644 --- a/logging/src/test/resources/configs/invalid-logging.properties +++ b/logging/src/test/resources/configs/invalid-logging.properties @@ -6,17 +6,15 @@ logger.handlers=CONSOLE,INVALID logger.org.xbib.logging.useParentHandlers=true logger.org.xbib.logging.level=INFO -# logger.org.xbib.logging.filter=INVALID TODO (jrp) filters need to be revisited logger.org.xbib.filter1.filter=match(".*") logger.org.xbib.filter2.filter=FILTER handler.CONSOLE=org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN +handler.CONSOLE.formatter=SIMPLE handler.CONSOLE.properties=autoFlush,target handler.CONSOLE.autoFlush=true handler.CONSOLE.target=SYSTEM_OUT -# handler.CONSOLE.filter=INVALID TODO (jrp) filters need to be revisited handler.CONSOLE.errorManager=INVALID handler.FILE=org.xbib.logging.handlers.FileHandler @@ -37,6 +35,4 @@ filter.FILTER=org.xbib.logging.filters.AcceptAllFilter errorManager.DFT=org.xbib.logging.errormanager.OnlyOnceErrorManager -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter diff --git a/logging/src/test/resources/configs/simple-logging.properties b/logging/src/test/resources/configs/simple-logging.properties index 636f03f..1a99ece 100644 --- a/logging/src/test/resources/configs/simple-logging.properties +++ b/logging/src/test/resources/configs/simple-logging.properties @@ -8,11 +8,9 @@ logger.org.xbib.logging.useParentHandlers=true logger.org.xbib.logging.level=INFO handler.CONSOLE=org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN +handler.CONSOLE.formatter=SIMPLE handler.CONSOLE.properties=autoFlush,target handler.CONSOLE.autoFlush=true handler.CONSOLE.target=SYSTEM_OUT -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n \ No newline at end of file +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter diff --git a/logging/src/test/resources/configs/spaced-value-logging.properties b/logging/src/test/resources/configs/spaced-value-logging.properties index 2b13043..8ec26ee 100644 --- a/logging/src/test/resources/configs/spaced-value-logging.properties +++ b/logging/src/test/resources/configs/spaced-value-logging.properties @@ -9,7 +9,7 @@ logger.org.xbib.logging.useParentHandlers=true\u0020 logger.org.xbib.logging.level=\u0020INFO\u0020 handler.CONSOLE=\u0020org.xbib.logging.handlers.ConsoleHandler -handler.CONSOLE.formatter=PATTERN\u0020 +handler.CONSOLE.formatter=SIMPLE\u0020 handler.CONSOLE.properties=autoFlush,target handler.CONSOLE.autoFlush=\u0020true\u0020 handler.CONSOLE.target=\u0020SYSTEM_OUT @@ -21,6 +21,4 @@ filter.FILTER=org.xbib.logging.filters.AcceptAllFilter errorManager.DFT=org.xbib.logging.errormanager.OnlyOnceErrorManager -formatter.PATTERN=org.xbib.logging.formatters.PatternFormatter -formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern='\u0020'%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n +formatter.SIMPLE=org.xbib.logging.formatters.SimpleFormatter diff --git a/settings.gradle b/settings.gradle index 9760f03..e25c1ad 100644 --- a/settings.gradle +++ b/settings.gradle @@ -42,5 +42,6 @@ dependencyResolutionManagement { } include 'logging' +include 'logging-ext' include 'logging-adapter-log4j' include 'logging-adapter-slf4j'