You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2022/07/05 13:26:06 UTC

[tomcat-jakartaee-migration] branch main updated (e93ad31 -> ba9f073)

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

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


    from e93ad31  Removed unused code
     new 59ce2a6  Rename test method
     new ba9f073  Fix BZ 66163.  Correct class transformer handling of "jakarta."

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGES.md                                         |  3 +
 .../apache/tomcat/jakartaee/ClassConverter.java    | 19 +++++-
 .../tomcat/jakartaee/ClassConverterTest.java       | 67 +++++++++++++++++++++-
 .../apache/tomcat/jakartaee/TesterConstants.java   |  9 +++
 4 files changed, 94 insertions(+), 4 deletions(-)
 create mode 100644 src/test/java/org/apache/tomcat/jakartaee/TesterConstants.java


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-jakartaee-migration] 02/02: Fix BZ 66163. Correct class transformer handling of "jakarta."

Posted by ma...@apache.org.
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 <ma...@apache.org>
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: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-jakartaee-migration] 01/02: Rename test method

Posted by ma...@apache.org.
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 59ce2a66de147a459b9a8bd8421d3c5727845159
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jul 5 13:22:41 2022 +0100

    Rename test method
---
 src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java b/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
index 7b6fa0f..c236d5f 100644
--- a/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
+++ b/src/test/java/org/apache/tomcat/jakartaee/ClassConverterTest.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.*;
 public class ClassConverterTest {
 
     @Test
-    public void testConverter() {
+    public void testAccepts() {
         Converter converter = new ClassConverter();
 
         assertTrue(converter.accepts("HelloServlet.class"));


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org