Skip to content

Commit

Permalink
Using service loader to get Maven plugin context
Browse files Browse the repository at this point in the history
  • Loading branch information
Miquel A. Ferran Gonzalez committed Apr 5, 2021
1 parent 09c05c5 commit bf38cbb
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,20 @@
*/
public interface MavenPluginContext {

/**
* Name used to determine what context implementation must be used.
*
* @return Implementation name.
*/
String getName();

/**
* Set the base directory used where plug-in is executed.
*
* @param baseDir The new base directory. May be {@code null} for default one.
*/
void setBaseDir(File baseDir);

/**
* Set the logger used by the plug-in execution.
*
Expand All @@ -26,7 +33,7 @@ public interface MavenPluginContext {
* Injects a Plexus component with the given role.
*
* @param component Component to be injected.
* @param role Role for component lookup.
* @param role Role for component lookup.
*/
void inject(Object component, String role);

Expand All @@ -38,7 +45,7 @@ public interface MavenPluginContext {
* @return A configurator for the wanted plug-in goal.
*/
MavenPluginGoalConfigurator goal(String name);

/**
* Instantiates a goal configuration.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.github.codeteapot.maven.plugin.testing.junit.jupiter;

import static java.util.ServiceLoader.load;
import static java.util.stream.StreamSupport.stream;

import com.github.codeteapot.maven.plugin.testing.MavenPluginContext;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
Expand All @@ -16,20 +19,17 @@
public final class MavenPluginExtension
implements BeforeEachCallback, AfterEachCallback, ParameterResolver {

private static final String DEFAULT_PLUGIN_CONTEXT_CLASS_NAME =
"com.github.codeteapot.maven.plugin.testing.plexus.PlexusMavenPluginContext";

// private static final Namespace MAVEN_PLUGIN = create(
// "com.github.codeteapot.maven.test");

String pluginContextClassName;
String pluginContextName;
MavenPluginContext pluginContext;

/**
* Default constructor.
*/
public MavenPluginExtension() {
pluginContextClassName = DEFAULT_PLUGIN_CONTEXT_CLASS_NAME;
pluginContextName = null;
pluginContext = null;
}

Expand All @@ -38,7 +38,10 @@ public MavenPluginExtension() {
*/
@Override
public void beforeEach(ExtensionContext context) throws Exception {
pluginContext = (MavenPluginContext) Class.forName(pluginContextClassName).newInstance();
pluginContext = stream(load(MavenPluginContext.class).spliterator(), false)
.filter(this::pluginContextMatch)
.findAny()
.orElseThrow(() -> new IllegalStateException("Maven plugin context is not available"));
}

/**
Expand Down Expand Up @@ -68,4 +71,8 @@ public Object resolveParameter(ParameterContext parameterContext,
ExtensionContext extensionContext) throws ParameterResolutionException {
return pluginContext;
}

private boolean pluginContextMatch(MavenPluginContext context) {
return pluginContextName == null || context.getName().equals(pluginContextName);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.github.codeteapot.maven.plugin.testing.junit.jupiter;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.Mockito.when;
import com.github.codeteapot.maven.plugin.testing.MavenPluginContext;
import org.junit.jupiter.api.Test;
Expand All @@ -13,27 +14,36 @@
@ExtendWith(MockitoExtension.class)
public class MavenPluginExtensionTest {

private static final String PLEXUS_PLUGIN_CONTEXT_CLASS_NAME =
"com.github.codeteapot.maven.plugin.testing.plexus.PlexusMavenPluginContext";
private static final String TEST_PLUGIN_CONTEXT_CLASS_NAME =
"com.github.codeteapot.maven.plugin.testing.junit.jupiter.TestMavenPluginContext";

private static final String TEST_PLUGIN_CONTEXT_NAME = "test";
private static final MavenPluginContext TEST_MAVEN_PLUGIN_CONTEXT = new TestMavenPluginContext();

private static final String UNAVAILABLE_PLUGIN_CONTEXT_NAME = "%%%unavailable%%%";

@Mock
private ExtensionContext extensionContext;

@Test
public void plexusAsDefaultPluginContext() {
public void withoutDefaultPluginContext() {
MavenPluginExtension extension = new MavenPluginExtension();

assertThat(extension.pluginContextClassName).isEqualTo(PLEXUS_PLUGIN_CONTEXT_CLASS_NAME);
assertThat(extension.pluginContextName).isNull();
}

@Test
public void createContextBeforeEachTest() throws Exception {
public void createTestContextBeforeEachTest() throws Exception {
MavenPluginExtension extension = new MavenPluginExtension();
extension.pluginContextName = TEST_PLUGIN_CONTEXT_NAME;
extension.pluginContext = null;

extension.beforeEach(extensionContext);

assertThat(extension.pluginContext).isInstanceOf(TestMavenPluginContext.class);
}

@Test
public void createAnyContextBeforeEachTest() throws Exception {
MavenPluginExtension extension = new MavenPluginExtension();
extension.pluginContextClassName = TEST_PLUGIN_CONTEXT_CLASS_NAME;
extension.pluginContextName = null;
extension.pluginContext = null;

extension.beforeEach(extensionContext);
Expand Down Expand Up @@ -64,16 +74,26 @@ public void supportsMavenPluginContextParameter(

assertThat(supports).isTrue();
}

@Test
public void resolveMavenPluginContextParameter(@Mock ParameterContext parameterContext) {
MavenPluginExtension extension = new MavenPluginExtension();
extension.pluginContext = TEST_MAVEN_PLUGIN_CONTEXT;

Object resolvedParameter = extension.resolveParameter(parameterContext, extensionContext);

assertThat(resolvedParameter).isEqualTo(TEST_MAVEN_PLUGIN_CONTEXT);
}

@Test
public void failWhenPluginContextIsNotAvailable() {
MavenPluginExtension extension = new MavenPluginExtension();
extension.pluginContextName = UNAVAILABLE_PLUGIN_CONTEXT_NAME;

Throwable e = catchThrowable(() -> extension.beforeEach(extensionContext));

assertThat(e).isInstanceOf(IllegalStateException.class);
}

@SuppressWarnings("unused")
private void parameterSupport(MavenPluginContext mavenPluginContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,16 @@
import com.github.codeteapot.maven.plugin.testing.logger.MavenPluginLogger;
import java.io.File;

class TestMavenPluginContext implements MavenPluginContext {
public class TestMavenPluginContext implements MavenPluginContext {

TestMavenPluginContext() {}
private static final String NAME = "test";

public TestMavenPluginContext() {}

@Override
public String getName() {
return NAME;
}

@Override
public void setBaseDir(File baseDir) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.github.codeteapot.maven.plugin.testing.junit.jupiter.TestMavenPluginContext
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*/
public class PlexusMavenPluginContext implements MavenPluginContext {

private static final String NAME = "plexus";
private static final String DESCRIPTOR_PATH = "/META-INF/maven/plugin.xml";

private final Set<PlexusInjectionCommand> injectionCommandSet;
Expand All @@ -29,6 +30,11 @@ public PlexusMavenPluginContext() {
logger = null;
descriptorPath = DESCRIPTOR_PATH;
}

@Override
public String getName() {
return NAME;
}

@Override
public void setBaseDir(File baseDir) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.github.codeteapot.maven.plugin.testing.plexus.PlexusMavenPluginContext
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@
import static com.github.codeteapot.maven.plugin.testing.logger.MavenPluginLoggerMessageLevel.LOG_WARN;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static java.util.ServiceLoader.load;
import static java.util.stream.StreamSupport.stream;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.when;
import com.github.codeteapot.maven.plugin.testing.MavenPluginContext;
import com.github.codeteapot.maven.plugin.testing.logger.MavenPluginLogger;
import java.io.BufferedReader;
import java.io.File;
Expand All @@ -33,6 +36,8 @@
@ExtendWith(MockitoExtension.class)
public class PlexusMavenPluginContextTest {

private static final String PLEXUS_PLUGIN_CONTEXT_NAME = "plexus";

private static final String OPERATION_FACTORY_ROLE =
"com.github.codeteapot.maven.plugin.testing.plexus.OperationFactory";

Expand All @@ -50,6 +55,7 @@ public class PlexusMavenPluginContextTest {

private static final String SOME_OPERAND_VALUE = "1";


private PlexusMavenPluginContext context;

@Mock
Expand All @@ -62,7 +68,11 @@ public class PlexusMavenPluginContextTest {

@BeforeEach
public void setUp(@TempDir File baseDir) {
context = new PlexusMavenPluginContext();
context = stream(load(MavenPluginContext.class).spliterator(), false)
.filter(ctx -> ctx.getName().equals(PLEXUS_PLUGIN_CONTEXT_NAME))
.findAny()
.map(PlexusMavenPluginContext.class::cast)
.get();
context.setBaseDir(baseDir);
context.inject(operationFactory, OPERATION_FACTORY_ROLE);

Expand Down Expand Up @@ -191,7 +201,7 @@ public void executeWithErrorWhenLoadingPlugin() throws Exception {

assertThat(e).isNotNull();
}

@Test
public void executeWithErrorWhenLookingForGoal() throws Exception {
context.descriptorPath = TEST_DESCRIPTOR_PATH;
Expand Down

0 comments on commit bf38cbb

Please sign in to comment.