Skip to content

Commit

Permalink
Merge pull request #53 from OskarKjellin/java11
Browse files Browse the repository at this point in the history
Make plugin work on java11
  • Loading branch information
mattnworb committed May 6, 2019
2 parents fd349fe + 8b74f55 commit cee3cc7
Show file tree
Hide file tree
Showing 21 changed files with 293 additions and 47 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ language: java

jdk:
- oraclejdk8
- openjdk11

after_success:
# Generate test coverage data with Cobertura and send the results to Coveralls.
Expand Down
1 change: 0 additions & 1 deletion checkstyle.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

<module name="TreeWalker">
<module name="SuppressionCommentFilter"/>
<property name="cacheFile" value="${checkstyle.cache.file}"/>
<!--module name="ConstantName"/-->
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
Expand Down
7 changes: 6 additions & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,15 @@
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-tree</artifactId>
<version>5.0.4</version>
<version>7.1</version>
</dependency>
<dependency>
<groupId>io.norberg</groupId>
Expand Down
95 changes: 95 additions & 0 deletions core/src/main/java/com/spotify/missinglink/Java9ModuleLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* Copyright (c) 2019 Spotify AB
*
* Licensed 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.
*/
package com.spotify.missinglink;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.spotify.missinglink.datamodel.Artifact;
import com.spotify.missinglink.datamodel.ArtifactBuilder;
import com.spotify.missinglink.datamodel.ArtifactName;
import com.spotify.missinglink.datamodel.ClassTypeDescriptor;
import com.spotify.missinglink.datamodel.DeclaredClass;
import com.spotify.missinglink.datamodel.TypeDescriptors;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java9ModuleLoader {

public static ImmutableList<Artifact> getJava9ModuleArtifacts(BiConsumer<String, Exception> log) {
ImmutableList.Builder<Artifact> builder = ImmutableList.builder();
try {

final Class moduleFinderClass = Class.forName("java.lang.module.ModuleFinder");
final Object systemModuleFinder = moduleFinderClass.getMethod("ofSystem").invoke(null);
final Set moduleReferences = (Set) moduleFinderClass.getMethod("findAll")
.invoke(systemModuleFinder);
final Class moduleReferenceClass = Class.forName("java.lang.module.ModuleReference");
final Class moduleReaderClass = Class.forName("java.lang.module.ModuleReader");
for (final Object moduleReference : moduleReferences) {
final Object descriptor = moduleReferenceClass.getMethod("descriptor")
.invoke(moduleReference);
final String moduleName =
String.valueOf(
descriptor
.getClass()
.getMethod("name")
.invoke(descriptor));
Object reader = moduleReferenceClass.getMethod("open").invoke(moduleReference);
try {
final ArtifactName name = new ArtifactName(moduleName);
ImmutableMap.Builder<ClassTypeDescriptor, DeclaredClass> classes = ImmutableMap.builder();
final List<String> readerList =
((Stream<String>) moduleReaderClass.getMethod("list").invoke(reader))
.filter(className -> className.endsWith(".class"))
.collect(Collectors.toList());

for (String className : readerList) {
final Optional<InputStream> opened =
(Optional<InputStream>) moduleReaderClass.getMethod("open", String.class)
.invoke(reader, className);
if (!opened.isPresent()) {
continue;
}
try (InputStream inputStream = opened.get()) {
DeclaredClass declaredClass = ClassLoader.load(inputStream);
classes.put(TypeDescriptors.fromClassName(className), declaredClass);
} catch (Exception e) {
log.accept("Could not read class " + className, e);
}
}
builder.add(new ArtifactBuilder().name(name).classes(classes.build()).build());
} finally {
try {
moduleReaderClass.getMethod("close").invoke(reader);
} catch (InvocationTargetException | NoSuchMethodException | SecurityException |
IllegalAccessException e) {
log.accept("Could not close reader", e);
}
}
}
} catch (InvocationTargetException | NoSuchMethodException |
IllegalAccessException | ClassNotFoundException e) {
log.accept("Could not read java 9 modules", e);
}
return builder.build();
}
}
19 changes: 13 additions & 6 deletions core/src/test/java/com/spotify/missinglink/ClassLoadingUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
package com.spotify.missinglink;

import com.google.common.collect.ImmutableList;

