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