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]
