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 0949bf6 Add project's classpath to class writer
0949bf6 is described below
commit 0949bf6c5469c77ad3bca3260890657d7eabddbb
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Sat Feb 25 18:59:57 2023 +0100
Add project's classpath to class writer
ASM's class writer requires a class loader to resolve parent classes
and implemented interfaces in the woven code.
---
.../log4j/transform/maven/LocationMojo.java | 21 ++++++++++++++-
.../log4j/weaver/LocationClassConverter.java | 30 +++++++++++++++++++++-
.../weaver/AbstractConversionHandlerTest.java | 2 +-
3 files changed, 50 insertions(+), 3 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 e4358e4..1539782 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
@@ -20,8 +20,12 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -54,6 +58,7 @@ public class LocationMojo extends AbstractMojo {
private static final String LOG4J_GROUP_ID = "org.apache.logging.log4j";
private static final String LOG4J_API_ARTIFACT_ID = "log4j-api";
private static final ArtifactVersion MIN_SUPPORTED_VERSION = new
DefaultArtifactVersion("2.20.0");
+ private static final URL[] EMPTY_URL_ARRAY = new URL[0];
/**
* The Maven project.
@@ -87,7 +92,7 @@ public class LocationMojo extends AbstractMojo {
final Path sourceDirectory = this.sourceDirectory.toPath();
final Path outputDirectory = this.outputDirectory.toPath();
final LocationCacheGenerator locationCache = new
LocationCacheGenerator();
- final LocationClassConverter converter = new LocationClassConverter();
+ final LocationClassConverter converter = new
LocationClassConverter(getProjectDependencies());
try {
final Set<Path> staleClassFiles =
getClassFileInclusionScanner().getIncludedClassFiles(sourceDirectory,
@@ -173,4 +178,18 @@ public class LocationMojo extends AbstractMojo {
throw new MojoExecutionException("Can not determine `log4j-api`
version.", e);
}
}
+
+ private ClassLoader getProjectDependencies() throws MojoExecutionException
{
+ Set<Artifact> artifacts = project.getArtifacts();
+ List<URL> urls = new ArrayList<>(artifacts.size() + 1);
+ try {
+ urls.add(sourceDirectory.toURI().toURL());
+ for (Artifact artifact : artifacts) {
+ urls.add(artifact.getFile().toURI().toURL());
+ }
+ } catch (MalformedURLException e) {
+ throw new MojoExecutionException(e);
+ }
+ return new URLClassLoader(urls.toArray(EMPTY_URL_ARRAY));
+ }
}
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 52a3377..99e4daa 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
@@ -23,11 +23,22 @@ import java.io.OutputStream;
import org.apache.logging.log4j.weaver.log4j2.LogBuilderConversionHandler;
import org.apache.logging.log4j.weaver.log4j2.LoggerConversionHandler;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
public class LocationClassConverter {
+ /**
+ * Classloader to resolve a class hierarchy.
+ */
+ private final ClassLoader classpath;
+
+ @SuppressFBWarnings(value = "EI_EXPOSE_REP2")
+ public LocationClassConverter(ClassLoader classpath) {
+ this.classpath = classpath;
+ }
+
/**
* Adds location information to a classfile.
*
@@ -36,7 +47,8 @@ public class LocationClassConverter {
* @param locationCache a container for location data
*/
public void convert(InputStream src, OutputStream dest,
LocationCacheGenerator locationCache) throws IOException {
- final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ final ClassWriter writer = new
PrivateClassWriter(ClassWriter.COMPUTE_FRAMES, classpath);
+
final LocationClassVisitor converter = new
LocationClassVisitor(writer, locationCache);
converter.addClassConversionHandler(new LoggerConversionHandler());
converter.addClassConversionHandler(new LogBuilderConversionHandler());
@@ -44,4 +56,20 @@ public class LocationClassConverter {
dest.write(writer.toByteArray());
}
+
+ private static class PrivateClassWriter extends ClassWriter {
+
+ private final ClassLoader classpath;
+
+ public PrivateClassWriter(int flags, ClassLoader classpath) {
+ super(flags);
+ this.classpath = classpath;
+ }
+
+ @Override
+ protected ClassLoader getClassLoader() {
+ return classpath;
+ }
+
+ }
}
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 59f4e7b..5aa99f1 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
@@ -33,7 +33,7 @@ public class AbstractConversionHandlerTest {
final TestClassLoader testCl = new TestClassLoader();
final ByteArrayOutputStream dest = new ByteArrayOutputStream();
- final LocationClassConverter converter = new LocationClassConverter();
+ final LocationClassConverter converter = new
LocationClassConverter(AbstractConversionHandlerTest.class.getClassLoader());
final LocationCacheGenerator locationCache = new
LocationCacheGenerator();
getNestedClasses(internalName).forEach(classFile ->
assertDoesNotThrow(() -> {