in maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java [238:495]
public void beforeEach(ExtensionContext context) throws Exception {
if (pluginBasedir == null) {
pluginBasedir = MavenDIExtension.getBasedir();
}
basedir = AnnotationSupport.findAnnotation(context.getElement().get(), Basedir.class)
.map(Basedir::value)
.orElse(pluginBasedir);
if (basedir != null) {
if (basedir.isEmpty()) {
basedir = pluginBasedir + "/target/tests/"
+ context.getRequiredTestClass().getSimpleName() + "/"
+ context.getRequiredTestMethod().getName();
} else {
basedir = basedir.replace("${basedir}", pluginBasedir);
}
}
setContext(context);
/*
binder.install(ProviderMethodsModule.forObject(context.getRequiredTestInstance()));
binder.requestInjection(context.getRequiredTestInstance());
binder.bind(Log.class).toInstance(new DefaultLog(LoggerFactory.getLogger("anonymous")));
binder.bind(ExtensionContext.class).toInstance(context);
// Load maven 4 api Services interfaces and try to bind them to the (possible) mock instances
// returned by the (possibly) mock InternalSession
try {
for (ClassPath.ClassInfo clazz :
ClassPath.from(getClassLoader()).getAllClasses()) {
if ("org.apache.maven.api.services".equals(clazz.getPackageName())) {
Class<?> load = clazz.load();
if (Service.class.isAssignableFrom(load)) {
Class<Service> svc = (Class) load;
binder.bind(svc).toProvider(() -> {
try {
return getContainer()
.lookup(InternalSession.class)
.getService(svc);
} catch (ComponentLookupException e) {
throw new RuntimeException("Unable to lookup service " + svc.getName());
}
});
}
}
}
} catch (Exception e) {
throw new RuntimeException("Unable to bind session services", e);
}
*/
Path basedirPath = Paths.get(getBasedir());
InjectMojo mojo = AnnotationSupport.findAnnotation(context.getElement().get(), InjectMojo.class)
.orElse(null);
Model defaultModel = Model.newBuilder()
.groupId("myGroupId")
.artifactId("myArtifactId")
.version("1.0-SNAPSHOT")
.packaging("jar")
.build(Build.newBuilder()
.directory(basedirPath.resolve("target").toString())
.outputDirectory(basedirPath.resolve("target/classes").toString())
.sourceDirectory(basedirPath.resolve("src/main/java").toString())
.testSourceDirectory(
basedirPath.resolve("src/test/java").toString())
.testOutputDirectory(
basedirPath.resolve("target/test-classes").toString())
.build())
.build();
Path[] modelPath = new Path[] {null};
Model tmodel = null;
if (mojo != null) {
String pom = mojo.pom();
if (pom != null && !pom.isEmpty()) {
try (Reader r = openPomUrl(context.getRequiredTestClass(), pom, modelPath)) {
tmodel = new MavenStaxReader().read(r);
}
} else {
Path pomPath = basedirPath.resolve("pom.xml");
if (Files.exists(pomPath)) {
try (Reader r = Files.newBufferedReader(pomPath)) {
tmodel = new MavenStaxReader().read(r);
modelPath[0] = pomPath;
}
}
}
}
Model model;
if (tmodel == null) {
model = defaultModel;
} else {
model = new MavenMerger().merge(tmodel, defaultModel, false, null);
}
tmodel = new DefaultModelPathTranslator(new DefaultPathTranslator())
.alignToBaseDirectory(tmodel, Paths.get(getBasedir()), null);
context.getStore(ExtensionContext.Namespace.GLOBAL).put(Model.class, tmodel);
// mojo execution
// Map<Object, Object> map = getInjector().getContext().getContextData();
PluginDescriptor pluginDescriptor;
ClassLoader classLoader = context.getRequiredTestClass().getClassLoader();
try (InputStream is = requireNonNull(
classLoader.getResourceAsStream(getPluginDescriptorLocation()),
"Unable to find plugin descriptor: " + getPluginDescriptorLocation());
Reader reader = new BufferedReader(new XmlStreamReader(is))) {
// new InterpolationFilterReader(reader, map, "${", "}");
pluginDescriptor = new PluginDescriptorStaxReader().read(reader);
}
context.getStore(ExtensionContext.Namespace.GLOBAL).put(PluginDescriptor.class, pluginDescriptor);
// for (ComponentDescriptor<?> desc : pluginDescriptor.getComponents()) {
// getContainer().addComponentDescriptor(desc);
// }
@SuppressWarnings({"unused", "MagicNumber"})
class Foo {
@Provides
@Singleton
@Priority(-10)
private InternalSession createSession() {
return SessionMock.getMockSession(getBasedir());
}
@Provides
@Singleton
@Priority(-10)
private Project createProject(InternalSession s) {
ProjectStub stub = new ProjectStub();
if (!"pom".equals(model.getPackaging())) {
ProducedArtifactStub artifact = new ProducedArtifactStub(
model.getGroupId(), model.getArtifactId(), "", model.getVersion(), model.getPackaging());
stub.setMainArtifact(artifact);
}
stub.setModel(model);
stub.setBasedir(Paths.get(MojoExtension.getBasedir()));
stub.setPomPath(modelPath[0]);
s.getService(ArtifactManager.class).setPath(stub.getPomArtifact(), modelPath[0]);
return stub;
}
@Provides
@Singleton
@Priority(-10)
private MojoExecution createMojoExecution() {
MojoExecutionStub mes = new MojoExecutionStub("executionId", null);
if (mojo != null) {
String goal = mojo.goal();
int idx = goal.lastIndexOf(':');
if (idx >= 0) {
goal = goal.substring(idx + 1);
}
mes.setGoal(goal);
for (MojoDescriptor md : pluginDescriptor.getMojos()) {
if (goal.equals(md.getGoal())) {
mes.setDescriptor(md);
}
}
requireNonNull(mes.getDescriptor());
}
PluginStub plugin = new PluginStub();
plugin.setDescriptor(pluginDescriptor);
mes.setPlugin(plugin);
return mes;
}
@Provides
@Singleton
@Priority(-10)
private Log createLog() {
return new DefaultLog(LoggerFactory.getLogger("anonymous"));
}
@Provides
static RepositorySystemSupplier newRepositorySystemSupplier() {
return new RepositorySystemSupplier();
}
@Provides
static RepositorySystem newRepositorySystem(RepositorySystemSupplier repositorySystemSupplier) {
return repositorySystemSupplier.getRepositorySystem();
}
@Provides
@Priority(10)
static RepositoryFactory newRepositoryFactory(Session session) {
return session.getService(RepositoryFactory.class);
}
@Provides
@Priority(10)
static VersionParser newVersionParser(Session session) {
return session.getService(VersionParser.class);
}
@Provides
@Priority(10)
static LocalRepositoryManager newLocalRepositoryManager(Session session) {
return session.getService(LocalRepositoryManager.class);
}
@Provides
@Priority(10)
static ArtifactInstaller newArtifactInstaller(Session session) {
return session.getService(ArtifactInstaller.class);
}
@Provides
@Priority(10)
static ArtifactDeployer newArtifactDeployer(Session session) {
return session.getService(ArtifactDeployer.class);
}
@Provides
@Priority(10)
static ArtifactManager newArtifactManager(Session session) {
return session.getService(ArtifactManager.class);
}
@Provides
@Priority(10)
static ProjectManager newProjectManager(Session session) {
return session.getService(ProjectManager.class);
}
@Provides
@Priority(10)
static ArtifactFactory newArtifactFactory(Session session) {
return session.getService(ArtifactFactory.class);
}
@Provides
@Priority(10)
static ProjectBuilder newProjectBuilder(Session session) {
return session.getService(ProjectBuilder.class);
}
@Provides
@Priority(10)
static ModelXmlFactory newModelXmlFactory(Session session) {
return session.getService(ModelXmlFactory.class);
}
}
getInjector().bindInstance(Foo.class, new Foo());
getInjector().injectInstance(context.getRequiredTestInstance());
// SessionScope sessionScope = getInjector().getInstance(SessionScope.class);
// sessionScope.enter();
// sessionScope.seed(Session.class, s);
// sessionScope.seed(InternalSession.class, s);
// MojoExecutionScope mojoExecutionScope = getInjector().getInstance(MojoExecutionScope.class);
// mojoExecutionScope.enter();
// mojoExecutionScope.seed(Project.class, p);
// mojoExecutionScope.seed(MojoExecution.class, me);
}