You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/12/04 09:50:01 UTC
(logging-log4j-transform) branch main updated: Reformat using Palantir formatter
This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/logging-log4j-transform.git
The following commit(s) were added to refs/heads/main by this push:
new a190ba8 Reformat using Palantir formatter
a190ba8 is described below
commit a190ba8dfd8a58f1ce95c3d06bcd6a924a416db5
Author: Spotless <ro...@logging.apache.org>
AuthorDate: Mon Dec 4 10:49:54 2023 +0100
Reformat using Palantir formatter
---
.../log4j/transform/maven/LocationMojo.java | 21 ++--
.../maven/scan/ClassFileInclusionScanner.java | 2 -
.../maven/scan/SimpleInclusionScanner.java | 20 ++--
.../shade/transformer/CloseShieldOutputStream.java | 5 +-
.../Log4j2PluginCacheFileTransformer.java | 46 +++------
.../Log4j2PluginCacheFileTransformerTest.java | 48 +++++----
.../org/apache/logging/log4j/weaver/Constants.java | 32 +++---
.../logging/log4j/weaver/ConversionException.java | 1 -
.../log4j/weaver/LocationCacheGenerator.java | 115 ++++++++++++---------
.../log4j/weaver/LocationClassConverter.java | 4 +-
.../logging/log4j/weaver/LocationClassVisitor.java | 21 ++--
.../log4j/weaver/LocationMethodVisitor.java | 55 ++++++----
.../logging/log4j/weaver/SupplierLambdaType.java | 4 +-
.../weaver/log4j2/LogBuilderConversionHandler.java | 8 +-
.../weaver/log4j2/LoggerConversionHandler.java | 45 ++++----
.../weaver/AbstractConversionHandlerTest.java | 25 +++--
.../apache/logging/log4j/weaver/NoLoggingTest.java | 5 +-
.../log4j2/LogBuilderConversionHandlerExample.java | 12 +--
.../log4j2/LogBuilderConversionHandlerTest.java | 1 -
.../log4j/weaver/log4j2/LogBuilderMock.java | 1 -
.../log4j2/LoggerConversionHandlerExample.java | 20 ++--
.../weaver/log4j2/LoggerConversionHandlerTest.java | 17 ++-
22 files changed, 268 insertions(+), 240 deletions(-)
diff --git a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/LocationMojo.java b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/LocationMojo.java
index 1a96f8a..4a15886 100644
--- a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/LocationMojo.java
+++ b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/LocationMojo.java
@@ -31,7 +31,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
-
import org.apache.logging.log4j.transform.maven.scan.ClassFileInclusionScanner;
import org.apache.logging.log4j.transform.maven.scan.SimpleInclusionScanner;
import org.apache.logging.log4j.weaver.LocationCacheGenerator;
@@ -52,7 +51,10 @@ import org.apache.maven.project.MavenProject;
/**
* Generates location information for use with Log4j2.
*/
-@Mojo(name = "process-classes", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true,
+@Mojo(
+ name = "process-classes",
+ defaultPhase = LifecyclePhase.PROCESS_CLASSES,
+ threadSafe = true,
requiresDependencyResolution = ResolutionScope.COMPILE)
public class LocationMojo extends AbstractMojo {
@@ -64,7 +66,7 @@ public class LocationMojo extends AbstractMojo {
/**
* The Maven project.
*/
- @Parameter( defaultValue = "${project}", readonly = true, required = true )
+ @Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
/**
@@ -112,8 +114,8 @@ public class LocationMojo extends AbstractMojo {
final LocationClassConverter converter = new LocationClassConverter(getProjectDependencies());
try {
- final Set<Path> staleClassFiles = getClassFileInclusionScanner().getIncludedClassFiles(sourceDirectory,
- outputDirectory);
+ final Set<Path> staleClassFiles =
+ getClassFileInclusionScanner().getIncludedClassFiles(sourceDirectory, outputDirectory);
staleClassFiles.stream()
.collect(Collectors.groupingBy(LocationCacheGenerator::getCacheClassFile))
.values()
@@ -126,8 +128,8 @@ public class LocationMojo extends AbstractMojo {
}
}
- private void convertClassfiles(List<Path> classFiles, LocationClassConverter converter,
- LocationCacheGenerator locationCache) {
+ private void convertClassfiles(
+ List<Path> classFiles, LocationClassConverter converter, LocationCacheGenerator locationCache) {
final Path sourceDirectory = this.sourceDirectory.toPath();
classFiles.sort(Path::compareTo);
final ByteArrayOutputStream buf = new ByteArrayOutputStream();
@@ -185,12 +187,10 @@ public class LocationMojo extends AbstractMojo {
private WrappedIOException(IOException cause) {
super(cause);
}
-
}
private void validateLog4jVersion() throws MojoExecutionException {
- Artifact log4jApi = project.getArtifacts()
- .stream()
+ Artifact log4jApi = project.getArtifacts().stream()
.filter(a -> LOG4J_GROUP_ID.equals(a.getGroupId()) && LOG4J_API_ARTIFACT_ID.equals(a.getArtifactId()))
.findAny()
.orElseThrow(() -> new MojoExecutionException("Missing `log4j-api` dependency."));
@@ -221,5 +221,4 @@ public class LocationMojo extends AbstractMojo {
}
return new URLClassLoader(urls.toArray(EMPTY_URL_ARRAY));
}
-
}
diff --git a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/ClassFileInclusionScanner.java b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/ClassFileInclusionScanner.java
index 16cc095..97b5d31 100644
--- a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/ClassFileInclusionScanner.java
+++ b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/ClassFileInclusionScanner.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.transform.maven.scan;
import java.nio.file.Path;
import java.util.Set;
-
import org.apache.logging.log4j.weaver.Constants;
public interface ClassFileInclusionScanner {
@@ -34,5 +33,4 @@ public interface ClassFileInclusionScanner {
* @return a set of relative paths to file in {@code sourceDir}
*/
Set<Path> getIncludedClassFiles(Path sourceDir, Path targetDir);
-
}
diff --git a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/SimpleInclusionScanner.java b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/SimpleInclusionScanner.java
index 0b86bc6..a270400 100644
--- a/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/SimpleInclusionScanner.java
+++ b/log4j-transform-maven-plugin/src/main/java/org/apache/logging/log4j/transform/maven/scan/SimpleInclusionScanner.java
@@ -25,7 +25,6 @@ import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-
import org.apache.logging.log4j.weaver.LocationCacheGenerator;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.DirectoryScanner;
@@ -40,12 +39,15 @@ public class SimpleInclusionScanner implements ClassFileInclusionScanner {
private final Log log;
public SimpleInclusionScanner(long lastUpdateWithinMsecs, Log log) {
- this(lastUpdateWithinMsecs, Collections.singleton(DEFAULT_INCLUSION_PATTERN),
- Collections.singleton(DEFAULT_EXCLUSION_PATTERN), log);
+ this(
+ lastUpdateWithinMsecs,
+ Collections.singleton(DEFAULT_INCLUSION_PATTERN),
+ Collections.singleton(DEFAULT_EXCLUSION_PATTERN),
+ log);
}
- public SimpleInclusionScanner(long lastUpdateWithinMsecs, Set<String> sourceIncludes, Set<String> sourceExcludes,
- Log log) {
+ public SimpleInclusionScanner(
+ long lastUpdateWithinMsecs, Set<String> sourceIncludes, Set<String> sourceExcludes, Log log) {
this.lastUpdatedWithinMsecs = lastUpdateWithinMsecs;
this.sourceIncludes = new HashSet<>(sourceIncludes);
this.sourceExcludes = new HashSet<>(sourceExcludes);
@@ -56,7 +58,8 @@ public class SimpleInclusionScanner implements ClassFileInclusionScanner {
public Set<Path> getIncludedClassFiles(Path sourceDir, Path targetDir) {
final Set<Path> potentialSources = scanForSources(sourceDir, sourceIncludes, sourceExcludes);
- return potentialSources.stream().filter(source -> isLocationCacheStale(sourceDir, targetDir, source))
+ return potentialSources.stream()
+ .filter(source -> isLocationCacheStale(sourceDir, targetDir, source))
.collect(Collectors.toSet());
}
@@ -70,9 +73,7 @@ public class SimpleInclusionScanner implements ClassFileInclusionScanner {
scanner.setExcludes(sourceExcludes.toArray(EMPTY_ARRAY));
scanner.scan();
- return Stream.of(scanner.getIncludedFiles())
- .map(sourceDir::resolve)
- .collect(Collectors.toSet());
+ return Stream.of(scanner.getIncludedFiles()).map(sourceDir::resolve).collect(Collectors.toSet());
}
private boolean isLocationCacheStale(Path sourceDir, Path targetDir, Path source) {
@@ -90,5 +91,4 @@ public class SimpleInclusionScanner implements ClassFileInclusionScanner {
}
return false;
}
-
}
diff --git a/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/CloseShieldOutputStream.java b/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/CloseShieldOutputStream.java
index 68839ae..9ea09e2 100644
--- a/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/CloseShieldOutputStream.java
+++ b/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/CloseShieldOutputStream.java
@@ -16,14 +16,12 @@
*/
package org.apache.logging.log4j.maven.plugins.shade.transformer;
+import static org.apache.commons.io.output.ClosedOutputStream.CLOSED_OUTPUT_STREAM;
import java.io.IOException;
import java.io.OutputStream;
-
import org.apache.commons.io.output.ProxyOutputStream;
-import static org.apache.commons.io.output.ClosedOutputStream.CLOSED_OUTPUT_STREAM;
-
/**
* Suppress the close of underlying output stream.
*/
@@ -36,7 +34,6 @@ final class CloseShieldOutputStream extends ProxyOutputStream {
super(out);
}
-
@Override
public void close() throws IOException {
out.flush();
diff --git a/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java b/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java
index e9f17e3..945dea8 100644
--- a/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java
+++ b/log4j-transform-maven-shade-plugin-extensions/src/main/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java
@@ -16,6 +16,9 @@
*/
package org.apache.logging.log4j.maven.plugins.shade.transformer;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
@@ -32,21 +35,15 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-
import org.apache.logging.log4j.core.config.plugins.processor.PluginCache;
import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
import org.apache.maven.plugins.shade.relocation.Relocator;
import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
-import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
-
-import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE;
-
/**
* 'log4j-maven-shade-plugin' transformer implementation.
*/
-public class Log4j2PluginCacheFileTransformer
- implements ReproducibleResourceTransformer {
+public class Log4j2PluginCacheFileTransformer implements ReproducibleResourceTransformer {
/**
* Log4j config files to share across the transformation stages.
@@ -61,7 +58,6 @@ public class Log4j2PluginCacheFileTransformer
*/
private long youngestTime = 0;
-
/**
* Default constructor, initializing internal state.
*/
@@ -93,10 +89,9 @@ public class Log4j2PluginCacheFileTransformer
* @throws IOException thrown by file writing errors
*/
@Override
- public void processResource(final String resource,
- final InputStream resourceInput,
- final List<Relocator> relocators,
- final long time) throws IOException {
+ public void processResource(
+ final String resource, final InputStream resourceInput, final List<Relocator> relocators, final long time)
+ throws IOException {
final Path tempFile = Files.createTempFile("Log4j2Plugins", "dat");
Files.copy(resourceInput, tempFile, REPLACE_EXISTING);
tempFiles.add(tempFile);
@@ -115,7 +110,6 @@ public class Log4j2PluginCacheFileTransformer
return tempFiles.size() > 0;
}
-
/**
* Stores all previously collected log4j-cache-files to the target jar.
*
@@ -123,16 +117,14 @@ public class Log4j2PluginCacheFileTransformer
* @throws IOException When the IO blows up
*/
@Override
- public void modifyOutputStream(final JarOutputStream jos)
- throws IOException {
+ public void modifyOutputStream(final JarOutputStream jos) throws IOException {
try {
final PluginCache aggregator = new PluginCache();
aggregator.loadCacheFiles(getUrls());
relocatePlugin(tempRelocators, aggregator.getAllCategories());
putJarEntry(jos);
// prevent the aggregator to close the jar output
- final CloseShieldOutputStream outputStream =
- new CloseShieldOutputStream(jos);
+ final CloseShieldOutputStream outputStream = new CloseShieldOutputStream(jos);
aggregator.writeCache(outputStream);
} finally {
deleteTempFiles();
@@ -154,29 +146,25 @@ public class Log4j2PluginCacheFileTransformer
* @param relocators relocators.
* @param aggregatorCategories all categories of the aggregator
*/
- /* default */ void relocatePlugin(final List<Relocator> relocators,
- Map<String, Map<String, PluginEntry>> aggregatorCategories) {
- for (final Entry<String, Map<String, PluginEntry>> categoryEntry
- : aggregatorCategories.entrySet()) {
- for (final Entry<String, PluginEntry> pluginMapEntry
- : categoryEntry.getValue().entrySet()) {
+ /* default */ void relocatePlugin(
+ final List<Relocator> relocators, Map<String, Map<String, PluginEntry>> aggregatorCategories) {
+ for (final Entry<String, Map<String, PluginEntry>> categoryEntry : aggregatorCategories.entrySet()) {
+ for (final Entry<String, PluginEntry> pluginMapEntry :
+ categoryEntry.getValue().entrySet()) {
final PluginEntry pluginEntry = pluginMapEntry.getValue();
final String originalClassName = pluginEntry.getClassName();
- final Relocator matchingRelocator = findFirstMatchingRelocator(
- originalClassName, relocators);
+ final Relocator matchingRelocator = findFirstMatchingRelocator(originalClassName, relocators);
if (matchingRelocator != null) {
- final String newClassName = matchingRelocator
- .relocateClass(originalClassName);
+ final String newClassName = matchingRelocator.relocateClass(originalClassName);
pluginEntry.setClassName(newClassName);
}
}
}
}
- private Relocator findFirstMatchingRelocator(final String originalClassName,
- final List<Relocator> relocators) {
+ private Relocator findFirstMatchingRelocator(final String originalClassName, final List<Relocator> relocators) {
Relocator result = null;
for (final Relocator relocator : relocators) {
if (relocator.canRelocateClass(originalClassName)) {
diff --git a/log4j-transform-maven-shade-plugin-extensions/src/test/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformerTest.java b/log4j-transform-maven-shade-plugin-extensions/src/test/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformerTest.java
index 4e6455c..f27ab3f 100644
--- a/log4j-transform-maven-shade-plugin-extensions/src/test/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformerTest.java
+++ b/log4j-transform-maven-shade-plugin-extensions/src/test/java/org/apache/logging/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformerTest.java
@@ -16,6 +16,14 @@
*/
package org.apache.logging.log4j.maven.plugins.shade.transformer;
+import static java.util.Collections.enumeration;
+import static java.util.Collections.singletonList;
+import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -26,7 +34,6 @@ import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
-
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.core.config.plugins.processor.PluginCache;
import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
@@ -36,16 +43,6 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import static java.util.Collections.enumeration;
-import static java.util.Collections.singletonList;
-
-import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-
final class Log4j2PluginCacheFileTransformerTest {
private static URL pluginUrl;
@@ -55,7 +52,6 @@ final class Log4j2PluginCacheFileTransformerTest {
pluginUrl = Log4j2PluginCacheFileTransformerTest.class.getClassLoader().getResource(PLUGIN_CACHE_FILE);
}
-
@Test
public void testCanTransformResource() {
final Log4j2PluginCacheFileTransformer transformer = new Log4j2PluginCacheFileTransformer();
@@ -74,14 +70,15 @@ final class Log4j2PluginCacheFileTransformerTest {
assertFalse(transformer.hasTransformedResource());
long expectedYoungestResourceTime = 1605922127000L; // Sat Nov 21 2020 01:28:47
- try (InputStream log4jCacheFileInputStream = getClass().getClassLoader()
- .getResourceAsStream(PLUGIN_CACHE_FILE)) {
- transformer.processResource(PLUGIN_CACHE_FILE, log4jCacheFileInputStream, null, expectedYoungestResourceTime);
+ try (InputStream log4jCacheFileInputStream =
+ getClass().getClassLoader().getResourceAsStream(PLUGIN_CACHE_FILE)) {
+ transformer.processResource(
+ PLUGIN_CACHE_FILE, log4jCacheFileInputStream, null, expectedYoungestResourceTime);
}
assertTrue(transformer.hasTransformedResource());
- try (InputStream log4jCacheFileInputStream = getClass().getClassLoader()
- .getResourceAsStream(PLUGIN_CACHE_FILE)) {
+ try (InputStream log4jCacheFileInputStream =
+ getClass().getClassLoader().getResourceAsStream(PLUGIN_CACHE_FILE)) {
transformer.processResource(PLUGIN_CACHE_FILE, log4jCacheFileInputStream, null, 2000L);
}
assertTrue(transformer.hasTransformedResource());
@@ -92,18 +89,19 @@ final class Log4j2PluginCacheFileTransformerTest {
private void assertTransformedCacheFile(
@SuppressWarnings("SameParameterValue") Log4j2PluginCacheFileTransformer transformer,
@SuppressWarnings("SameParameterValue") long expectedTime,
- @SuppressWarnings("SameParameterValue") long expectedHash) throws IOException {
+ @SuppressWarnings("SameParameterValue") long expectedHash)
+ throws IOException {
final ByteArrayOutputStream jarBuff = new ByteArrayOutputStream();
- try(final JarOutputStream out = new JarOutputStream(jarBuff)) {
+ try (final JarOutputStream out = new JarOutputStream(jarBuff)) {
transformer.modifyOutputStream(out);
}
- try(JarInputStream in = new JarInputStream(new ByteArrayInputStream(jarBuff.toByteArray()))) {
- for (;;) {
+ try (JarInputStream in = new JarInputStream(new ByteArrayInputStream(jarBuff.toByteArray()))) {
+ for (; ; ) {
final JarEntry jarEntry = in.getNextJarEntry();
- if(jarEntry == null) {
+ if (jarEntry == null) {
fail("No expected resource in the output jar");
- } else if(jarEntry.getName().equals(PLUGIN_CACHE_FILE)) {
+ } else if (jarEntry.getName().equals(PLUGIN_CACHE_FILE)) {
assertEquals(expectedTime, jarEntry.getTime());
assertEquals(expectedHash, Arrays.hashCode(IOUtils.toByteArray(in)));
break;
@@ -112,7 +110,6 @@ final class Log4j2PluginCacheFileTransformerTest {
}
}
-
@Test
public void testRelocation() throws IOException {
// test with matching relocator
@@ -130,7 +127,8 @@ final class Log4j2PluginCacheFileTransformerTest {
transformer.relocatePlugin(singletonList(log4jRelocator), aggregator.getAllCategories());
- for (final Map<String, PluginEntry> pluginEntryMap : aggregator.getAllCategories().values()) {
+ for (final Map<String, PluginEntry> pluginEntryMap :
+ aggregator.getAllCategories().values()) {
for (final PluginEntry entry : pluginEntryMap.values()) {
assertTrue(entry.getClassName().startsWith(target));
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/Constants.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/Constants.java
index 50412a3..b46e906 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/Constants.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/Constants.java
@@ -35,18 +35,18 @@ public class Constants {
// Log4j2 types
public static final Type ENTRY_MESSAGE_TYPE = Type.getObjectType("org/apache/logging/log4j/message/EntryMessage");
public static final Type EXIT_MESSAGE_TYPE = Type.getObjectType("org/apache/logging/log4j/message/ExitMessage");
- public static final Type FLOW_MESSAGE_FACTORY_TYPE = Type
- .getObjectType("org/apache/logging/log4j/message/FlowMessageFactory");
+ public static final Type FLOW_MESSAGE_FACTORY_TYPE =
+ Type.getObjectType("org/apache/logging/log4j/message/FlowMessageFactory");
public static final Type LOG_BUILDER_TYPE = Type.getObjectType("org/apache/logging/log4j/LogBuilder");
public static final Type LEVEL_TYPE = Type.getObjectType("org/apache/logging/log4j/Level");
public static final Type LOGGER_TYPE = Type.getObjectType("org/apache/logging/log4j/Logger");
public static final Type LOGGING_SYSTEM_TYPE = Type.getObjectType("org/apache/logging/log4j/spi/LoggingSystem");
public static final Type MARKER_TYPE = Type.getObjectType("org/apache/logging/log4j/Marker");
public static final Type MESSAGE_TYPE = Type.getObjectType("org/apache/logging/log4j/message/Message");
- public static final Type MESSAGE_FACTORY_TYPE = Type
- .getObjectType("org/apache/logging/log4j/message/MessageFactory");
- public static final Type MESSAGE_SUPPLIER_TYPE = Type
- .getObjectType("org/apache/logging/log4j/util/MessageSupplier");
+ public static final Type MESSAGE_FACTORY_TYPE =
+ Type.getObjectType("org/apache/logging/log4j/message/MessageFactory");
+ public static final Type MESSAGE_SUPPLIER_TYPE =
+ Type.getObjectType("org/apache/logging/log4j/util/MessageSupplier");
public static final Type SUPPLIER_TYPE = Type.getObjectType("org/apache/logging/log4j/util/Supplier");
public static final Type SUPPLIER_ARRAY_TYPE = Type.getType("[" + SUPPLIER_TYPE.getDescriptor());
@@ -58,16 +58,16 @@ public class Constants {
public static final Method AT_INFO_METHOD = new Method("atInfo", NO_ARGS_DESC);
public static final Method AT_TRACE_METHOD = new Method("atTrace", NO_ARGS_DESC);
public static final Method AT_WARN_METHOD = new Method("atWarn", NO_ARGS_DESC);
- public static final Method AT_LEVEL_METHOD = new Method("atLevel",
- Type.getMethodDescriptor(LOG_BUILDER_TYPE, LEVEL_TYPE));
- public static final Method WITH_LOCATION_METHOD = new Method("withLocation",
- Type.getMethodDescriptor(LOG_BUILDER_TYPE, STACK_TRACE_ELEMENT_TYPE));
- public static final Method WITH_MARKER_METHOD = new Method("withMarker",
- Type.getMethodDescriptor(LOG_BUILDER_TYPE, MARKER_TYPE));
- public static final Method WITH_THROWABLE_METHOD = new Method("withThrowable",
- Type.getMethodDescriptor(LOG_BUILDER_TYPE, THROWABLE_TYPE));
- public static final Method LOG_AND_GET_METHOD = new Method("logAndGet",
- Type.getMethodDescriptor(MESSAGE_TYPE, SUPPLIER_TYPE));
+ public static final Method AT_LEVEL_METHOD =
+ new Method("atLevel", Type.getMethodDescriptor(LOG_BUILDER_TYPE, LEVEL_TYPE));
+ public static final Method WITH_LOCATION_METHOD =
+ new Method("withLocation", Type.getMethodDescriptor(LOG_BUILDER_TYPE, STACK_TRACE_ELEMENT_TYPE));
+ public static final Method WITH_MARKER_METHOD =
+ new Method("withMarker", Type.getMethodDescriptor(LOG_BUILDER_TYPE, MARKER_TYPE));
+ public static final Method WITH_THROWABLE_METHOD =
+ new Method("withThrowable", Type.getMethodDescriptor(LOG_BUILDER_TYPE, THROWABLE_TYPE));
+ public static final Method LOG_AND_GET_METHOD =
+ new Method("logAndGet", Type.getMethodDescriptor(MESSAGE_TYPE, SUPPLIER_TYPE));
private Constants() {
// prevent instantiation
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/ConversionException.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/ConversionException.java
index 75fbf55..359f752 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/ConversionException.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/ConversionException.java
@@ -26,5 +26,4 @@ public class ConversionException extends RuntimeException {
public ConversionException(String message) {
super(message);
}
-
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java
index c7215d7..8bf6d63 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java
@@ -16,13 +16,24 @@
*/
package org.apache.logging.log4j.weaver;
+import static org.apache.logging.log4j.weaver.Constants.ENTRY_MESSAGE_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.EXIT_MESSAGE_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.FLOW_MESSAGE_FACTORY_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.LOGGER_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.MESSAGE_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.OBJECT_ARRAY_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.OBJECT_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_ARRAY_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STRING_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.SUPPLIER_ARRAY_TYPE;
+
import java.nio.file.Path;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
-
import org.apache.commons.lang3.StringUtils;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
@@ -31,40 +42,28 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
-import static org.apache.logging.log4j.weaver.Constants.ENTRY_MESSAGE_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.EXIT_MESSAGE_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.FLOW_MESSAGE_FACTORY_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.LOGGER_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.MESSAGE_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.OBJECT_ARRAY_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.OBJECT_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_ARRAY_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STRING_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.SUPPLIER_ARRAY_TYPE;
-
public class LocationCacheGenerator {
private static final Type LAMBDA_UTIL_TYPE = Type.getObjectType("org/apache/logging/log4j/util/LambdaUtil");
- private static final Type STRING_FORMATTER_MESSAGE_FACTORY_TYPE = Type
- .getObjectType("org/apache/logging/log4j/message/StringFormatterMessageFactory");
+ private static final Type STRING_FORMATTER_MESSAGE_FACTORY_TYPE =
+ Type.getObjectType("org/apache/logging/log4j/message/StringFormatterMessageFactory");
private static final String LOCATION_FIELD = "locations";
private final Map<String, LocationCacheContents> locationCacheClasses = new ConcurrentHashMap<>();
- public LocationCacheValue addLocation(final String internalClassName, final String methodName,
- final String fileName, final int lineNumber) {
+ public LocationCacheValue addLocation(
+ final String internalClassName, final String methodName, final String fileName, final int lineNumber) {
final String cacheClassName = getCacheClassName(internalClassName);
- final LocationCacheContents contents = locationCacheClasses.computeIfAbsent(cacheClassName,
- k -> new LocationCacheContents());
+ final LocationCacheContents contents =
+ locationCacheClasses.computeIfAbsent(cacheClassName, k -> new LocationCacheContents());
final int index = contents.addLocation(internalClassName, methodName, fileName, lineNumber);
return new LocationCacheValue(cacheClassName, LOCATION_FIELD, index);
}
public Handle createLambda(String internalClassName, SupplierLambdaType type) {
final String cacheClassName = getCacheClassName(internalClassName);
- final LocationCacheContents contents = locationCacheClasses.computeIfAbsent(cacheClassName,
- k -> new LocationCacheContents());
+ final LocationCacheContents contents =
+ locationCacheClasses.computeIfAbsent(cacheClassName, k -> new LocationCacheContents());
contents.addLambda(type);
final String methodName = type.name().toLowerCase(Locale.US);
final String methodDescriptor = Type.getMethodDescriptor(MESSAGE_TYPE, type.getArgumentTypes());
@@ -85,8 +84,7 @@ public class LocationCacheGenerator {
}
public Map<String, byte[]> generateClasses() {
- return locationCacheClasses.entrySet()
- .parallelStream()
+ return locationCacheClasses.entrySet().parallelStream()
.collect(Collectors.toMap(Entry::getKey, e -> generateCacheClass(e.getKey(), e.getValue())));
}
@@ -99,8 +97,12 @@ public class LocationCacheGenerator {
// We add lambdas to this class
final Set<SupplierLambdaType> lambdas = contents.getLambdas();
for (final SupplierLambdaType type : lambdas) {
- final InstructionAdapter mv = new InstructionAdapter(cv.visitMethod(Opcodes.ACC_STATIC,
- type.name().toLowerCase(Locale.US), type.getImplementationMethodDescriptor(), null, null));
+ final InstructionAdapter mv = new InstructionAdapter(cv.visitMethod(
+ Opcodes.ACC_STATIC,
+ type.name().toLowerCase(Locale.US),
+ type.getImplementationMethodDescriptor(),
+ null,
+ null));
switch (type) {
case FORMATTED_MESSAGE:
writeFormattedMessage(mv);
@@ -125,12 +127,12 @@ public class LocationCacheGenerator {
return cv.toByteArray();
}
- private static void writeLocations(final String innerClassName, final ClassVisitor cv,
- final List<StackTraceElement> locations) {
+ private static void writeLocations(
+ final String innerClassName, final ClassVisitor cv, final List<StackTraceElement> locations) {
cv.visitField(Opcodes.ACC_STATIC, LOCATION_FIELD, STACK_TRACE_ELEMENT_ARRAY_TYPE.getInternalName(), null, null)
.visitEnd();
- final InstructionAdapter mv = new InstructionAdapter(
- cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null));
+ final InstructionAdapter mv =
+ new InstructionAdapter(cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null));
mv.visitCode();
mv.visitMaxs(9, 0);
mv.iconst(locations.size());
@@ -145,7 +147,9 @@ public class LocationCacheGenerator {
mv.aconst(location.getMethodName());
mv.aconst(location.getFileName());
mv.iconst(location.getLineNumber());
- mv.invokespecial(STACK_TRACE_ELEMENT_TYPE.getInternalName(), "<init>",
+ mv.invokespecial(
+ STACK_TRACE_ELEMENT_TYPE.getInternalName(),
+ "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, STRING_TYPE, STRING_TYPE, STRING_TYPE, Type.INT_TYPE),
false);
mv.visitInsn(Opcodes.AASTORE);
@@ -158,12 +162,17 @@ public class LocationCacheGenerator {
private static void writeFormattedMessage(final InstructionAdapter mv) {
mv.visitCode();
mv.visitMaxs(3, 2);
- mv.getstatic(STRING_FORMATTER_MESSAGE_FACTORY_TYPE.getInternalName(), "INSTANCE",
+ mv.getstatic(
+ STRING_FORMATTER_MESSAGE_FACTORY_TYPE.getInternalName(),
+ "INSTANCE",
STRING_FORMATTER_MESSAGE_FACTORY_TYPE.getDescriptor());
mv.load(0, STRING_TYPE);
mv.load(1, OBJECT_ARRAY_TYPE);
- mv.invokevirtual(STRING_FORMATTER_MESSAGE_FACTORY_TYPE.getInternalName(), "newMessage",
- Type.getMethodType(MESSAGE_TYPE, STRING_TYPE, OBJECT_ARRAY_TYPE).getDescriptor(), false);
+ mv.invokevirtual(
+ STRING_FORMATTER_MESSAGE_FACTORY_TYPE.getInternalName(),
+ "newMessage",
+ Type.getMethodType(MESSAGE_TYPE, STRING_TYPE, OBJECT_ARRAY_TYPE).getDescriptor(),
+ false);
mv.areturn(MESSAGE_TYPE);
mv.visitEnd();
}
@@ -173,15 +182,20 @@ public class LocationCacheGenerator {
mv.visitCode();
mv.visitMaxs(args.length, args.length);
mv.load(0, LOGGER_TYPE);
- mv.invokeinterface(LOGGER_TYPE.getInternalName(), "getFlowMessageFactory",
+ mv.invokeinterface(
+ LOGGER_TYPE.getInternalName(),
+ "getFlowMessageFactory",
Type.getMethodDescriptor(FLOW_MESSAGE_FACTORY_TYPE));
for (int i = 1; i < args.length; i++) {
mv.load(i, args[i]);
}
final boolean isEntry = type.name().startsWith("ENTRY");
final String methodName = isEntry ? "newEntryMessage" : "newExitMessage";
- mv.invokeinterface(FLOW_MESSAGE_FACTORY_TYPE.getInternalName(), methodName, Type.getMethodDescriptor(
- isEntry ? ENTRY_MESSAGE_TYPE : EXIT_MESSAGE_TYPE, Arrays.copyOfRange(args, 1, args.length)));
+ mv.invokeinterface(
+ FLOW_MESSAGE_FACTORY_TYPE.getInternalName(),
+ methodName,
+ Type.getMethodDescriptor(
+ isEntry ? ENTRY_MESSAGE_TYPE : EXIT_MESSAGE_TYPE, Arrays.copyOfRange(args, 1, args.length)));
mv.areturn(MESSAGE_TYPE);
mv.visitEnd();
}
@@ -190,13 +204,20 @@ public class LocationCacheGenerator {
mv.visitCode();
mv.visitMaxs(3, 3);
mv.load(0, LOGGER_TYPE);
- mv.invokeinterface(LOGGER_TYPE.getInternalName(), "getFlowMessageFactory",
+ mv.invokeinterface(
+ LOGGER_TYPE.getInternalName(),
+ "getFlowMessageFactory",
Type.getMethodDescriptor(FLOW_MESSAGE_FACTORY_TYPE));
mv.load(1, STRING_TYPE);
mv.load(2, SUPPLIER_ARRAY_TYPE);
- mv.invokestatic(LAMBDA_UTIL_TYPE.getInternalName(), "getAll",
- Type.getMethodDescriptor(OBJECT_ARRAY_TYPE, SUPPLIER_ARRAY_TYPE), false);
- mv.invokeinterface(FLOW_MESSAGE_FACTORY_TYPE.getInternalName(), "newEntryMessage",
+ mv.invokestatic(
+ LAMBDA_UTIL_TYPE.getInternalName(),
+ "getAll",
+ Type.getMethodDescriptor(OBJECT_ARRAY_TYPE, SUPPLIER_ARRAY_TYPE),
+ false);
+ mv.invokeinterface(
+ FLOW_MESSAGE_FACTORY_TYPE.getInternalName(),
+ "newEntryMessage",
Type.getMethodDescriptor(ENTRY_MESSAGE_TYPE, STRING_TYPE, OBJECT_ARRAY_TYPE));
mv.areturn(MESSAGE_TYPE);
mv.visitEnd();
@@ -211,8 +232,9 @@ public class LocationCacheGenerator {
if (fileName == null) {
throw new IllegalArgumentException("The 'classFile' parameter is an empty path.");
}
- final String cacheFileName = LocationCacheGenerator
- .getCacheClassName(StringUtils.removeEnd(fileName.toString(), ".class")) + ".class";
+ final String cacheFileName =
+ LocationCacheGenerator.getCacheClassName(StringUtils.removeEnd(fileName.toString(), ".class"))
+ + ".class";
return classFile.resolveSibling(cacheFileName);
}
@@ -253,10 +275,10 @@ public class LocationCacheGenerator {
private final List<StackTraceElement> locations = new CopyOnWriteArrayList<>();
private Set<SupplierLambdaType> lambdas = EnumSet.noneOf(SupplierLambdaType.class);
- public int addLocation(final String internalClassName, final String methodName, final String fileName,
- final int lineNumber) {
- final StackTraceElement location = new StackTraceElement(internalClassName.replaceAll("/", "."), methodName,
- fileName, lineNumber);
+ public int addLocation(
+ final String internalClassName, final String methodName, final String fileName, final int lineNumber) {
+ final StackTraceElement location =
+ new StackTraceElement(internalClassName.replaceAll("/", "."), methodName, fileName, lineNumber);
locations.add(location);
return locations.indexOf(location);
}
@@ -273,5 +295,4 @@ public class LocationCacheGenerator {
return lambdas;
}
}
-
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassConverter.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassConverter.java
index d1f50d8..c2f6c0c 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassConverter.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassConverter.java
@@ -16,11 +16,10 @@
*/
package org.apache.logging.log4j.weaver;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.logging.log4j.weaver.log4j2.LogBuilderConversionHandler;
import org.apache.logging.log4j.weaver.log4j2.LoggerConversionHandler;
import org.objectweb.asm.ClassReader;
@@ -69,6 +68,5 @@ public class LocationClassConverter {
protected ClassLoader getClassLoader() {
return classpath;
}
-
}
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassVisitor.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassVisitor.java
index c04488c..1caa2de 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassVisitor.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationClassVisitor.java
@@ -16,10 +16,11 @@
*/
package org.apache.logging.log4j.weaver;
+import static org.apache.logging.log4j.weaver.Constants.*;
+
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.logging.log4j.weaver.LocationCacheGenerator.LocationCacheValue;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Handle;
@@ -27,8 +28,6 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import static org.apache.logging.log4j.weaver.Constants.*;
-
public class LocationClassVisitor extends ClassVisitor {
private final LocationCacheGenerator locationCache;
@@ -57,13 +56,13 @@ public class LocationClassVisitor extends ClassVisitor {
}
@Override
- public MethodVisitor visitMethod(int access, String name, String descriptor, String signature,
- String[] exceptions) {
+ public MethodVisitor visitMethod(
+ int access, String name, String descriptor, String signature, String[] exceptions) {
this.methodName = name;
final MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
return mv != null
- ? new LocationMethodVisitor(this, Collections.unmodifiableMap(conversionHandlers), mv, access, name,
- descriptor)
+ ? new LocationMethodVisitor(
+ this, Collections.unmodifiableMap(conversionHandlers), mv, access, name, descriptor)
: null;
}
@@ -78,8 +77,12 @@ public class LocationClassVisitor extends ClassVisitor {
public Handle createLambda(SupplierLambdaType type) {
switch (type) {
case MESSAGE_SUPPLIER:
- return new Handle(Opcodes.H_INVOKEINTERFACE, MESSAGE_SUPPLIER_TYPE.getInternalName(), "get",
- Type.getMethodDescriptor(MESSAGE_TYPE), true);
+ return new Handle(
+ Opcodes.H_INVOKEINTERFACE,
+ MESSAGE_SUPPLIER_TYPE.getInternalName(),
+ "get",
+ Type.getMethodDescriptor(MESSAGE_TYPE),
+ true);
default:
return locationCache.createLambda(declaringClass, type);
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationMethodVisitor.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationMethodVisitor.java
index df83a4c..f16cb96 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationMethodVisitor.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationMethodVisitor.java
@@ -16,14 +16,21 @@
*/
package org.apache.logging.log4j.weaver;
+import static org.apache.logging.log4j.weaver.Constants.LOG_BUILDER_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.MESSAGE_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.OBJECT_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_ARRAY_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.STRING_TYPE;
+import static org.apache.logging.log4j.weaver.Constants.WITH_LOCATION_METHOD;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.lang.invoke.CallSite;
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Map;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.logging.log4j.weaver.LocationCacheGenerator.LocationCacheValue;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
@@ -32,14 +39,6 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
-import static org.apache.logging.log4j.weaver.Constants.LOG_BUILDER_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.MESSAGE_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.OBJECT_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_ARRAY_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STACK_TRACE_ELEMENT_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.STRING_TYPE;
-import static org.apache.logging.log4j.weaver.Constants.WITH_LOCATION_METHOD;
-
public class LocationMethodVisitor extends GeneratorAdapter {
// Programmatically define LAMBDA_METAFACTORY_HANDLE
@@ -48,11 +47,20 @@ public class LocationMethodVisitor extends GeneratorAdapter {
private static final Type LAMBDA_METAFACTORY_TYPE = Type.getType(LambdaMetafactory.class);
private static final Type METHOD_HANDLE_TYPE = Type.getType(MethodHandle.class);
private static final Type METHOD_TYPE_TYPE = Type.getType(MethodType.class);
- private static final String LAMBDA_METAFACTORY_DESC = Type.getMethodDescriptor(Type.getType(CallSite.class),
- Type.getType(MethodHandles.Lookup.class), STRING_TYPE, METHOD_TYPE_TYPE, METHOD_TYPE_TYPE,
- METHOD_HANDLE_TYPE, METHOD_TYPE_TYPE);
- private static final Handle LAMBDA_METAFACTORY_HANDLE = new Handle(Opcodes.H_INVOKESTATIC,
- LAMBDA_METAFACTORY_TYPE.getInternalName(), "metafactory", LAMBDA_METAFACTORY_DESC, false);
+ private static final String LAMBDA_METAFACTORY_DESC = Type.getMethodDescriptor(
+ Type.getType(CallSite.class),
+ Type.getType(MethodHandles.Lookup.class),
+ STRING_TYPE,
+ METHOD_TYPE_TYPE,
+ METHOD_TYPE_TYPE,
+ METHOD_HANDLE_TYPE,
+ METHOD_TYPE_TYPE);
+ private static final Handle LAMBDA_METAFACTORY_HANDLE = new Handle(
+ Opcodes.H_INVOKESTATIC,
+ LAMBDA_METAFACTORY_TYPE.getInternalName(),
+ "metafactory",
+ LAMBDA_METAFACTORY_DESC,
+ false);
private final LocationClassVisitor locationClassVisitor;
private final Map<String, ClassConversionHandler> handlers;
@@ -66,9 +74,13 @@ public class LocationMethodVisitor extends GeneratorAdapter {
private int lineNumber;
private Label currentLabel;
- protected LocationMethodVisitor(final LocationClassVisitor locationClassVisitor,
- final Map<String, ClassConversionHandler> handlers, final MethodVisitor mv, final int access,
- final String name, final String descriptor) {
+ protected LocationMethodVisitor(
+ final LocationClassVisitor locationClassVisitor,
+ final Map<String, ClassConversionHandler> handlers,
+ final MethodVisitor mv,
+ final int access,
+ final String name,
+ final String descriptor) {
super(Opcodes.ASM9, mv, access, name, descriptor);
this.locationClassVisitor = locationClassVisitor;
this.handlers = handlers;
@@ -117,8 +129,8 @@ public class LocationMethodVisitor extends GeneratorAdapter {
if (label != null) {
// the generator adapter uses different variable indexes
// so we use 'mv' directly
- mv.visitLocalVariable("log4j2$$p" + i, OBJECT_TYPE.getDescriptor(), null, label, currentLabel,
- localVariables[i]);
+ mv.visitLocalVariable(
+ "log4j2$$p" + i, OBJECT_TYPE.getDescriptor(), null, label, currentLabel, localVariables[i]);
}
}
super.visitEnd();
@@ -141,7 +153,8 @@ public class LocationMethodVisitor extends GeneratorAdapter {
}
public void invokeSupplierLambda(SupplierLambdaType type) {
- invokeDynamic("get",
+ invokeDynamic(
+ "get",
type.getInvokedMethodDescriptor(),
LAMBDA_METAFACTORY_HANDLE,
SUPPLIER_OF_OBJECT_TYPE,
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/SupplierLambdaType.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/SupplierLambdaType.java
index f806f70..6a878e2 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/SupplierLambdaType.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/SupplierLambdaType.java
@@ -16,8 +16,6 @@
*/
package org.apache.logging.log4j.weaver;
-import org.objectweb.asm.Type;
-
import static org.apache.logging.log4j.weaver.Constants.ENTRY_MESSAGE_TYPE;
import static org.apache.logging.log4j.weaver.Constants.LOGGER_TYPE;
import static org.apache.logging.log4j.weaver.Constants.MESSAGE_SUPPLIER_TYPE;
@@ -28,6 +26,8 @@ import static org.apache.logging.log4j.weaver.Constants.STRING_TYPE;
import static org.apache.logging.log4j.weaver.Constants.SUPPLIER_ARRAY_TYPE;
import static org.apache.logging.log4j.weaver.Constants.SUPPLIER_TYPE;
+import org.objectweb.asm.Type;
+
/**
* An enumeration of {@code org.apache.logging.log4j.util.Supplier<Message>} lambdas, named after the type of message and parameter types.
*
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandler.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandler.java
index 5d810b6..05c14b6 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandler.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandler.java
@@ -16,13 +16,13 @@
*/
package org.apache.logging.log4j.weaver.log4j2;
+import static org.apache.logging.log4j.weaver.Constants.LOG_BUILDER_TYPE;
+
import org.apache.logging.log4j.weaver.ClassConversionHandler;
import org.apache.logging.log4j.weaver.LocationMethodVisitor;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.Method;
-import static org.apache.logging.log4j.weaver.Constants.LOG_BUILDER_TYPE;
-
public class LogBuilderConversionHandler implements ClassConversionHandler {
@Override
@@ -32,10 +32,10 @@ public class LogBuilderConversionHandler implements ClassConversionHandler {
@Override
public void handleMethodInstruction(LocationMethodVisitor mv, String name, String descriptor) {
- if ("withLocation".equals(name) && Type.getMethodDescriptor(LOG_BUILDER_TYPE).equals(descriptor)) {
+ if ("withLocation".equals(name)
+ && Type.getMethodDescriptor(LOG_BUILDER_TYPE).equals(descriptor)) {
return;
}
mv.invokeInterface(LOG_BUILDER_TYPE, new Method(name, descriptor));
}
-
}
diff --git a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandler.java b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandler.java
index 3774e37..0587874 100644
--- a/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandler.java
+++ b/log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandler.java
@@ -16,16 +16,6 @@
*/
package org.apache.logging.log4j.weaver.log4j2;
-import java.util.Arrays;
-
-import org.apache.logging.log4j.weaver.ClassConversionHandler;
-import org.apache.logging.log4j.weaver.Constants;
-import org.apache.logging.log4j.weaver.ConversionException;
-import org.apache.logging.log4j.weaver.LocationMethodVisitor;
-import org.apache.logging.log4j.weaver.SupplierLambdaType;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.Method;
-
import static org.apache.logging.log4j.weaver.Constants.AT_DEBUG_METHOD;
import static org.apache.logging.log4j.weaver.Constants.AT_ERROR_METHOD;
import static org.apache.logging.log4j.weaver.Constants.AT_FATAL_METHOD;
@@ -49,6 +39,15 @@ import static org.apache.logging.log4j.weaver.Constants.THROWABLE_TYPE;
import static org.apache.logging.log4j.weaver.Constants.WITH_MARKER_METHOD;
import static org.apache.logging.log4j.weaver.Constants.WITH_THROWABLE_METHOD;
+import java.util.Arrays;
+import org.apache.logging.log4j.weaver.ClassConversionHandler;
+import org.apache.logging.log4j.weaver.Constants;
+import org.apache.logging.log4j.weaver.ConversionException;
+import org.apache.logging.log4j.weaver.LocationMethodVisitor;
+import org.apache.logging.log4j.weaver.SupplierLambdaType;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.Method;
+
public class LoggerConversionHandler implements ClassConversionHandler {
private static final String CATCHING = "Catching";
@@ -58,15 +57,15 @@ public class LoggerConversionHandler implements ClassConversionHandler {
private static final String THROWING = "Throwing";
private static final String THROWING_MARKER = "THROWING_MARKER";
// Argument list of `LogBuilder.log(String, Supplier...)`
- private static final Type[] LOG_BUILDER_LOG_STRING_SUPPLIER = new Type[] { STRING_TYPE, SUPPLIER_ARRAY_TYPE };
+ private static final Type[] LOG_BUILDER_LOG_STRING_SUPPLIER = new Type[] {STRING_TYPE, SUPPLIER_ARRAY_TYPE};
// Argument list of `LogBuilder.log(Supplier<Message>)`
- private static final Type[] LOG_BUILDER_LOG_SUPPLIER_MESSAGE = new Type[] { SUPPLIER_TYPE };
- private static final Method LOG_BUILDER_LOG_SUPPLIER_METHOD = new Method("log",
- Type.getMethodDescriptor(Type.VOID_TYPE, LOG_BUILDER_LOG_SUPPLIER_MESSAGE));
- private static final Method LOG_BUILDER_LOG_STRING_METHOD = new Method("log",
- Type.getMethodDescriptor(Type.VOID_TYPE, STRING_TYPE));
+ private static final Type[] LOG_BUILDER_LOG_SUPPLIER_MESSAGE = new Type[] {SUPPLIER_TYPE};
+ private static final Method LOG_BUILDER_LOG_SUPPLIER_METHOD =
+ new Method("log", Type.getMethodDescriptor(Type.VOID_TYPE, LOG_BUILDER_LOG_SUPPLIER_MESSAGE));
+ private static final Method LOG_BUILDER_LOG_STRING_METHOD =
+ new Method("log", Type.getMethodDescriptor(Type.VOID_TYPE, STRING_TYPE));
private static final Type ABSTRACT_LOGGER_TYPE = Type.getObjectType("org/apache/logging/log4j/spi/AbstractLogger");
- private static final Type[] MESSAGE_OBJECT_ARRAY = { MESSAGE_TYPE, OBJECT_TYPE };
+ private static final Type[] MESSAGE_OBJECT_ARRAY = {MESSAGE_TYPE, OBJECT_TYPE};
@Override
public String getOwner() {
@@ -284,8 +283,10 @@ public class LoggerConversionHandler implements ClassConversionHandler {
mv.loadLocal(vars[i]);
}
final boolean usesSuppliers = types[types.length - 1].equals(SUPPLIER_ARRAY_TYPE);
- mv.invokeSupplierLambda(usesSuppliers ? SupplierLambdaType.ENTRY_MESSAGE_STRING_SUPPLIERS
- : SupplierLambdaType.ENTRY_MESSAGE_STRING_OBJECTS);
+ mv.invokeSupplierLambda(
+ usesSuppliers
+ ? SupplierLambdaType.ENTRY_MESSAGE_STRING_SUPPLIERS
+ : SupplierLambdaType.ENTRY_MESSAGE_STRING_OBJECTS);
}
mv.invokeInterface(LOG_BUILDER_TYPE, LOG_AND_GET_METHOD);
}
@@ -321,8 +322,10 @@ public class LoggerConversionHandler implements ClassConversionHandler {
mv.loadLocal(vars[1]);
}
mv.loadLocal(vars[0]);
- mv.invokeSupplierLambda(hasResult ? SupplierLambdaType.EXIT_MESSAGE_OBJECT_ENTRY_MESSAGE
- : SupplierLambdaType.EXIT_MESSAGE_ENTRY_MESSAGE);
+ mv.invokeSupplierLambda(
+ hasResult
+ ? SupplierLambdaType.EXIT_MESSAGE_OBJECT_ENTRY_MESSAGE
+ : SupplierLambdaType.EXIT_MESSAGE_ENTRY_MESSAGE);
} else {
final boolean hasFormat = STRING_TYPE.equals(types[0]);
if (hasFormat) {
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/AbstractConversionHandlerTest.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/AbstractConversionHandlerTest.java
index 1dbde3b..0f67926 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/AbstractConversionHandlerTest.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/AbstractConversionHandlerTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.logging.log4j.weaver;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
import java.io.ByteArrayOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -23,8 +25,6 @@ import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-
public class AbstractConversionHandlerTest {
protected static Class<?> convertedClass;
@@ -34,22 +34,26 @@ public class AbstractConversionHandlerTest {
final TestClassLoader testCl = new TestClassLoader();
final ByteArrayOutputStream dest = new ByteArrayOutputStream();
- final LocationClassConverter converter = new LocationClassConverter(AbstractConversionHandlerTest.class.getClassLoader());
+ final LocationClassConverter converter =
+ new LocationClassConverter(AbstractConversionHandlerTest.class.getClassLoader());
final LocationCacheGenerator locationCache = new LocationCacheGenerator();
- getNestedClasses(internalName).forEach(classFile -> assertDoesNotThrow(() -> {
- dest.reset();
- converter.convert(Files.newInputStream(classFile), dest, locationCache);
- testCl.defineClass(dest.toByteArray());
- }));
+ getNestedClasses(internalName)
+ .forEach(classFile -> assertDoesNotThrow(() -> {
+ dest.reset();
+ converter.convert(Files.newInputStream(classFile), dest, locationCache);
+ testCl.defineClass(dest.toByteArray());
+ }));
locationCache.generateClasses().values().forEach(testCl::defineClass);
convertedClass = testCl.loadClass(internalName.replaceAll("/", "."));
testObject = assertDoesNotThrow(() -> convertedClass.getConstructor().newInstance());
}
private static Stream<Path> getNestedClasses(String internalName) throws Exception {
- final Path topClass = Paths
- .get(AbstractConversionHandlerTest.class.getClassLoader().getResource(internalName + ".class").toURI());
+ final Path topClass = Paths.get(AbstractConversionHandlerTest.class
+ .getClassLoader()
+ .getResource(internalName + ".class")
+ .toURI());
final String simpleClassName = Paths.get(internalName).getFileName().toString();
try (Stream<Path> paths = Files.walk(topClass.getParent(), 1)) {
return paths
@@ -62,7 +66,6 @@ public class AbstractConversionHandlerTest {
.collect(Collectors.toList())
.stream();
}
-
}
private static class TestClassLoader extends ClassLoader {
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/NoLoggingTest.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/NoLoggingTest.java
index 2e321ed..a5573b0 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/NoLoggingTest.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/NoLoggingTest.java
@@ -16,13 +16,12 @@
*/
package org.apache.logging.log4j.weaver;
-import java.lang.reflect.Method;
+import static org.assertj.core.api.Assertions.assertThat;
+import java.lang.reflect.Method;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import static org.assertj.core.api.Assertions.assertThat;
-
/**
* Test a class that needs no conversion at all.
*/
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerExample.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerExample.java
index c4c5b14..3cd10c8 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerExample.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerExample.java
@@ -16,13 +16,12 @@
*/
package org.apache.logging.log4j.weaver.log4j2;
+import static org.assertj.core.api.Assertions.assertThat;
+
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-
import org.apache.logging.log4j.LogBuilder;
-import static org.assertj.core.api.Assertions.assertThat;
-
public class LogBuilderConversionHandlerExample {
public void testWithLocation() {
@@ -36,10 +35,11 @@ public class LogBuilderConversionHandlerExample {
assertThat(called).isFalse();
final StackTraceElement stackTraceElement = new StackTraceElement(
- LogBuilderConversionHandlerExample.class.getName(), "specialMethod",
- "LogBuilderConversionHandlerExample.java", 1024);
+ LogBuilderConversionHandlerExample.class.getName(),
+ "specialMethod",
+ "LogBuilderConversionHandlerExample.java",
+ 1024);
logBuilder.withLocation(stackTraceElement).log();
assertThat(locationRef).hasValue(stackTraceElement);
}
-
}
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerTest.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerTest.java
index 38bd2a1..73f33ec 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerTest.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderConversionHandlerTest.java
@@ -31,5 +31,4 @@ public class LogBuilderConversionHandlerTest extends AbstractConversionHandlerTe
public void testWithLocation() throws Exception {
convertedClass.getMethod("testWithLocation").invoke(testObject);
}
-
}
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderMock.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderMock.java
index bbd7487..d62a5ce 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderMock.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LogBuilderMock.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.weaver.log4j2;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-
import org.apache.logging.log4j.LogBuilder;
public final class LogBuilderMock implements LogBuilder {
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerExample.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerExample.java
index 812d97c..a0b0148 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerExample.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerExample.java
@@ -16,8 +16,10 @@
*/
package org.apache.logging.log4j.weaver.log4j2;
-import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import java.util.List;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -33,9 +35,6 @@ import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.util.Supplier;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-
public class LoggerConversionHandlerExample {
private static final CharSequence CHAR_SEQUENCE = "(CharSequence)";
@@ -53,9 +52,12 @@ public class LoggerConversionHandlerExample {
private static final Object P7 = "(p7)";
private static final Object P8 = "(p8)";
private static final Object P9 = "(p9)";
- private static final Object[] PARRAY = { "(...)" };
- private static final Supplier<?>[] SUPPLIERS = { () -> OBJECT };
- @SuppressWarnings("StaticAssignmentOfThrowable") private static final Throwable THROWABLE = new RuntimeException();
+ private static final Object[] PARRAY = {"(...)"};
+ private static final Supplier<?>[] SUPPLIERS = {() -> OBJECT};
+
+ @SuppressWarnings("StaticAssignmentOfThrowable")
+ private static final Throwable THROWABLE = new RuntimeException();
+
private static final Marker MARKER = MarkerManager.getMarker("MARKER");
private static final Logger logger = LogManager.getLogger();
@@ -925,8 +927,8 @@ public class LoggerConversionHandlerExample {
assertThat(event.getMessage().getFormattedMessage()).isEqualTo("Exit (Message): (Object)");
}
- private static LogEvent assertLocationEquals(final String methodName, final int lineNumber,
- final ListAppender app) {
+ private static LogEvent assertLocationEquals(
+ final String methodName, final int lineNumber, final ListAppender app) {
final List<LogEvent> events = app.getEvents();
assertThat(events).hasSize(1);
final LogEvent event = events.get(0);
diff --git a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerTest.java b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerTest.java
index 3c76499..120f79c 100644
--- a/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerTest.java
+++ b/log4j-weaver/src/test/java/org/apache/logging/log4j/weaver/log4j2/LoggerConversionHandlerTest.java
@@ -17,7 +17,6 @@
package org.apache.logging.log4j.weaver.log4j2;
import java.util.stream.Stream;
-
import org.apache.logging.log4j.core.test.appender.ListAppender;
import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
import org.apache.logging.log4j.core.test.junit.Named;
@@ -43,8 +42,19 @@ public class LoggerConversionHandlerTest extends AbstractConversionHandlerTest {
}
static Stream<String> testLocationConverter() {
- return Stream.of("testFatal", "testError", "testWarn", "testInfo", "testDebug", "testLog", "testFrames",
- "testPrintf", "testLogBuilder", "testPassthrough", "testCatchingThrowing", "testTraceEntry",
+ return Stream.of(
+ "testFatal",
+ "testError",
+ "testWarn",
+ "testInfo",
+ "testDebug",
+ "testLog",
+ "testFrames",
+ "testPrintf",
+ "testLogBuilder",
+ "testPassthrough",
+ "testCatchingThrowing",
+ "testTraceEntry",
"testTraceExit");
}
@@ -53,5 +63,4 @@ public class LoggerConversionHandlerTest extends AbstractConversionHandlerTest {
public void testLocationConverter(final String methodName) throws Exception {
convertedClass.getMethod(methodName, ListAppender.class).invoke(testObject, appender);
}
-
}