import com.spotify.missinglink.datamodel.Artifact;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
Expand Down Expand Up @@ -50,12 +48,21 @@ public static FileInputStream findClass(Class<?> aClass) throws Exception {

public static List<Artifact> bootstrapArtifacts() {
if (bootstrapArtifacts.get() == null) {
String bootstrapClasspath = System.getProperty("sun.boot.class.path");

ImmutableList<Artifact> artifacts = constructArtifacts(Arrays.asList(
bootstrapClasspath.split(System.getProperty("path.separator"))));
String bootstrapClasspath = System.getProperty("sun.boot.class.path");

bootstrapArtifacts.set(artifacts);
if (bootstrapClasspath != null) {
ImmutableList<Artifact> artifacts = ImmutableList.copyOf(constructArtifacts(Arrays.asList(
bootstrapClasspath.split(System.getProperty("path.separator"))))
.stream()
.filter(c -> !c.name().name().equals("test-classes"))
.collect(Collectors.toList()));
bootstrapArtifacts.set(artifacts);
} else {
ImmutableList<Artifact> artifacts = Java9ModuleLoader
.getJava9ModuleArtifacts((s, ex) -> ex.printStackTrace());
bootstrapArtifacts.set(artifacts);
}
}
return bootstrapArtifacts.get();
}
Expand Down
36 changes: 17 additions & 19 deletions core/src/test/java/com/spotify/missinglink/FeatureTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,23 @@
*/
package com.spotify.missinglink;

import static com.spotify.missinglink.ClassLoader.load;
import static com.spotify.missinglink.ClassLoadingUtil.findClass;
import static com.spotify.missinglink.Simple.INT;
import static com.spotify.missinglink.Simple.STRING;
import static com.spotify.missinglink.Simple.VOID;
import static com.spotify.missinglink.Simple.array;
import static com.spotify.missinglink.Simple.methodMap;
import static com.spotify.missinglink.Simple.newAccess;
import static com.spotify.missinglink.Simple.newArtifact;
import static com.spotify.missinglink.Simple.newCall;
import static com.spotify.missinglink.Simple.newClass;
import static com.spotify.missinglink.Simple.newMethod;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

import com.spotify.missinglink.Conflict.ConflictCategory;
import com.spotify.missinglink.datamodel.AccessedField;
import com.spotify.missinglink.datamodel.Artifact;
Expand All @@ -30,26 +44,9 @@
import com.spotify.missinglink.datamodel.FieldDependencyBuilder;
import com.spotify.missinglink.datamodel.MethodDependencyBuilder;
import com.spotify.missinglink.datamodel.TypeDescriptors;

import org.junit.Test;

import java.util.Arrays;
import java.util.Collections;

import static com.spotify.missinglink.ClassLoader.load;
import static com.spotify.missinglink.ClassLoadingUtil.findClass;
import static com.spotify.missinglink.Simple.INT;
import static com.spotify.missinglink.Simple.STRING;
import static com.spotify.missinglink.Simple.VOID;
import static com.spotify.missinglink.Simple.array;
import static com.spotify.missinglink.Simple.methodMap;
import static com.spotify.missinglink.Simple.newAccess;
import static com.spotify.missinglink.Simple.newArtifact;
import static com.spotify.missinglink.Simple.newCall;
import static com.spotify.missinglink.Simple.newClass;
import static com.spotify.missinglink.Simple.newMethod;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class FeatureTest {

Expand Down Expand Up @@ -403,6 +400,7 @@ class LacksParent extends LostParent {
assertThat(conflictChecker.check(artifact,
ImmutableList.of(artifact),
allArtifacts))

.containsExactly(expectedConflict);
}

Expand Down
2 changes: 1 addition & 1 deletion maven-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.3</version>
<version>3.6.0</version>
<configuration>
<extractors>
<extractor>java-annotations</extractor>
Expand Down
16 changes: 16 additions & 0 deletions maven-plugin/src/it/00-test-harness/a-class-duplicate/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,21 @@
<groupId>com.spotify.missinglink.tests</groupId>
<artifactId>a-class-duplicate</artifactId>
<version>1-SNAPSHOT</version>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

</project>
16 changes: 16 additions & 0 deletions maven-plugin/src/it/00-test-harness/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,21 @@
<module>a-class-duplicate</module>
<module>b</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

10 changes: 10 additions & 0 deletions maven-plugin/src/it/class-missing/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/field-removed/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/instantiate-with-method-missing/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/library-invokes-removed-method/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/method-became-inaccessible/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/method-removed/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
10 changes: 10 additions & 0 deletions maven-plugin/src/it/return-type-change/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<source>8</source>
<target>8</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
</build>
</project>
Loading

0 comments on commit cee3cc7

Please sign in to comment.