Skip to content

Commit

Permalink
Merge pull request #2332 from mkouba/issue-2319
Browse files Browse the repository at this point in the history
Dev mode - identify classes generated from all hot deployment paths
  • Loading branch information
dmlloyd committed May 9, 2019
2 parents 886953b + d63fa2f commit a841a65
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.quarkus.deployment.builditem;

import java.util.function.Predicate;

import io.quarkus.builder.item.MultiBuildItem;

/**
* Makes it possible to identify wiring classes generated for classes from additional hot deployment paths.
*/
public final class ApplicationClassPredicateBuildItem extends MultiBuildItem {

private final Predicate<String> predicate;

public ApplicationClassPredicateBuildItem(Predicate<String> predicate) {
this.predicate = predicate;
}

public boolean test(String name) {
return predicate.test(name);
}

}
42 changes: 41 additions & 1 deletion core/devmode/src/main/java/io/quarkus/dev/DevModeMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,22 @@
import java.io.ObjectInputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.LockSupport;
import java.util.function.Consumer;
import java.util.logging.Handler;

import org.jboss.logging.Logger;

import io.quarkus.builder.BuildChainBuilder;
import io.quarkus.builder.BuildContext;
import io.quarkus.builder.BuildStep;
import io.quarkus.deployment.builditem.ApplicationClassPredicateBuildItem;
import io.quarkus.runner.RuntimeRunner;
import io.quarkus.runtime.LaunchMode;
import io.quarkus.runtime.Timing;
Expand Down Expand Up @@ -121,11 +130,30 @@ private static synchronized void doStart() {
.setTarget(classesRoot.toPath())
.setFrameworkClassesPath(wiringDir.toPath())
.setTransformerCache(cacheDir.toPath());

List<Path> addAdditionalHotDeploymentPaths = new ArrayList<>();
for (DevModeContext.ModuleInfo i : context.getModules()) {
if (i.getClassesPath() != null) {
builder.addAdditionalHotDeploymentPath(Paths.get(i.getClassesPath()));
Path classesPath = Paths.get(i.getClassesPath());
addAdditionalHotDeploymentPaths.add(classesPath);
builder.addAdditionalHotDeploymentPath(classesPath);
}
}
// Make it possible to identify wiring classes generated for classes from additional hot deployment paths
builder.addChainCustomizer(new Consumer<BuildChainBuilder>() {
@Override
public void accept(BuildChainBuilder buildChainBuilder) {
buildChainBuilder.addBuildStep(new BuildStep() {
@Override
public void execute(BuildContext context) {
context.produce(new ApplicationClassPredicateBuildItem(n -> {
return getClassInApplicationClassPaths(n, addAdditionalHotDeploymentPaths) != null;
}));
}
}).produces(ApplicationClassPredicateBuildItem.class).build();
}
});

RuntimeRunner runner = builder
.build();
runner.run();
Expand Down Expand Up @@ -166,4 +194,16 @@ public static synchronized void restartApp() {
public static ClassLoader getCurrentAppClassLoader() {
return currentAppClassLoader;
}

private static Path getClassInApplicationClassPaths(String name, List<Path> addAdditionalHotDeploymentPaths) {
final String fileName = name.replace('.', '/') + ".class";
Path classLocation;
for (Path i : addAdditionalHotDeploymentPaths) {
classLocation = i.resolve(fileName);
if (Files.exists(classLocation)) {
return classLocation;
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
import io.quarkus.deployment.builditem.ApplicationClassPredicateBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
Expand Down Expand Up @@ -128,6 +129,7 @@ public BeanContainerBuildItem build(ArcDeploymentTemplate arcTemplate,
ApplicationArchivesBuildItem applicationArchivesBuildItem,
List<AnnotationsTransformerBuildItem> annotationTransformers,
ShutdownContextBuildItem shutdown, List<AdditionalStereotypeBuildItem> additionalStereotypeBuildItems,
List<ApplicationClassPredicateBuildItem> applicationClassPredicates,
BuildProducer<FeatureBuildItem> feature)
throws Exception {

Expand All @@ -146,6 +148,14 @@ public boolean test(DotName dotName) {
if (generatedClassNames.contains(dotName)) {
return true;
}
if (!applicationClassPredicates.isEmpty()) {
String className = dotName.toString();
for (ApplicationClassPredicateBuildItem predicate : applicationClassPredicates) {
if (predicate.test(className)) {
return true;
}
}
}
return false;
}
});
Expand Down

0 comments on commit a841a65

Please sign in to comment.