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

michaelo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-shared-jar.git


The following commit(s) were added to refs/heads/master by this push:
     new 6188c39  [MSHARED-1413] Review Multi-Release JAR analysis support
6188c39 is described below

commit 6188c3975b20e84b3ea63421c51e52838cd0d17e
Author: Gabriel Belingueres <belingue...@gmail.com>
AuthorDate: Fri Jun 14 05:33:36 2024 +0200

    [MSHARED-1413] Review Multi-Release JAR analysis support
    
    - Fix NumberFormatException
    - Added tests exposing the issue
    - Removed warning message in log
    - Make multi-release regex resoureless
    
    Co-authored-by: Michael Osipov <micha...@apache.org>
    
    This closes #41
---
 .../shared/jar/classes/JarClassesAnalysis.java     |  17 +-----
 .../shared/jar/classes/JarClassesAnalyzerTest.java |  67 +++++++++++++++++++--
 .../jars/multi-release-resources-only-0.0.1.jar    | Bin 0 -> 5582 bytes
 ...version-with-lower-jdk-revision-class-0.0.1.jar | Bin 0 -> 5299 bytes
 4 files changed, 64 insertions(+), 20 deletions(-)

diff --git 
a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java 
b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
index 1c6663f..de5777d 100644
--- a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
+++ b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
@@ -62,11 +62,11 @@ public class JarClassesAnalysis {
 
     /**
      * Constant representing the root content of a Multi-Release JAR file, 
thus outside of
-     * any given META-INF/versions/NN/... entry.
+     * any given META-INF/versions/N/... entry.
      */
     private static final Integer ROOT = 0;
 
-    private static final Pattern ENTRY_FILTER_MULTI_RELEASE = 
Pattern.compile("^META-INF/versions/(\\d{1,2})/.+$");
+    private static final Pattern ENTRY_FILTER_MULTI_RELEASE = 
Pattern.compile("^META-INF/versions/([1-9]\\d*)/.*$");
 
     private static final Map<Double, String> JAVA_CLASS_VERSIONS;
 
@@ -152,19 +152,6 @@ public class JarClassesAnalysis {
         JarClasses rootJarClasses = 
rootContentVersionedRuntime.getJarClasses();
         jarData.setJarClasses(rootJarClasses);
 
-        // Paranoid?
-        for (Map.Entry<Integer, JarVersionedRuntime> runtimeVersionEntry : 
runtimeVersionsMap.entrySet()) {
-            Integer version = runtimeVersionEntry.getKey();
-            String jdkRevision = 
runtimeVersionEntry.getValue().getJarClasses().getJdkRevision();
-            if (!version.equals(Integer.valueOf(jdkRevision))) {
-                logger.warn(
-                        "Multi-release version {} in JAR file '{}' has some 
class compiled for Jdk revision {}",
-                        version,
-                        jarFilename,
-                        jdkRevision);
-            }
-        }
-
         jarData.setVersionedRuntimes(new 
JarVersionedRuntimes(runtimeVersionsMap));
 
         return rootJarClasses;
diff --git 
a/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java 
b/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java
index 3862712..be4f53f 100644
--- 
a/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java
+++ 
b/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java
@@ -154,7 +154,7 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
         JarData jarData = getJarData("module-info-only-test-0.0.1.jar");
         assertEquals(10, jarData.getNumEntries());
         // root level information
-        assertEquals(9, jarData.getNumRootEntries());
+        assertEquals(8, jarData.getNumRootEntries());
         JarClasses jclass = jarData.getJarClasses();
         assertTrue(jclass.getImports().isEmpty());
         assertTrue(jclass.getPackages().isEmpty());
@@ -176,7 +176,7 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
         assertEquals("", jarClasses11.getPackages().get(0));
         assertEquals(1, jarClasses11.getClassNames().size());
         assertTrue(jarClasses11.getMethods().isEmpty());
-        assertEquals(1, jarVersionedRuntime11.getNumEntries());
+        assertEquals(2, jarVersionedRuntime11.getNumEntries());
         assertEntriesContains(jarVersionedRuntime11.getEntries(), 
"META-INF/versions/11/module-info.class");
     }
 
@@ -185,7 +185,7 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
         JarData jarData = getJarData("multi-release-test-0.0.1.jar");
         assertEquals(37, jarData.getNumEntries());
         // root level information
-        assertEquals(19, jarData.getNumRootEntries());
+        assertEquals(17, jarData.getNumRootEntries());
         JarClasses jclass = jarData.getJarClasses();
         assertEquals("1.8", jclass.getJdkRevision());
         assertFalse(jclass.getImports().isEmpty());
@@ -207,7 +207,7 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
         assertEquals(1, jarClasses9.getPackages().size());
         assertEquals(1, jarClasses9.getClassNames().size());
         assertFalse(jarClasses9.getMethods().isEmpty());
-        assertEquals(9, jarVersionedRuntime9.getNumEntries());
+        assertEquals(10, jarVersionedRuntime9.getNumEntries());
         assertEntriesContains(jarVersionedRuntime9.getEntries(), 
"META-INF/versions/9/resource.txt");
 
         JarVersionedRuntime jarVersionedRuntime11 = 
jarVersionedRuntimes.getJarVersionedRuntime(11);
@@ -217,7 +217,7 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
         assertEquals(1, jarClasses11.getPackages().size());
         assertEquals(1, jarClasses11.getClassNames().size());
         assertFalse(jarClasses11.getMethods().isEmpty());
-        assertEquals(9, jarVersionedRuntime11.getNumEntries());
+        assertEquals(10, jarVersionedRuntime11.getNumEntries());
         assertEntriesContains(jarVersionedRuntime11.getEntries(), 
"META-INF/versions/11/resource.txt");
 
         // test ordering
@@ -300,6 +300,63 @@ class JarClassesAnalyzerTest extends 
AbstractJarAnalyzerTestCase {
                         .getJdkRevision());
     }
 
