This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat-jakartaee-migration.git

commit ba9f0737d79cba54630f82fcfddc649923705c79
Author: Mark Thomas <[email protected]>
AuthorDate: Tue Jul 5 14:26:01 2022 +0100

    Fix BZ 66163.  Correct class transformer handling of "jakarta."
    
    Correct handling of strings containing `jakarta. ...` when those
    references are to classes not provided by the container.
    Based on a patch by Ole Schulz-Hildebrandt.
    
    https://bz.apache.org/bugzilla/show_bug.cgi?id=66163
---
 CHANGES.md                                         |  3 +
 .../apache/tomcat/jakartaee/ClassConverter.java    | 19 ++++++-
 .../tomcat/jakartaee/ClassConverterTest.java       | 65 +++++++++++++++++++++-
 .../apache/tomcat/jakartaee/TesterConstants.java   |  9 +++
 4 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index d3de81b..b839ae2 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -4,8 +4,11 @@
 - Fix [#19](https://github.com/apache/tomcat-jakartaee-migration/issues/19). 
Add support for converting `.groovy` files.
 
 - Fix [#20](https://github.com/apache/tomcat-jakartaee-migration/issues/20) by 
using commons-compression instead of the Java zip code (remm)
+
 - Remove deprecated `-verbose` command line option (remm)
 
+- Fix [bug 66163](https://bz.apache.org/bugzilla/show_bug.cgi?id=66163). 
Correct the handling of references of the form `jakarta. ...` when using the 
class transformer when those references are to classes not provided by the 
container. Based on a patch by Ole Schulz-Hildebrandt. (markt)
+
 ## 1.0.0
 
 - Fix [#14](https://github.com/apache/tomcat-jakartaee-migration/issues/14). 
Do not migrate `javax.xml.(registry|rpc)` namespaces. (mgrigorov)
diff --git a/src/main/java/org/apache/tomcat/jakartaee/ClassConverter.java 
b/src/main/java/org/apache/tomcat/jakartaee/ClassConverter.java
index ea92b1a..f6d08e2 100644
--- a/src/main/java/org/apache/tomcat/jakartaee/ClassConverter.java
+++ b/src/main/java/org/apache/tomcat/jakartaee/ClassConverter.java
@@ -101,14 +101,29 @@ public class ClassConverter implements Converter, 
ClassFileTransformer {
                         String[] split = newString.split(";|<");
                         for (String current : split) {
                             int pos = current.indexOf("jakarta/");
+                            boolean dotMode = false;
+                            if (pos < 0) {
+                                pos = current.indexOf("jakarta.");
+                                dotMode = true;
+                            }
                             if (pos >= 0) {
-                                if (loader.getResource(current.substring(pos) 
+ ".class") == null) {
+                                String resourceName = current.substring(pos);
+                                if (dotMode) {
+                                    resourceName = resourceName.replace('.', 
'/');
+                                }
+                                resourceName = resourceName + ".class";
+                                if (loader.getResource(resourceName) == null) {
                                     if (logger.isLoggable(Level.FINE)) {
                                         logger.log(Level.FINE, 
sm.getString("classConverter.skipName",
                                                 
current.substring(pos).replace('/','.')));
                                     }
                                     // Cancel the replacement as the 
replacement does not exist
-                                    String originalFragment = 
current.replace("jakarta/", "javax/");
+                                    String originalFragment;
+                                    if (dotMode) {
+                                        originalFragment = 
current.replace("jakarta.", "javax.");
+                                    } else {
+                                        originalFragment = 
current.replace("jakarta/", "javax/");
+                                    }
                                     newString = newString.replace(current, 
originalFragment);
                                 }
                             }
diff --git a/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java 
b/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
index c236d5f..bf0b29e 100644
--- a/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
+++ b/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
@@ -17,9 +17,22 @@
 
 package org.apache.tomcat.jakartaee;
 
+import org.apache.bcel.classfile.ClassParser;
+import org.apache.bcel.classfile.Constant;
+import org.apache.bcel.classfile.ConstantUtf8;
+import org.apache.bcel.classfile.JavaClass;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
 
 public class ClassConverterTest {
 
@@ -30,4 +43,54 @@ public class ClassConverterTest {
         assertTrue(converter.accepts("HelloServlet.class"));
         assertFalse(converter.accepts("HelloServlet.java"));
     }
+
+
+    @Test
+    public void testTransform() throws Exception {
+        byte[] original = null;
+        byte[] transformed;
+
+        // Get the original bytes
+        try (InputStream is = 
this.getClass().getResourceAsStream("/org/apache/tomcat/jakartaee/TesterConstants.class");
+                ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+            byte[] buf = new byte[1024];
+            int len;
+            while ((len = is.read(buf)) > 0) {
+                baos.write(buf, 0, len);
+            }
+            original = baos.toByteArray();
+        } catch (IOException ioe) {
+            ioe.printStackTrace();
+            fail();
+        }
+
+        // Transform
+        ClassConverter convertor = new ClassConverter(EESpecProfile.TOMCAT);
+        transformed = convertor.transform(this.getClass().getClassLoader(),
+                "org.apache.tomcat.jakartaee.TesterConstants", null, null, 
original);
+
+        // Extract strings
+        Set<String> strings = new HashSet<>();
+        ClassParser parser = new ClassParser(new 
ByteArrayInputStream(transformed), "unknown");
+        JavaClass javaClass = parser.parse();
+        Constant[] constantPool = 
javaClass.getConstantPool().getConstantPool();
+        for (int i = 0; i < constantPool.length; i++) {
+            if (constantPool[i] instanceof ConstantUtf8) {
+                ConstantUtf8 c = (ConstantUtf8) constantPool[i];
+                strings.add(c.getBytes());
+            }
+        }
+
+        // Check the results
+        // Should not be converted
+        assertTrue(strings.contains("javax.servlet.DoesNotExist"));
+        assertTrue(strings.contains("javax/servlet/DoesNotExist"));
+        assertFalse(strings.contains("jakarta.servlet.DoesNotExist"));
+        assertFalse(strings.contains("jakarta/servlet/DoesNotExist"));
+        // Should be converted
+        assertFalse(strings.contains("javax.servlet.CommonGatewayInterface"));
+        assertFalse(strings.contains("javax/servlet/CommonGatewayInterface"));
+        assertTrue(strings.contains("jakarta.servlet.CommonGatewayInterface"));
+        assertTrue(strings.contains("jakarta/servlet/CommonGatewayInterface"));
+    }
 }
diff --git a/src/test/java/org/apache/tomcat/jakartaee/TesterConstants.java 
b/src/test/java/org/apache/tomcat/jakartaee/TesterConstants.java
new file mode 100644
index 0000000..afbf569
--- /dev/null
+++ b/src/test/java/org/apache/tomcat/jakartaee/TesterConstants.java
@@ -0,0 +1,9 @@
+package org.apache.tomcat.jakartaee;
+
+public class TesterConstants {
+
+    public static final String JAVA_PRESENT_DOT = 
"javax.servlet.CommonGatewayInterface";
+    public static final String JAVA_PRESENT_PATH = 
"javax/servlet/CommonGatewayInterface";
+    public static final String JAVA_NOT_PRESENT_DOT = 
"javax.servlet.DoesNotExist";
+    public static final String JAVA_NOT_PRESENT_PATH = 
"javax/servlet/DoesNotExist";
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to