Skip to content

Commit

Permalink
Remove the need for a new BytecodeRecorder
Browse files Browse the repository at this point in the history
  • Loading branch information
geoand committed Mar 9, 2019
1 parent 525c90d commit 049cf23
Show file tree
Hide file tree
Showing 12 changed files with 117 additions and 156 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem;
import io.quarkus.deployment.builditem.CapabilityBuildItem;
import io.quarkus.deployment.builditem.ConfigurationBuildItem;
import io.quarkus.deployment.builditem.MainAfterStartupBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.MainBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.StaticBytecodeRecorderBuildItem;
import io.quarkus.deployment.recording.BytecodeRecorderImpl;
Expand Down Expand Up @@ -284,21 +283,10 @@ public static Consumer<BuildChainBuilder> loadStepsFrom(Class<?> clazz) {
assert recordAnnotation != null;
final ExecutionTime executionTime = recordAnnotation.value();
final boolean optional = recordAnnotation.optional();
methodStepConfig = methodStepConfig.andThen(bsb -> {
Class<? extends BuildItem> buildItem = executionTime == ExecutionTime.STATIC_INIT
? StaticBytecodeRecorderBuildItem.class
: MainBytecodeRecorderBuildItem.class;
if (executionTime == ExecutionTime.STATIC_INIT) {
buildItem = StaticBytecodeRecorderBuildItem.class;
} else if (executionTime == ExecutionTime.RUNTIME_INIT) {
buildItem = MainBytecodeRecorderBuildItem.class;
} else if (executionTime == ExecutionTime.AFTER_STARTUP) {
buildItem = MainAfterStartupBytecodeRecorderBuildItem.class;
}
bsb.produces(
buildItem,
optional ? ProduceFlags.of(ProduceFlag.WEAK) : ProduceFlags.NONE);
});
methodStepConfig = methodStepConfig.andThen(bsb -> bsb.produces(
executionTime == ExecutionTime.STATIC_INIT ? StaticBytecodeRecorderBuildItem.class
: MainBytecodeRecorderBuildItem.class,
optional ? ProduceFlags.of(ProduceFlag.WEAK) : ProduceFlags.NONE));
}
boolean methodConsumingConfig = consumingConfig;
if (methodParameters.length == 0) {
Expand Down Expand Up @@ -461,10 +449,8 @@ public void execute(final BuildContext bc) {
// commit recorded data
if (recordAnnotation.value() == ExecutionTime.STATIC_INIT) {
bc.produce(new StaticBytecodeRecorderBuildItem(bri));
} else if (recordAnnotation.value() == ExecutionTime.RUNTIME_INIT) {
} else {
bc.produce(new MainBytecodeRecorderBuildItem(bri));
} else if (recordAnnotation.value() == ExecutionTime.AFTER_STARTUP) {
bc.produce(new MainAfterStartupBytecodeRecorderBuildItem(bri));
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.builditem.MainArgsBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.substrate.SubstrateResourceBuildItem;
import io.quarkus.runtime.LaunchMode;
Expand Down Expand Up @@ -77,7 +76,6 @@ public BuildResult run() throws Exception {
.addInitial(SubstrateResourceBuildItem.class)
.addInitial(ArchiveRootBuildItem.class)
.addInitial(ShutdownContextBuildItem.class)
.addInitial(MainArgsBuildItem.class)
.addInitial(ClassOutputBuildItem.class)
.addInitial(LaunchModeBuildItem.class)
.addInitial(ExtensionClassLoaderBuildItem.class);
Expand All @@ -99,7 +97,6 @@ public BuildResult run() throws Exception {
.produce(new ArchiveRootBuildItem(root))
.produce(new ClassOutputBuildItem(output))
.produce(new ShutdownContextBuildItem())
.produce(new MainArgsBuildItem())
.produce(new LaunchModeBuildItem(launchMode))
.produce(new ExtensionClassLoaderBuildItem(classLoader))
.execute();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,5 @@ public enum ExecutionTime {
/**
* The bytecode is run from a main method
*/
RUNTIME_INIT,

/**
* The bytecode is run from a main method after all RUNTIME_INIT
*/
AFTER_STARTUP
RUNTIME_INIT
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.quarkus.deployment.builditem;

import java.util.function.Consumer;

import org.jboss.builder.item.SimpleBuildItem;

import io.quarkus.gizmo.MethodCreator;
import io.quarkus.gizmo.ResultHandle;

public final class MainAfterStartupBuildItem extends SimpleBuildItem {

private final Consumer<Input> bytecodeCreator;

public MainAfterStartupBuildItem(Consumer<Input> bytecodeCreator) {
this.bytecodeCreator = bytecodeCreator;
}

public Consumer<Input> getBytecodeCreator() {
return bytecodeCreator;
}

public static class Input {
private final MethodCreator doStartMethod;
private final ResultHandle mainArgs;

public Input(MethodCreator doStartMethod, ResultHandle mainArgs) {
this.doStartMethod = doStartMethod;
this.mainArgs = mainArgs;
}

public MethodCreator getDoStartMethod() {
return doStartMethod;
}

public ResultHandle getMainArgs() {
return mainArgs;
}
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
import io.quarkus.deployment.builditem.ClassOutputBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.JavaLibraryPathAdditionalPathBuildItem;
import io.quarkus.deployment.builditem.MainAfterStartupBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.MainAfterStartupBuildItem;
import io.quarkus.deployment.builditem.MainBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.MainClassBuildItem;
import io.quarkus.deployment.builditem.ObjectSubstitutionBuildItem;
Expand Down Expand Up @@ -72,13 +72,13 @@ class MainClassBuildStep {
MainClassBuildItem build(List<StaticBytecodeRecorderBuildItem> staticInitTasks,
List<ObjectSubstitutionBuildItem> substitutions,
List<MainBytecodeRecorderBuildItem> mainMethod,
List<MainAfterStartupBytecodeRecorderBuildItem> mainMethodAfterStartup,
List<SystemPropertyBuildItem> properties,
List<JavaLibraryPathAdditionalPathBuildItem> javaLibraryPathAdditionalPaths,
Optional<SslTrustStoreSystemPropertyBuildItem> sslTrustStoreSystemProperty,
List<FeatureBuildItem> features,
BuildProducer<ApplicationClassNameBuildItem> appClassNameProducer,
List<BytecodeRecorderObjectLoaderBuildItem> loaders,
Optional<MainAfterStartupBuildItem> mainAfterStartupBuildItem,
Optional<ShutdownBuildItem> shutdownBuildItem,
ClassOutputBuildItem classOutput) {

Expand Down Expand Up @@ -192,9 +192,6 @@ MainClassBuildItem build(List<StaticBytecodeRecorderBuildItem> staticInitTasks,
mv.invokeStaticMethod(ofMethod(Timing.class, "mainStarted", void.class));
startupContext = mv.readStaticField(scField.getFieldDescriptor());

mv.invokeVirtualMethod(ofMethod(StartupContext.class, "setMainArgs", void.class, String[].class),
startupContext, mainMethodArgs);

tryBlock = mv.tryBlock();
for (MainBytecodeRecorderBuildItem holder : mainMethod) {
final BytecodeRecorderImpl recorder = holder.getBytecodeRecorder();
Expand Down Expand Up @@ -224,17 +221,9 @@ MainClassBuildItem build(List<StaticBytecodeRecorderBuildItem> staticInitTasks,
cb.throwException(RuntimeException.class, "Failed to start quarkus", cb.getCaughtException());

// Application.class: start method after startup
for (MainAfterStartupBytecodeRecorderBuildItem holder : mainMethodAfterStartup) {
final BytecodeRecorderImpl recorder = holder.getBytecodeRecorder();
if (!recorder.isEmpty()) {
for (BytecodeRecorderObjectLoaderBuildItem item : loaders) {
recorder.registerObjectLoader(item.getObjectLoader());
}
recorder.writeBytecode(classOutput.getClassOutput());
ResultHandle dup = mv.newInstance(ofConstructor(recorder.getClassName()));
mv.invokeInterfaceMethod(ofMethod(StartupTask.class, "deploy", void.class, StartupContext.class), dup,
startupContext);
}
if (mainAfterStartupBuildItem.isPresent()) {
mainAfterStartupBuildItem.get().getBytecodeCreator().accept(
new MainAfterStartupBuildItem.Input(mv, mainMethodArgs));
}

mv.returnValue(null);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,6 @@ public StartupContext() {
values.put(ShutdownContext.class.getName(), shutdownContext);
}

public void setMainArgs(final String[] args) {
values.put(MainArgsSupplier.class.getName(), new MainArgsSupplier() {
@Override
public String[] getArgs() {
return args;
}
});
}

public void putValue(String name, Object value) {
values.put(name, value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package io.quarkus.clrunner.deployment;

import org.jboss.builder.item.MultiBuildItem;
import org.jboss.builder.item.SimpleBuildItem;

public final class CommandLineRunnerBuildItem extends MultiBuildItem {
public final class CommandLineRunnerBuildItem extends SimpleBuildItem {

private final String className;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,68 +1,104 @@
package io.quarkus.clrunner.deployment;

import static io.quarkus.gizmo.MethodDescriptor.ofMethod;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Optional;
import java.util.function.Consumer;

import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;

import io.quarkus.arc.Arc;
import io.quarkus.arc.ArcContainer;
import io.quarkus.arc.InstanceHandle;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.BeanContainerBuildItem;
import io.quarkus.clrunner.CommandLineRunner;
import io.quarkus.clrunner.runtime.CommandLineRunnerTemplate;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.MainArgsBuildItem;
import io.quarkus.deployment.builditem.MainAfterStartupBuildItem;
import io.quarkus.deployment.builditem.ShutdownBuildItem;
import io.quarkus.deployment.recording.RecorderContext;
import io.quarkus.gizmo.MethodCreator;
import io.quarkus.gizmo.MethodDescriptor;
import io.quarkus.gizmo.ResultHandle;

public class CommandLineRunnerProcessor {

private static final DotName COMMAND_LINER_RUNNER = DotName.createSimple(CommandLineRunner.class.getName());

@BuildStep
List<CommandLineRunnerBuildItem> discover(CombinedIndexBuildItem combinedIndexBuildItem) {
final List<CommandLineRunnerBuildItem> result = new ArrayList<>();
void discover(CombinedIndexBuildItem combinedIndexBuildItem,
BuildProducer<CommandLineRunnerBuildItem> producer) {
final List<String> names = new ArrayList<>();

for (ClassInfo info : combinedIndexBuildItem.getIndex().getAllKnownImplementors(COMMAND_LINER_RUNNER)) {
final DotName name = info.name();
names.add(name.toString());
}

result.add(new CommandLineRunnerBuildItem(name.toString()));
if (names.size() == 0) {
return;
}
return result;
if (names.size() > 1) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String name : names) {
if (first) {
first = false;
} else {
sb.append(",");
}
sb.append(name);
}
throw new RuntimeException("Multiple classes ( " + sb.toString()
+ ") have been annotated with @ApplicationPath which is currently not supported");
}

producer.produce(new CommandLineRunnerBuildItem(names.get(0)));
}

@BuildStep
List<AdditionalBeanBuildItem> beans(List<CommandLineRunnerBuildItem> runners) {
final List<AdditionalBeanBuildItem> result = new ArrayList<>();
for (CommandLineRunnerBuildItem runner : runners) {
result.add(new AdditionalBeanBuildItem(false, runner.getClassName()));
void beans(Optional<CommandLineRunnerBuildItem> runner, BuildProducer<AdditionalBeanBuildItem> producer) {
if (runner.isPresent()) {
producer.produce(new AdditionalBeanBuildItem(false, runner.get().getClassName()));
}
return result;
}

@BuildStep
ShutdownBuildItem shutdown() {
void shutdown(BuildProducer<ShutdownBuildItem> producer) {
// TODO: this has to be conditional only set when various things are not present
return new ShutdownBuildItem();
producer.produce(new ShutdownBuildItem());
}

@BuildStep
@Record(ExecutionTime.AFTER_STARTUP)
public void runners(List<CommandLineRunnerBuildItem> runners,
BeanContainerBuildItem beanContainerBuildItem,
MainArgsBuildItem mainArgsBuildItem,
CommandLineRunnerTemplate template,
RecorderContext context) {
void bytecodeCreation(Optional<CommandLineRunnerBuildItem> bi, BuildProducer<MainAfterStartupBuildItem> producer) {
if (bi.isPresent()) {
final Consumer<MainAfterStartupBuildItem.Input> bytecodeCreator = new Consumer<MainAfterStartupBuildItem.Input>() {
@Override
public void accept(MainAfterStartupBuildItem.Input input) {
MethodCreator mv = input.getDoStartMethod();
ResultHandle clazz = mv.invokeStaticMethod(
ofMethod(Class.class, "forName", Class.class, String.class),
mv.load(bi.get().getClassName()));
ResultHandle arcContainer = mv.invokeStaticMethod(
MethodDescriptor.ofMethod(Arc.class, "container", ArcContainer.class));
ResultHandle instanceHandle = mv.invokeInterfaceMethod(
MethodDescriptor.ofMethod(ArcContainer.class, "instance", InstanceHandle.class, Class.class,
Annotation[].class),
arcContainer, clazz, mv.newArray(Annotation.class, mv.load(0)));
ResultHandle runner = mv.invokeInterfaceMethod(
ofMethod(InstanceHandle.class, "get", Object.class),
instanceHandle);
mv.invokeInterfaceMethod(
MethodDescriptor.ofMethod(CommandLineRunner.class, "run", void.class, String[].class),
runner, input.getMainArgs());
}
};

Set<Class<? extends CommandLineRunner>> runnerClasses = new HashSet<>();
for (CommandLineRunnerBuildItem runner : runners) {
runnerClasses.add((Class<? extends CommandLineRunner>) context.classProxy(runner.getClassName()));
producer.produce(new MainAfterStartupBuildItem(bytecodeCreator));
}
template.run(runnerClasses, beanContainerBuildItem.getValue(), mainArgsBuildItem);
}
}
Loading

0 comments on commit 049cf23

Please sign in to comment.