+    /**
+     * Exposes issue MSHARED-1413
+     */
+    @Test
+    public void 
testAnalyzeMultiReleaseJarWithVersion11HasALowerJdkRevisionClass() {
+        try {
+            // Version 11 has one class compiled to target Java 1.8
+            JarData jarData = 
getJarData("multi-release-version-with-lower-jdk-revision-class-0.0.1.jar");
+            JarClasses jclass = jarData.getJarClasses();
+
+            assertNull(jclass.getJdkRevision());
+
+            JarVersionedRuntimes jarVersionedRuntimes = 
jarData.getVersionedRuntimes();
+            assertNotNull(jarVersionedRuntimes);
+            Map<Integer, JarVersionedRuntime> jarVersionedRuntimeMap = 
jarVersionedRuntimes.getVersionedRuntimeMap();
+            assertNotNull(jarVersionedRuntimeMap);
+            assertEquals(1, jarVersionedRuntimeMap.size()); // 11
+
+            JarVersionedRuntime jarVersionedRuntime11 = 
jarVersionedRuntimes.getJarVersionedRuntime(11);
+            JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses();
+            assertEquals("1.8", jarClasses11.getJdkRevision());
+        } catch (Exception e) {
+            fail("It should not raise an exception", e);
+        }
+    }
+
+    /**
+     * Ensures no exceptions are raised when versioned content does not 
contain classes (just resources)
+     */
+    @Test
+    public void testAnalyzeMultiReleaseJarResourcesOnly() {
+        try {
+            JarData jarData = 
getJarData("multi-release-resources-only-0.0.1.jar");
+            JarClasses jclass = jarData.getJarClasses();
+
+            assertEquals("1.8", jclass.getJdkRevision());
+
+            JarVersionedRuntimes jarVersionedRuntimes = 
jarData.getVersionedRuntimes();
+            assertNotNull(jarVersionedRuntimes);
+            Map<Integer, JarVersionedRuntime> jarVersionedRuntimeMap = 
jarVersionedRuntimes.getVersionedRuntimeMap();
+            assertNotNull(jarVersionedRuntimeMap);
+            assertEquals(2, jarVersionedRuntimeMap.size()); // 9 and 11
+
+            JarVersionedRuntime jarVersionedRuntime9 = 
jarVersionedRuntimes.getJarVersionedRuntime(9);
+            JarClasses jarClasses9 = jarVersionedRuntime9.getJarClasses();
+            // no classes found
+            assertNull(jarClasses9.getJdkRevision());
+
+            JarVersionedRuntime jarVersionedRuntime11 = 
jarVersionedRuntimes.getJarVersionedRuntime(11);
+            JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses();
+            // no classes found
+            assertNull(jarClasses11.getJdkRevision());
+        } catch (Exception e) {
+            fail("It should not raise an exception", e);
+        }
+    }
+
     private void assertEntriesContains(List<JarEntry> list, final String 
entryToFind) {
         assertTrue(list.stream().anyMatch(entry -> 
entry.getName().equals(entryToFind)));
     }
diff --git a/src/test/resources/jars/multi-release-resources-only-0.0.1.jar 
b/src/test/resources/jars/multi-release-resources-only-0.0.1.jar
new file mode 100644
index 0000000..cd056ab
Binary files /dev/null and 
b/src/test/resources/jars/multi-release-resources-only-0.0.1.jar differ
diff --git 
a/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar
 
b/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar
new file mode 100644
index 0000000..9879c82
Binary files /dev/null and 
b/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar
 differ

Reply via email to