From 43cdc8a773cecb8a5b8a431a70f7351e9835f96a Mon Sep 17 00:00:00 2001 From: rfscholte Date: Mon, 15 Feb 2021 20:41:52 +0100 Subject: [PATCH 1/3] #64 BinaryModuleInfoParser.parse does not take toolchain into account --- ...foParser.java => AsmModuleInfoParser.java} | 2 +- .../languages/java/jpms/LocationManager.java | 39 ++++++++++++++----- .../java/jpms/LocationManagerIT.java | 9 ++++- .../java/jpms/LocationManagerTest.java | 9 ++++- 4 files changed, 46 insertions(+), 13 deletions(-) rename plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/{BinaryModuleInfoParser.java => AsmModuleInfoParser.java} (98%) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java similarity index 98% rename from plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java rename to plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java index 9157b99..9d637d1 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java @@ -39,7 +39,7 @@ * @author Robert Scholte * @since 1.0.0 */ -class BinaryModuleInfoParser extends AbstractBinaryModuleInfoParser +class AsmModuleInfoParser extends AbstractBinaryModuleInfoParser { @Override JavaModuleDescriptor parse( InputStream in ) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java index fca0a2c..bec925a 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java @@ -48,22 +48,18 @@ @Singleton public class LocationManager { - private ModuleInfoParser binaryParser; - private SourceModuleInfoParser sourceParser; private ManifestModuleNameExtractor manifestModuleNameExtractor; public LocationManager() { - this.binaryParser = new BinaryModuleInfoParser(); this.sourceParser = new SourceModuleInfoParser(); this.manifestModuleNameExtractor = new ManifestModuleNameExtractor(); } - LocationManager( ModuleInfoParser binaryParser, SourceModuleInfoParser sourceParser ) + LocationManager( SourceModuleInfoParser sourceParser ) { - this.binaryParser = binaryParser; this.sourceParser = sourceParser; this.manifestModuleNameExtractor = new ManifestModuleNameExtractor(); } @@ -136,7 +132,7 @@ public String extract( Path file ) } }; - return resolvePath( request.toPath( request.getPathElement() ), filenameExtractor ); + return resolvePath( request.toPath( request.getPathElement() ), filenameExtractor, getBinaryModuleInfoParser( request.getJdkHome() ) ); } /** @@ -154,7 +150,9 @@ public ResolvePathsResult resolvePaths( final ResolvePathsRequest requ Map pathElements = new LinkedHashMap<>( request.getPathElements().size() ); - JavaModuleDescriptor mainModuleDescriptor = getMainModuleDescriptor( request ); + final ModuleInfoParser binaryParser = getBinaryModuleInfoParser( request.getJdkHome() ); + + JavaModuleDescriptor mainModuleDescriptor = getMainModuleDescriptor( request, binaryParser ); result.setMainModuleDescriptor( mainModuleDescriptor ); @@ -198,7 +196,7 @@ public String extract( Path path ) try { - ResolvePathResult resolvedPath = resolvePath( request.toPath( t ), nameExtractor ); + ResolvePathResult resolvedPath = resolvePath( request.toPath( t ), nameExtractor, binaryParser ); moduleDescriptor = resolvedPath.getModuleDescriptor(); @@ -294,7 +292,28 @@ public String extract( Path path ) return result; } - private JavaModuleDescriptor getMainModuleDescriptor( final ResolvePathsRequest request ) + /** + * If the jdkHome is specified, its version it considered higher than the runtime java version. + * In that case ASM must be used to read the module descriptor + * + * @param jdkHome + * @return + */ + ModuleInfoParser getBinaryModuleInfoParser( final Path jdkHome ) + { + final ModuleInfoParser binaryParser; + if ( jdkHome == null ) + { + binaryParser = new BinaryModuleInfoParser(); + } + else + { + binaryParser = new AsmModuleInfoParser(); + } + return binaryParser; + } + + private JavaModuleDescriptor getMainModuleDescriptor( final ResolvePathsRequest request, ModuleInfoParser binaryParser ) throws IOException { JavaModuleDescriptor mainModuleDescriptor; @@ -323,7 +342,7 @@ else if ( descriptorPath.endsWith( "module-info.class" ) ) return mainModuleDescriptor; } - private ResolvePathResult resolvePath( Path path, ModuleNameExtractor fileModulenameExtractor ) throws IOException + private ResolvePathResult resolvePath( Path path, ModuleNameExtractor fileModulenameExtractor, ModuleInfoParser binaryParser ) throws IOException { ResolvePathResult result = new ResolvePathResult(); diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerIT.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerIT.java index 7db7cec..41ddc75 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerIT.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerIT.java @@ -66,7 +66,14 @@ public static void assume() @Before public void onSetup() { - locationManager = new LocationManager( asmParser, qdoxParser ); + locationManager = new LocationManager( qdoxParser ) + { + @Override + ModuleInfoParser getBinaryModuleInfoParser( Path jdkHome ) + { + return asmParser; + } + }; } @Test diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java index e491e74..10c5961 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java @@ -52,7 +52,14 @@ public class LocationManagerTest @Before public void onSetup() { - locationManager = new LocationManager( asmParser, qdoxParser ); + locationManager = new LocationManager( qdoxParser ) + { + @Override + ModuleInfoParser getBinaryModuleInfoParser( Path jdkHome ) + { + return asmParser; + } + }; } @Test From 54d37be8e741d61d810fd414a196e560b447b3d6 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Mon, 15 Feb 2021 20:42:46 +0100 Subject: [PATCH 2/3] #64 BinaryModuleInfoParser.parse does not take toolchain into account --- .../java/jpms/BinaryModuleInfoParser.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java new file mode 100644 index 0000000..dc9b1c8 --- /dev/null +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java @@ -0,0 +1,24 @@ +package org.codehaus.plexus.languages.java.jpms; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +class BinaryModuleInfoParser extends AsmModuleInfoParser +{ + +} From ab9ff52c3d9e8b5db346f80e1fede46716d37b35 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Mon, 15 Feb 2021 20:45:34 +0100 Subject: [PATCH 3/3] Update ASM to 9.1 --- plexus-java/pom.xml | 2 +- .../plexus/languages/java/jpms/AsmModuleInfoParser.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plexus-java/pom.xml b/plexus-java/pom.xml index 83f3796..595a038 100644 --- a/plexus-java/pom.xml +++ b/plexus-java/pom.xml @@ -67,7 +67,7 @@ org.ow2.asm asm - 9.0 + 9.1 com.thoughtworks.qdox diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java index 9d637d1..2f6d606 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java @@ -48,14 +48,14 @@ JavaModuleDescriptor parse( InputStream in ) final JavaModuleDescriptorWrapper wrapper = new JavaModuleDescriptorWrapper(); ClassReader reader = new ClassReader( in ); - reader.accept( new ClassVisitor( Opcodes.ASM6 ) + reader.accept( new ClassVisitor( Opcodes.ASM9 ) { @Override public ModuleVisitor visitModule( String name, int arg1, String arg2 ) { wrapper.builder = JavaModuleDescriptor.newModule( name ); - return new ModuleVisitor( Opcodes.ASM6 ) + return new ModuleVisitor( Opcodes.ASM9 ) { @Override public void visitRequire( String module, int access, String version )