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(() -> {

Reply via email to