pzygielo commented on code in PR #21: URL: https://github.com/apache/maven-shared-jar/pull/21#discussion_r1641996622
########## src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java: ########## @@ -90,68 +105,145 @@ public class JarClassesAnalysis { * @return the details of the classes found */ public JarClasses analyze(JarAnalyzer jarAnalyzer) { - JarClasses classes = jarAnalyzer.getJarData().getJarClasses(); + JarData jarData = jarAnalyzer.getJarData(); + JarClasses classes = jarData.getJarClasses(); if (classes == null) { - String jarfilename = jarAnalyzer.getFile().getAbsolutePath(); - classes = new JarClasses(); + if (jarData.isMultiRelease()) { + classes = analyzeMultiRelease(jarAnalyzer); + } else { + classes = analyzeRoot(jarAnalyzer); + } + } + return classes; + } - List<JarEntry> classList = jarAnalyzer.getClassEntries(); + private Integer jarEntryVersion(JarEntry entry) { + Matcher matcher = ENTRY_FILTER_MULTI_RELEASE.matcher(entry.getName()); + if (matcher.matches()) { + return Integer.valueOf(matcher.group(1)); + } + return ROOT; + } - classes.setDebugPresent(false); + private JarClasses analyzeMultiRelease(JarAnalyzer jarAnalyzer) { + String jarFilename = jarAnalyzer.getFile().getAbsolutePath(); - double maxVersion = 0.0; + Map<Integer, List<JarEntry>> mapEntries = + jarAnalyzer.getEntries().stream().collect(Collectors.groupingBy(this::jarEntryVersion)); - for (JarEntry entry : classList) { - String classname = entry.getName(); + // ordered by increasing Java version + NavigableMap<Integer, JarVersionedRuntime> runtimeVersionsMap = new TreeMap<>(); - try { - ClassParser classParser = new ClassParser(jarfilename, classname); + for (Map.Entry<Integer, List<JarEntry>> mapEntry : mapEntries.entrySet()) { + Integer runtimeVersion = mapEntry.getKey(); + List<JarEntry> runtimeVersionEntryList = mapEntry.getValue(); - JavaClass javaClass = classParser.parse(); + List<JarEntry> classList = jarAnalyzer.getClassEntries(runtimeVersionEntryList); - String classSignature = javaClass.getClassName(); + JarClasses classes = analyze(jarFilename, classList); - if (!classes.isDebugPresent()) { - if (hasDebugSymbols(javaClass)) { - classes.setDebugPresent(true); - } - } + runtimeVersionsMap.put(runtimeVersion, new JarVersionedRuntime(runtimeVersionEntryList, classes)); + } - double classVersion = javaClass.getMajor(); - if (javaClass.getMinor() > 0) { - classVersion = classVersion + javaClass.getMinor() / 10.0; - } + JarVersionedRuntime baseJarRelease = runtimeVersionsMap.remove(ROOT); + JarClasses baseJarClasses = baseJarRelease.getJarClasses(); - if (classVersion > maxVersion) { - maxVersion = classVersion; - } + jarAnalyzer.getJarData().setJarClasses(baseJarClasses); - Method[] methods = javaClass.getMethods(); - for (Method method : methods) { - classes.addMethod(classSignature + "." + method.getName() + method.getSignature()); - } + // 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))) { Review Comment: https://lists.apache.org/thread/lrjwk64mzhwyrzk20n6yr0g4t2dw5y53 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@maven.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org