From 8b095c18354e9cd374645e6af488ab98cf32803e Mon Sep 17 00:00:00 2001 From: rfscholte Date: Wed, 16 May 2018 21:57:17 +0200 Subject: [PATCH 1/6] #5 Use the Java 9 API to parse module descriptors --- plexus-java/pom.xml | 58 ++++++++++++++++++- ...arser.java => BinaryModuleInfoParser.java} | 4 +- .../languages/java/jpms/LocationManager.java | 20 +++---- .../languages/java/jpms/ModuleInfoParser.java | 2 - ...arser.java => SourceModuleInfoParser.java} | 2 +- .../java/jpms/BinaryModuleInfoParser.java | 56 ++++++++++++++++++ ...t.java => BinaryModuleInfoParserTest.java} | 4 +- .../java/jpms/LocationManagerTest.java | 4 +- ...t.java => SourceModuleInfoParserTest.java} | 4 +- 9 files changed, 132 insertions(+), 22 deletions(-) rename plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/{AsmModuleInfoParser.java => BinaryModuleInfoParser.java} (98%) rename plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/{QDoxModuleInfoParser.java => SourceModuleInfoParser.java} (98%) create mode 100644 plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java rename plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/{AsmModuleInfoParserTest.java => BinaryModuleInfoParserTest.java} (97%) rename plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/{QDoxModuleInfoParserTest.java => SourceModuleInfoParserTest.java} (95%) diff --git a/plexus-java/pom.xml b/plexus-java/pom.xml index ccf069e..61453d8 100644 --- a/plexus-java/pom.xml +++ b/plexus-java/pom.xml @@ -31,6 +31,11 @@ org.codehaus.plexus plexus-component-metadata 1.7.1 + + + source + + @@ -44,7 +49,7 @@ com.thoughtworks.qdox qdox - 2.0-M7 + 2.0-M8 @@ -80,4 +85,55 @@ + + + jdk9 + + [9,) + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + + jdk9 + + compile + + + 9 + + ${project.basedir}/src/main/java9 + + ${project.build.outputDirectory}/META-INF/versions/9 + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + default-jar + + + + true + + + + + + + + + + + + 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/BinaryModuleInfoParser.java similarity index 98% rename from plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParser.java rename to plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java index b0ee733..4e58290 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/BinaryModuleInfoParser.java @@ -40,11 +40,11 @@ /** * Extract information from module with ASM * + * * @author Robert Scholte * @since 1.0.0 */ -public class AsmModuleInfoParser - implements ModuleInfoParser +class BinaryModuleInfoParser implements ModuleInfoParser { private static final Pattern MRJAR_DESCRIPTOR = Pattern.compile( "META-INF/versions/[^/]+/module-info.class" ); 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 547ca2c..724b225 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 @@ -45,20 +45,20 @@ @Component( role = LocationManager.class ) public class LocationManager { - private ModuleInfoParser asmParser; + private ModuleInfoParser binaryParser; - private QDoxModuleInfoParser qdoxParser; + private SourceModuleInfoParser sourceParser; public LocationManager() { - this.asmParser = new AsmModuleInfoParser(); - this.qdoxParser = new QDoxModuleInfoParser(); + this.binaryParser = new BinaryModuleInfoParser(); + this.sourceParser = new SourceModuleInfoParser(); } - LocationManager( ModuleInfoParser asmParser, QDoxModuleInfoParser qdoxParser ) + LocationManager( ModuleInfoParser binaryParser, SourceModuleInfoParser sourceParser ) { - this.asmParser = asmParser; - this.qdoxParser = qdoxParser; + this.binaryParser = binaryParser; + this.sourceParser = sourceParser; } /** @@ -84,11 +84,11 @@ public ResolvePathsResult resolvePaths( ResolvePathsRequest request ) { if ( descriptorPath.endsWith( "module-info.java" ) ) { - mainModuleDescriptor = qdoxParser.fromSourcePath( descriptorPath ); + mainModuleDescriptor = sourceParser.fromSourcePath( descriptorPath ); } else if ( descriptorPath.endsWith( "module-info.class" ) ) { - mainModuleDescriptor = asmParser.getModuleDescriptor( descriptorPath.getParent() ); + mainModuleDescriptor = binaryParser.getModuleDescriptor( descriptorPath.getParent() ); } else { @@ -124,7 +124,7 @@ else if ( descriptorPath.endsWith( "module-info.class" ) ) { try { - moduleDescriptor = asmParser.getModuleDescriptor( path ); + moduleDescriptor = binaryParser.getModuleDescriptor( path ); } catch( IOException e ) { diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java index 671bcb4..03f38df 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java @@ -30,8 +30,6 @@ */ public interface ModuleInfoParser { - - /** * Extracts the name from the module-info file * diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParser.java similarity index 98% rename from plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParser.java rename to plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParser.java index 3765848..48f8e1e 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParser.java @@ -36,7 +36,7 @@ * @author Robert Scholte * @since 1.0.0 */ -public class QDoxModuleInfoParser +class SourceModuleInfoParser { public org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor fromSourcePath( Path modulePath ) diff --git a/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java new file mode 100644 index 0000000..ef8a1cd --- /dev/null +++ b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java @@ -0,0 +1,56 @@ +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. + */ + +import java.lang.module.ModuleDescriptor; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.nio.file.Path; +import java.util.Collections; + +import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.Builder; + +class BinaryModuleInfoParser implements ModuleInfoParser +{ + @Override + public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) + { + ModuleReference moduleReference = ModuleFinder.of( modulePath ).findAll().iterator().next(); + + ModuleDescriptor descriptor = moduleReference.descriptor(); + + Builder builder = JavaModuleDescriptor.newModule( descriptor.name() ); + + for ( ModuleDescriptor.Requires requires : descriptor.requires() ) + { + if ( requires.modifiers().contains( ModuleDescriptor.Requires.Modifier.STATIC ) ) + { + builder.requires​( Collections.singleton( org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier.STATIC ), + requires.name() ); + } + else + { + builder.requires( requires.name() ); + } + } + + return builder.build(); + } +} diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParserTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java similarity index 97% rename from plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParserTest.java rename to plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java index fcc42f6..dffa069 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/AsmModuleInfoParserTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java @@ -33,9 +33,9 @@ import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires; import org.junit.Test; -public class AsmModuleInfoParserTest +public class BinaryModuleInfoParserTest { - private ModuleInfoParser parser = new AsmModuleInfoParser(); + private BinaryModuleInfoParser parser = new BinaryModuleInfoParser(); @Test public void testJarDescriptor() throws Exception 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 7292c0c..a5c0fcc 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 @@ -45,10 +45,10 @@ public class LocationManagerTest { @Mock - private ModuleInfoParser asmParser; + private BinaryModuleInfoParser asmParser; @Mock - private QDoxModuleInfoParser qdoxParser; + private SourceModuleInfoParser qdoxParser; private LocationManager locationManager; diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParserTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParserTest.java similarity index 95% rename from plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParserTest.java rename to plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParserTest.java index 7ace474..f7e4ead 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/QDoxModuleInfoParserTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParserTest.java @@ -32,9 +32,9 @@ import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires; import org.junit.Test; -public class QDoxModuleInfoParserTest +public class SourceModuleInfoParserTest { - private QDoxModuleInfoParser parser = new QDoxModuleInfoParser(); + private SourceModuleInfoParser parser = new SourceModuleInfoParser(); @Test public void test() throws Exception From feb7c601e7b845f855b1d757ee590a890ab710ba Mon Sep 17 00:00:00 2001 From: rfscholte Date: Wed, 16 May 2018 22:32:35 +0200 Subject: [PATCH 2/6] Reduce visibility of internal classes --- .../plexus/languages/java/jpms/ManifestModuleNameExtractor.java | 2 +- .../codehaus/plexus/languages/java/jpms/ModuleInfoParser.java | 2 +- .../plexus/languages/java/jpms/ModuleNameExtractor.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor.java index 9affa58..16d0984 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor.java @@ -33,7 +33,7 @@ * @author Robert Scholte * @since 1.0.0 */ -public class ManifestModuleNameExtractor implements ModuleNameExtractor +class ManifestModuleNameExtractor implements ModuleNameExtractor { @Override public String extract( Path file ) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java index 03f38df..572d916 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java @@ -28,7 +28,7 @@ * @author Robert Scholte * @since 1.0.0 */ -public interface ModuleInfoParser +interface ModuleInfoParser { /** * Extracts the name from the module-info file diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor.java index 28e5473..541f8c3 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.nio.file.Path; -public interface ModuleNameExtractor +interface ModuleNameExtractor { String extract( Path path ) throws IOException; } From e219cfd51c1958cf1cea00e6180a0e0cf8c8852b Mon Sep 17 00:00:00 2001 From: rfscholte Date: Fri, 18 May 2018 09:34:19 +0200 Subject: [PATCH 3/6] Upgrade surefire Add second execution block to run tests with true MultiRelease jar --- plexus-java/pom.xml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/plexus-java/pom.xml b/plexus-java/pom.xml index 61453d8..d56c6ee 100644 --- a/plexus-java/pom.xml +++ b/plexus-java/pom.xml @@ -22,7 +22,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.20 + 2.21.0 @@ -130,6 +130,24 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + + + jdk9 + integration-test + + test + + + + true + + + + From 544d538a087d125cc7c51c3ce89490883a08efa0 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Sun, 20 May 2018 11:12:42 +0200 Subject: [PATCH 4/6] #5 Use the Java 9 API to parse module descriptors --- plexus-java/pom.xml | 49 ++++++------ .../jpms/AbstractBinaryModuleInfoParser.java | 77 +++++++++++++++++++ .../java/jpms/BinaryModuleInfoParser.java | 71 +---------------- .../java/jpms/JavaModuleDescriptor.java | 71 +++++++++++++++++ .../java/jpms/BinaryModuleInfoParser.java | 26 +++++-- .../java/jpms/BinaryModuleInfoParserTest.java | 32 ++++---- 6 files changed, 211 insertions(+), 115 deletions(-) create mode 100644 plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java diff --git a/plexus-java/pom.xml b/plexus-java/pom.xml index d56c6ee..a317713 100644 --- a/plexus-java/pom.xml +++ b/plexus-java/pom.xml @@ -37,6 +37,25 @@ + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.21.0 + + + + integration-test + verify + + + + + + **/*Test.java + + + @@ -74,7 +93,7 @@ org.mockito mockito-core - 2.15.0 + 2.18.3 test @@ -105,11 +124,11 @@ compile - 9 - - ${project.basedir}/src/main/java9 - - ${project.build.outputDirectory}/META-INF/versions/9 + 9 + + ${project.basedir}/src/main/java9 + + ${project.build.outputDirectory}/META-INF/versions/9 @@ -130,24 +149,6 @@ - - - org.apache.maven.plugins - maven-surefire-plugin - - - jdk9 - integration-test - - test - - - - true - - - - diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java new file mode 100644 index 0000000..a58a043 --- /dev/null +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java @@ -0,0 +1,77 @@ +package org.codehaus.plexus.languages.java.jpms; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.regex.Pattern; + +public abstract class AbstractBinaryModuleInfoParser implements ModuleInfoParser +{ + private static final Pattern MRJAR_DESCRIPTOR = Pattern.compile( "META-INF/versions/[^/]+/module-info.class" ); + + @Override + public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) + throws IOException + { + JavaModuleDescriptor descriptor; + if ( Files.isDirectory( modulePath ) ) + { + try ( InputStream in = Files.newInputStream( modulePath.resolve( "module-info.class" ) ) ) + { + descriptor = parse( in ); + } + } + else + { + try ( JarFile jarFile = new JarFile( modulePath.toFile() ) ) + { + JarEntry moduleInfo; + if ( modulePath.toString().toLowerCase().endsWith( ".jmod" ) ) + { + moduleInfo = jarFile.getJarEntry( "classes/module-info.class" ); + } + else + { + moduleInfo = jarFile.getJarEntry( "module-info.class" ); + + if ( moduleInfo == null ) + { + Manifest manifest = jarFile.getManifest(); + + if ( manifest != null && "true".equalsIgnoreCase( manifest.getMainAttributes().getValue( "Multi-Release" ) ) ) + { + // look for multirelease descriptor + Enumeration entryIter = jarFile.entries(); + while ( entryIter.hasMoreElements() ) + { + JarEntry entry = entryIter.nextElement(); + if ( MRJAR_DESCRIPTOR.matcher( entry.getName() ).matches() ) + { + moduleInfo = entry; + break; + } + } + } + } + } + + if ( moduleInfo != null ) + { + descriptor = parse( jarFile.getInputStream( moduleInfo ) ); + } + else + { + descriptor = null; + } + } + } + return descriptor; + } + + abstract JavaModuleDescriptor parse( InputStream in ) throws IOException; +} 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 index 4e58290..ab04621 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/BinaryModuleInfoParser.java @@ -21,16 +21,9 @@ import java.io.IOException; import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; -import java.util.Enumeration; import java.util.HashSet; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.Manifest; -import java.util.regex.Pattern; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -44,70 +37,10 @@ * @author Robert Scholte * @since 1.0.0 */ -class BinaryModuleInfoParser implements ModuleInfoParser +class BinaryModuleInfoParser extends AbstractBinaryModuleInfoParser { - private static final Pattern MRJAR_DESCRIPTOR = Pattern.compile( "META-INF/versions/[^/]+/module-info.class" ); - @Override - public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) - throws IOException - { - JavaModuleDescriptor descriptor; - if ( Files.isDirectory( modulePath ) ) - { - try ( InputStream in = Files.newInputStream( modulePath.resolve( "module-info.class" ) ) ) - { - descriptor = parse( in ); - } - } - else - { - try ( JarFile jarFile = new JarFile( modulePath.toFile() ) ) - { - JarEntry moduleInfo; - if ( modulePath.toString().toLowerCase().endsWith( ".jmod" ) ) - { - moduleInfo = jarFile.getJarEntry( "classes/module-info.class" ); - } - else - { - moduleInfo = jarFile.getJarEntry( "module-info.class" ); - - if ( moduleInfo == null ) - { - Manifest manifest = jarFile.getManifest(); - - if ( manifest != null && "true".equalsIgnoreCase( manifest.getMainAttributes().getValue( "Multi-Release" ) ) ) - { - // look for multirelease descriptor - Enumeration entryIter = jarFile.entries(); - while ( entryIter.hasMoreElements() ) - { - JarEntry entry = entryIter.nextElement(); - if ( MRJAR_DESCRIPTOR.matcher( entry.getName() ).matches() ) - { - moduleInfo = entry; - break; - } - } - } - } - } - - if ( moduleInfo != null ) - { - descriptor = parse( jarFile.getInputStream( moduleInfo ) ); - } - else - { - descriptor = null; - } - } - } - return descriptor; - } - - private JavaModuleDescriptor parse( InputStream in ) + JavaModuleDescriptor parse( InputStream in ) throws IOException { final JavaModuleDescriptorWrapper wrapper = new JavaModuleDescriptorWrapper(); diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor.java index 2fa1538..1293910 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.LinkedHashSet; +import java.util.Objects; import java.util.Set; /** @@ -171,6 +172,40 @@ public static enum JavaModifier { STATIC } + + @Override + public int hashCode() + { + return Objects.hash( modifiers, name ); + } + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + { + return true; + } + if ( obj == null ) + { + return false; + } + if ( getClass() != obj.getClass() ) + { + return false; + } + + JavaRequires other = (JavaRequires) obj; + if ( !Objects.equals( modifiers, other.modifiers ) ) + { + return false; + } + if ( !Objects.equals( name, other.name ) ) + { + return false; + } + return true; + } } /** @@ -206,5 +241,41 @@ public Set targets() { return targets; } + + @Override + public int hashCode() + { + return Objects.hash( source, targets ); + } + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + { + return true; + } + if ( obj == null ) + { + return false; + } + if ( getClass() != obj.getClass() ) + { + return false; + } + + JavaExports other = (JavaExports) obj; + if ( !Objects.equals( source, other.source ) ) + { + return false; + } + if ( !Objects.equals( targets, other.targets ) ) + { + return false; + } + return true; + } + + } } diff --git a/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java index ef8a1cd..d25b041 100644 --- a/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java +++ b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java @@ -19,22 +19,20 @@ * under the License. */ +import java.io.IOException; +import java.io.InputStream; + import java.lang.module.ModuleDescriptor; -import java.lang.module.ModuleFinder; -import java.lang.module.ModuleReference; -import java.nio.file.Path; import java.util.Collections; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.Builder; -class BinaryModuleInfoParser implements ModuleInfoParser +class BinaryModuleInfoParser extends BaseBinaryModuleInfoParser { @Override - public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) + JavaModuleDescriptor parse( InputStream in ) throws IOException { - ModuleReference moduleReference = ModuleFinder.of( modulePath ).findAll().iterator().next(); - - ModuleDescriptor descriptor = moduleReference.descriptor(); + ModuleDescriptor descriptor = ModuleDescriptor.read( in ); Builder builder = JavaModuleDescriptor.newModule( descriptor.name() ); @@ -51,6 +49,18 @@ public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) } } + for ( ModuleDescriptor.Exports exports : descriptor.exports() ) + { + if ( exports.targets().isEmpty() ) + { + builder.exports( exports.source() ); + } + else + { + builder.exports( exports.source(), exports.targets() ); + } + } + return builder.build(); } } diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java index dffa069..41bc6f9 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java @@ -28,8 +28,13 @@ import java.io.IOException; import java.nio.file.NoSuchFileException; import java.nio.file.Paths; +import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaExports; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires; import org.junit.Test; @@ -49,8 +54,12 @@ public void testJarDescriptor() throws Exception assertEquals( 1, descriptor.requires().size() ); assertEquals( "java.base", descriptor.requires().iterator().next().name() ); - assertEquals( 2, descriptor.exports().size() ); - assertEquals( "org.objectweb.asm", descriptor.exports().iterator().next().source() ); + Set expectedExports = JavaModuleDescriptor.newAutomaticModule( "_" ) + .exports( "org.objectweb.asm" ) + .exports( "org.objectweb.asm.signature" ) + .build() + .exports(); + assertEquals( expectedExports, descriptor.exports() ); } @Test @@ -93,19 +102,14 @@ public void testOutputDirectoryDescriptor() assertEquals( 3, descriptor.requires().size() ); - Iterator requiresIter = descriptor.requires().iterator(); + Set expectedRequires = JavaModuleDescriptor.newAutomaticModule( "_" ) + .requires​( "java.base" ) + .requires( "java.xml" ) + .requires​( Collections.singleton( JavaRequires.JavaModifier.STATIC ), "com.google.common" ) + .build() + .requires(); - JavaRequires requires = requiresIter.next(); - assertEquals( "java.base", requires.name() ); - assertFalse( requires.modifiers​().contains( JavaRequires.JavaModifier.STATIC ) ); - - requires = requiresIter.next(); - assertEquals( "java.xml", requires.name() ); - assertFalse( requires.modifiers​().contains( JavaRequires.JavaModifier.STATIC ) ); - - requires = requiresIter.next(); - assertEquals( "com.google.common", requires.name() ); - assertTrue( requires.modifiers​().contains( JavaRequires.JavaModifier.STATIC ) ); + assertEquals( expectedRequires, descriptor.requires() ); } @Test( expected = NoSuchFileException.class ) From 797a5f0aa31d0410aec22b752a1e70cc5b622536 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Sun, 20 May 2018 11:17:11 +0200 Subject: [PATCH 5/6] #5 Use the Java 9 API to parse module descriptors --- .../plexus/languages/java/jpms/BinaryModuleInfoParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java index d25b041..2bb36d9 100644 --- a/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java +++ b/plexus-java/src/main/java9/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParser.java @@ -27,7 +27,7 @@ import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.Builder; -class BinaryModuleInfoParser extends BaseBinaryModuleInfoParser +class BinaryModuleInfoParser extends AbstractBinaryModuleInfoParser { @Override JavaModuleDescriptor parse( InputStream in ) throws IOException From dfe69b8089e6fabb6fb3671a41a972423abc808f Mon Sep 17 00:00:00 2001 From: rfscholte Date: Mon, 21 May 2018 15:15:27 +0200 Subject: [PATCH 6/6] #5 Use the Java 9 API to parse module descriptors Extend plexus-release profile with Java 9 check --- pom.xml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pom.xml b/pom.xml index ebbb5ed..b0960ed 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,16 @@ true + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0 + @@ -67,4 +77,34 @@ + + + + plexus-release + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M1 + + + enforce-java + + enforce + + + + + 9 + + + + + + + + + +