Merge pull request #64 from kemitix/use-kemitix-maven-tiles

Use kemitix maven tiles
This commit is contained in:
Paul Campbell 2018-01-05 22:29:55 +00:00 committed by GitHub
commit ad8861b093
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 166 additions and 1243 deletions

2
.gitignore vendored
View file

@ -4,6 +4,8 @@
*.ear *.ear
*.zip *.zip
pom.xml.versionsBackup
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*

View file

@ -3,6 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<properties>
<lombok.version>1.16.18</lombok.version>
</properties>
<parent> <parent>
<groupId>net.kemitix</groupId> <groupId>net.kemitix</groupId>
@ -32,6 +35,12 @@
<inceptionYear>2016</inceptionYear> <inceptionYear>2016</inceptionYear>
<dependencies> <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
@ -78,6 +87,17 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>${tiles-maven-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>net.kemitix.tiles:all-tiles:${kemitix-tiles.version}</tile>
</tiles>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>

View file

@ -22,7 +22,6 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import com.speedment.common.mapstream.MapStream; import com.speedment.common.mapstream.MapStream;
import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import lombok.val; import lombok.val;
@ -58,13 +57,13 @@ class CheckstyleWriter implements CommandLineRunner {
private final RuleClassLocator ruleClassLocator; private final RuleClassLocator ruleClassLocator;
@Override @Override
public void run(final String... args) throws Exception { public void run(final String... args) {
Stream.of(RuleLevel.values()) Stream.of(RuleLevel.values())
.filter(level -> !level.equals(RuleLevel.UNSPECIFIED)) .filter(level -> !level.equals(RuleLevel.UNSPECIFIED))
.forEach(this::writeCheckstyleFile); .forEach(this::writeCheckstyleFile);
} }
private void writeCheckstyleFile(@NonNull final RuleLevel ruleLevel) { private void writeCheckstyleFile(final RuleLevel ruleLevel) {
val xmlFile = outputProperties.getDirectory() val xmlFile = outputProperties.getDirectory()
.resolve(outputProperties.getRulesetFiles() .resolve(outputProperties.getRulesetFiles()
.get(ruleLevel)); .get(ruleLevel));

View file

@ -28,6 +28,7 @@ import javax.annotation.PostConstruct;
import java.util.AbstractMap; import java.util.AbstractMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -62,6 +63,7 @@ public class DefaultRuleClassLocator implements RuleClassLocator {
} }
private String getCanonicalClassName(final RuleSource source, final String name) { private String getCanonicalClassName(final RuleSource source, final String name) {
Objects.requireNonNull(checkClasses, "init() method not called");
return checkClasses.get(source) return checkClasses.get(source)
.stream() .stream()
.sorted() .sorted()

View file

@ -7,8 +7,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -24,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
/** /**
* Tests for {@link CheckstyleWriter}. * Tests for {@link CheckstyleWriter}.
@ -58,12 +57,10 @@ public class CheckstyleWriterTest {
private Path outputDirectory; private Path outputDirectory;
@Mock private RuleClassLocator ruleClassLocator = mock(RuleClassLocator.class);
private RuleClassLocator ruleClassLocator;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
ruleName = "RegexpOnFilename"; ruleName = "RegexpOnFilename";
ruleClassname = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck"; ruleClassname = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck";
outputProperties = new OutputProperties(); outputProperties = new OutputProperties();
@ -90,7 +87,7 @@ public class CheckstyleWriterTest {
given(ruleClassLocator.apply(any())).willReturn(ruleClassname); given(ruleClassLocator.apply(any())).willReturn(ruleClassname);
} }
private Map.Entry<RuleLevel, String> getOutputFile(final RuleLevel level) throws IOException { private Map.Entry<RuleLevel, String> getOutputFile(final RuleLevel level) {
final String xmlFile = String.format("checkstyle-%s.xml", level.toString()); final String xmlFile = String.format("checkstyle-%s.xml", level.toString());
return new AbstractMap.SimpleImmutableEntry<>(level, xmlFile); return new AbstractMap.SimpleImmutableEntry<>(level, xmlFile);
} }
@ -202,7 +199,7 @@ public class CheckstyleWriterTest {
// throw RTE if template not found // throw RTE if template not found
@Test @Test
public void throwRteIfTemplateNotFound() throws Exception { public void throwRteIfTemplateNotFound() {
//given //given
templateProperties.setCheckstyleXml(Paths.get("garbage")); templateProperties.setCheckstyleXml(Paths.get("garbage"));
//when //when
@ -214,7 +211,7 @@ public class CheckstyleWriterTest {
// throw RTE if error writing file // throw RTE if error writing file
@Test @Test
public void throwRteIfErrorWritingFile() throws Exception { public void throwRteIfErrorWritingFile() {
//given //given
final String imaginary = String.join(FILE_SEPARATOR, "", "..", "imaginary"); final String imaginary = String.join(FILE_SEPARATOR, "", "..", "imaginary");
outputProperties.setDirectory(Paths.get(imaginary)); outputProperties.setDirectory(Paths.get(imaginary));

View file

@ -2,14 +2,15 @@ package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
/** /**
* Tests for {@link DefaultRuleClassLocator}. * Tests for {@link DefaultRuleClassLocator}.
@ -20,17 +21,15 @@ public class DefaultRuleClassLocatorTest {
private DefaultRuleClassLocator subject; private DefaultRuleClassLocator subject;
@Mock private PackageScanner packageScanner = mock(PackageScanner.class);
private PackageScanner packageScanner;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
subject = new DefaultRuleClassLocator(packageScanner); subject = new DefaultRuleClassLocator(packageScanner);
} }
@Test @Test
public void canLookupRule() { public void canLookupRuleWithClassNameEndingInCheck() {
//given //given
final String rulename = "RegexpOnFilename"; final String rulename = "RegexpOnFilename";
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck"; final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck";
@ -46,6 +45,47 @@ public class DefaultRuleClassLocatorTest {
assertThat(result).isEqualTo(expected); assertThat(result).isEqualTo(expected);
} }
@Test
public void canLookupRuleWithClassNameMatchingRuleName() {
//given
final String rulename = "RegexpOnFilename";
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilename";
final List<String> checkstyleClasses = Collections.singletonList(expected);
final List<String> sevntuClasses = Collections.emptyList();
given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(checkstyleClasses.stream());
given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(sevntuClasses.stream());
subject.init();
final Rule rule = createCheckstyleRule(rulename);
//when
final String result = subject.apply(rule);
//then
assertThat(result).isEqualTo(expected);
}
@Test
public void throwsExceptionWhenCheckstyleClassNotFound() {
//given
final String rulename = "RegexpOnFilename";
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameNoMatch";
final List<String> checkstyleClasses = Collections.singletonList(expected);
final List<String> sevntuClasses = Collections.emptyList();
given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(checkstyleClasses.stream());
given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(sevntuClasses.stream());
subject.init();
final Rule rule = createCheckstyleRule(rulename);
//then
assertThatThrownBy(() -> subject.apply(rule))
.isInstanceOf(CheckstyleClassNotFoundException.class)
.hasMessage("No class found to implement RegexpOnFilename");
}
@Test
public void throwsNullPointerExceptionWhenInitNotCalled() {
assertThatNullPointerException()
.isThrownBy(() -> subject.apply(new Rule()))
.withMessage("init() method not called");
}
private Rule createCheckstyleRule(final String rulename) { private Rule createCheckstyleRule(final String rulename) {
final Rule rule = new Rule(); final Rule rule = new Rule();
rule.setSource(RuleSource.CHECKSTYLE); rule.setSource(RuleSource.CHECKSTYLE);

View file

@ -0,0 +1,25 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Test;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
public class RuleLevelTest {
private final String[] ruleLevelStrings =
{"DISABLED", "LAYOUT", "NAMING", "JAVADOC", "TWEAKS", "COMPLEXITY", "UNSPECIFIED"};
@Test
public void valuesToString() {
assertThat(Stream.of(RuleLevel.values())
.map(RuleLevel::toString)).containsExactly(ruleLevelStrings);
}
@Test
public void stringValueOf() {
assertThat(Stream.of(ruleLevelStrings)
.map(RuleLevel::valueOf)).containsExactly(RuleLevel.values());
}
}

View file

@ -15,16 +15,16 @@ public class RulesPropertiesTest {
private RulesProperties rulesProperties; private RulesProperties rulesProperties;
@Before @Before
public void setUp() throws Exception { public void setUp() {
rulesProperties = new RulesProperties(); rulesProperties = new RulesProperties();
} }
@Test @Test
public void getEmpty() throws Exception { public void getEmpty() {
assertThat(rulesProperties.getRules()).isEmpty(); assertThat(rulesProperties.getRules()).isEmpty();
} }
@Test @Test
public void getContent() throws Exception { public void getContent() {
//given //given
final Rule rule = new Rule(); final Rule rule = new Rule();
//when //when

View file

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.kemitix</groupId>
<artifactId>kemitix-checkstyle-ruleset-parent</artifactId>
<version>3.4.0-SNAPSHOT</version>
</parent>
<artifactId>kemitix-checkstyle-ruleset-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>Kemitix Checkstyle :: Ruleset :: Plugin</name>
<description>Checkstyle configuration using the Kemitix Checkstyle Ruleset</description>
<properties>
<maven.version>3.5.0</maven.version>
<maven-plugin-plugin.version>3.5</maven-plugin-plugin.version>
<maven-plugin-annotations.version>3.5</maven-plugin-annotations.version>
<mojo-executor.version>2.3.0</mojo-executor.version>
<map-builder.version>1.0.0</map-builder.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>${maven-plugin-annotations.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.twdata.maven</groupId>
<artifactId>mojo-executor</artifactId>
<version>${mojo-executor.version}</version>
</dependency>
<dependency>
<groupId>me.andrz</groupId>
<artifactId>map-builder</artifactId>
<version>${map-builder.version}</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>${maven-plugin-plugin.version}</version>
</plugin><!-- maven-plugin-plugin -->
</plugins>
</build>
</project>

View file

@ -1,53 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import lombok.Builder;
import lombok.Getter;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.project.MavenProject;
/**
* Configuration for performing a Checkstyle Check.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
@Getter
@Builder
class CheckConfiguration {
private MavenProject mavenProject;
private MavenSession mavenSession;
private ArtifactRepository artifactRepository;
private BuildPluginManager pluginManager;
private String rulesetVersion;
private String sourceDirectory;
private String level;
}

View file

@ -1,99 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import lombok.Setter;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
/**
* Runs the Checkstyle Maven Plugin with the Kemitix Checkstyle Ruleset.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
@Mojo(name = "check", defaultPhase = LifecyclePhase.VALIDATE)
public class CheckMojo extends AbstractMojo {
private static final String KEMITIX_GROUPID = "net.kemitix";
private static final String KEMITIX_ARTIFACTID = "kemitix-checkstyle-ruleset";
@Setter
private CheckstyleExecutor checkstyleExecutor =
new DefaultCheckstyleExecutor(new DefaultPluginExecutor(), new MavenXpp3Reader());
@Setter
@Parameter(defaultValue = "${project}", readonly = true)
private MavenProject mavenProject;
@Setter
@Parameter(defaultValue = "${session}", readonly = true)
private MavenSession mavenSession;
@Setter
@Parameter(defaultValue = "${localRepository}", readonly = true, required = true)
private ArtifactRepository artifactRepository;
@Parameter(name = "level", defaultValue = "5-complexity", readonly = true)
private String level = "5-complexity";
@Setter
@Component
private BuildPluginManager pluginManager;
@Override
public final void execute() throws MojoExecutionException, MojoFailureException {
checkstyleExecutor.setLog(getLog());
CheckConfiguration config = getCheckConfiguration();
checkstyleExecutor.performCheck(config);
}
private CheckConfiguration getCheckConfiguration() {
final Plugin rulesetPlugin = getRulesetPlugin();
final Build build = mavenProject.getBuild();
return CheckConfiguration.builder()
.mavenProject(mavenProject)
.mavenSession(mavenSession)
.artifactRepository(artifactRepository)
.pluginManager(pluginManager)
.rulesetVersion(rulesetPlugin.getVersion())
.sourceDirectory(build.getSourceDirectory())
.level(level)
.build();
}
private Plugin getRulesetPlugin() {
return mavenProject.getPlugin(KEMITIX_GROUPID + ":" + KEMITIX_ARTIFACTID + "-maven-plugin");
}
}

View file

@ -1,51 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
/**
* Executes the Checkstyle plugin.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
interface CheckstyleExecutor {
/**
* Execute Checkstyle Check.
*
* @param configuration The Configuration
*
* @throws MojoExecutionException on execution error
* @throws MojoFailureException on execution failure
*/
void performCheck(CheckConfiguration configuration) throws MojoExecutionException, MojoFailureException;
/**
* Set the logger to use.
*
* @param log the logger.
*/
void setLog(Log log);
}

View file

@ -1,186 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.val;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.twdata.maven.mojoexecutor.MojoExecutor;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Properties;
/**
* Default implementation of {@link CheckstyleExecutor}.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
@SuppressWarnings("classfanoutcomplexity")
@RequiredArgsConstructor
public class DefaultCheckstyleExecutor implements CheckstyleExecutor {
private static final String CHECKSTYLE_GROUPID = "com.puppycrawl.tools";
private static final String CHECKSTYLE_ARTIFACTID = "checkstyle";
private static final String SEVNTU_GROUPID = "com.github.sevntu-checkstyle";
private static final String SEVNTU_ARTIFACTID = "sevntu-checkstyle-maven-plugin";
private static final String KEMITIX_GROUPID = "net.kemitix";
private static final String KEMITIX_ARTIFACTID = "kemitix-checkstyle-ruleset";
private static final String APACHE_PLUGIN_GROUPID = "org.apache.maven.plugins";
private static final String APACHE_PLUGIN_ARTIFACTID = "maven-checkstyle-plugin";
private static final String CONFIG_LOCATION = "configLocation";
private static final String SOURCE_DIR = "sourceDirectory";
private static final ArtifactHandler POM_ARTIFACT_HANDLER = new DefaultArtifactHandler("pom");
private static final String PLUGIN_ARTIFACT_ID = KEMITIX_ARTIFACTID + "-parent";
private final PluginExecutor pluginExecutor;
private final MavenXpp3Reader mavenXpp3Reader;
@Setter
@Getter
private Log log;
private String rulesetVersion;
@Override
public final void performCheck(final CheckConfiguration config)
throws MojoExecutionException, MojoFailureException {
rulesetVersion = config.getRulesetVersion();
val properties = getProperties(config.getArtifactRepository());
// configure
val checkstylePlugin = getPlugin(properties);
final String sourceDirectory = config.getSourceDirectory();
final String level = config.getLevel();
info("Ruleset: %s", level);
final String configFile = String.format("net/kemitix/checkstyle-%s.xml", level);
final Xpp3Dom configuration = pluginExecutor.configuration(pluginExecutor.element(CONFIG_LOCATION, configFile),
pluginExecutor.element(SOURCE_DIR, sourceDirectory)
);
final MojoExecutor.ExecutionEnvironment environment = pluginExecutor.executionEnvironment(config);
// run
pluginExecutor.executeMojo(checkstylePlugin, "check", configuration, environment);
info("Checkstyle complete");
}
private String getProperty(final Properties properties, final String key) {
val property = properties.getProperty(key);
debug("%s: %s", key, property);
return property;
}
private Plugin getPlugin(final Properties properties) {
// get versions from pom.xml properties
val pluginVersion = getProperty(properties, "maven-checkstyle-plugin.version");
val checkstyleVersion = getProperty(properties, "checkstyle.version");
val sevntuVersion = getProperty(properties, "sevntu.version");
info("Checkstyle %s (plugin: %s, sevntu: %s, ruleset: %s)", checkstyleVersion,
pluginVersion, sevntuVersion, rulesetVersion
);
// create checkstyle dependencies
val checkstyle = getCheckstyleDependency(checkstyleVersion);
val sevntu = getSevntuDependency(sevntuVersion);
val ruleset = getRulesetDependency();
final List<Dependency> dependencies = pluginExecutor.dependencies(checkstyle, sevntu, ruleset);
return pluginExecutor.plugin(APACHE_PLUGIN_GROUPID, APACHE_PLUGIN_ARTIFACTID, pluginVersion, dependencies);
}
private Dependency getRulesetDependency() {
return pluginExecutor.dependency(KEMITIX_GROUPID, KEMITIX_ARTIFACTID, rulesetVersion);
}
private Dependency getSevntuDependency(final String sevntuVersion) {
return pluginExecutor.dependency(SEVNTU_GROUPID, SEVNTU_ARTIFACTID, sevntuVersion);
}
private Dependency getCheckstyleDependency(final String checkstyleVersion) {
return pluginExecutor.dependency(CHECKSTYLE_GROUPID, CHECKSTYLE_ARTIFACTID, checkstyleVersion);
}
private Properties getProperties(final ArtifactRepository artifactRepository) throws MojoFailureException {
// load properties from the plugin pom.xml
final Artifact pluginArtifact = getPluginArtifact(artifactRepository);
try {
final File pomFile = pluginArtifact.getFile();
return parsePomFile(pomFile).getProperties();
} catch (XmlPullParserException | IOException e) {
throw new MojoFailureException("Can't load properties from plugin's pom.xml", e);
}
}
private Model parsePomFile(final File pomFile) throws IOException, XmlPullParserException {
final Reader pomReader = new FileReader(pomFile);
return mavenXpp3Reader.read(pomReader);
}
private Artifact getPluginArtifact(final ArtifactRepository artifactRepository) {
final Artifact templateArtifact = getRulesetArtifactTemplate();
return artifactRepository.find(templateArtifact);
}
private DefaultArtifact getRulesetArtifactTemplate() {
return new DefaultArtifact(KEMITIX_GROUPID, PLUGIN_ARTIFACT_ID, rulesetVersion, null, "", null,
POM_ARTIFACT_HANDLER
);
}
private void info(final String format, final Object... args) {
getLog().info(String.format(format, args));
}
private void debug(final String format, final Object... args) {
getLog().debug(String.format(format, args));
}
}

View file

@ -1,79 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.twdata.maven.mojoexecutor.MojoExecutor;
import java.util.List;
/**
* Wrapper for {@link org.twdata.maven.mojoexecutor.MojoExecutor}.
*
* @author Paul Campbell (pcampbell@kemitix.net).
*/
public final class DefaultPluginExecutor implements PluginExecutor {
@Override
public MojoExecutor.Element element(final String key, final String value) {
return MojoExecutor.element(key, value);
}
@Override
public Xpp3Dom configuration(final MojoExecutor.Element... elements) {
return MojoExecutor.configuration(elements);
}
@Override
public MojoExecutor.ExecutionEnvironment executionEnvironment(final CheckConfiguration config) {
return MojoExecutor.executionEnvironment(
config.getMavenProject(), config.getMavenSession(), config.getPluginManager());
}
@Override
public void executeMojo(
final Plugin plugin, final String goal, final Xpp3Dom configuration,
final MojoExecutor.ExecutionEnvironment env
) throws MojoExecutionException {
MojoExecutor.executeMojo(plugin, goal, configuration, env);
}
@Override
public Dependency dependency(final String groupid, final String artifactid, final String version) {
return MojoExecutor.dependency(groupid, artifactid, version);
}
@Override
public List<Dependency> dependencies(final Dependency... dependencies) {
return MojoExecutor.dependencies(dependencies);
}
@Override
public Plugin plugin(
final String groupid, final String artifactid, final String version, final List<Dependency> dependencies
) {
return MojoExecutor.plugin(groupid, artifactid, version, dependencies);
}
}

View file

@ -1,114 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.twdata.maven.mojoexecutor.MojoExecutor;
import java.util.List;
/**
* Interface for wrapping calls to static methods on {@link org.twdata.maven.mojoexecutor.MojoExecutor}.
*
* @author Paul Campbell (pcampbell@kemitix.net).
*/
public interface PluginExecutor {
/**
* Constructs the element with a textual body.
*
* @param name The element name
* @param value The element text value
*
* @return The element object
*/
MojoExecutor.Element element(String name, String value);
/**
* Builds the configuration for the goal using Elements.
*
* @param elements A list of elements for the configuration section
*
* @return The elements transformed into the Maven-native XML format
*/
Xpp3Dom configuration(MojoExecutor.Element... elements);
/**
* Constructs the {@link MojoExecutor.ExecutionEnvironment} instance fluently.
*
* @param configuration The Configuration
*
* @return The execution environment
*/
MojoExecutor.ExecutionEnvironment executionEnvironment(CheckConfiguration configuration);
/**
* Entry point for executing a mojo.
*
* @param plugin The plugin to execute
* @param goal The goal to execute
* @param configuration The execution configuration
* @param env The execution environment
*
* @throws MojoExecutionException If there are any exceptions locating or executing the mojo
*/
void executeMojo(
Plugin plugin, String goal, Xpp3Dom configuration, MojoExecutor.ExecutionEnvironment env
) throws MojoExecutionException;
/**
* Defines a dependency.
*
* @param groupId The group id
* @param artifactId The artifact id
* @param version The plugin version
*
* @return the dependency instance
*/
Dependency dependency(String groupId, String artifactId, String version);
/**
* Creates a list of dependencies.
*
* @param dependencies the dependencies
*
* @return A list of dependencies
*/
List<Dependency> dependencies(Dependency... dependencies);
/**
* Defines a plugin.
*
* @param groupId The group id
* @param artifactId The artifact id
* @param version The plugin version
* @param dependencies The plugin dependencies
*
* @return The plugin instance
*/
Plugin plugin(
String groupId, String artifactId, String version, List<Dependency> dependencies
);
}

View file

@ -1,22 +0,0 @@
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Paul Campbell
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package net.kemitix.checkstyle.ruleset.plugin;

View file

@ -1,26 +0,0 @@
package net.kemitix.checkstyle.ruleset.plugin;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Paul Campbell (pcampbell@kemitix.net).
*/
public class CheckConfigurationTest {
@Test
public void toStringCoverage() {
//given
final String rulesetVersion = "ruleset version";
final String sourceDirectory = "source directory";
//when
final String result = CheckConfiguration.builder()
.rulesetVersion(rulesetVersion)
.sourceDirectory(sourceDirectory)
.toString();
//then
assertThat(result).contains("rulesetVersion=ruleset version")
.contains("sourceDirectory=source directory");
}
}

View file

@ -1,80 +0,0 @@
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
/**
* Tests for {@link CheckMojo}.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
public class CheckMojoTest {
@Mock
private CheckstyleExecutor checkstyleExecutor;
@Mock
private MavenProject mavenProject;
@Mock
private MavenSession mavenSession;
@Mock
private ArtifactRepository artifactRepository;
@Mock
private BuildPluginManager pluginManager;
@Captor
private ArgumentCaptor<CheckConfiguration> configuration;
@Mock
private Plugin rulesetPlugin;
@Mock
private Build build;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void canExecute() throws MojoFailureException, MojoExecutionException {
//given
final CheckMojo mojo = new CheckMojo();
mojo.setCheckstyleExecutor(checkstyleExecutor);
mojo.setMavenProject(mavenProject);
mojo.setMavenSession(mavenSession);
mojo.setArtifactRepository(artifactRepository);
mojo.setPluginManager(pluginManager);
given(mavenProject.getPlugin(any())).willReturn(rulesetPlugin);
given(mavenProject.getBuild()).willReturn(build);
//when
mojo.execute();
//then
then(checkstyleExecutor).should()
.performCheck(configuration.capture());
assertThat(configuration.getValue()).returns(mavenProject, CheckConfiguration::getMavenProject)
.returns(mavenSession, CheckConfiguration::getMavenSession)
.returns(artifactRepository, CheckConfiguration::getArtifactRepository)
.returns(pluginManager, CheckConfiguration::getPluginManager);
}
}

View file

@ -1,161 +0,0 @@
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.twdata.maven.mojoexecutor.MojoExecutor;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
/**
* Tests for {@link DefaultCheckstyleExecutor}.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
public class DefaultCheckstyleExecutorTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Mock
private PluginExecutor pluginExecutor;
@Mock
private MavenProject mavenProject;
@Mock
private MavenSession mavenSession;
@Mock
private ArtifactRepository artifactRepository;
@Mock
private BuildPluginManager pluginManager;
@Mock
private Plugin rulesetPlugin;
@Mock
private Log log;
private DefaultCheckstyleExecutor checkstyleExecutor;
private String level;
@Mock
private Artifact artifact;
@Mock
private MavenXpp3Reader mavenXpp3Reader;
@Mock
private Model pomModel;
@Mock
private MojoExecutor.Element configElement;
@Mock
private MojoExecutor.Element sourceElement;
@Mock
private Xpp3Dom pluginConfig;
@Mock
private MojoExecutor.ExecutionEnvironment env;
@Mock
private Dependency checkstyle;
@Mock
private Dependency sevntu;
@Mock
private Dependency ruleset;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
level = "test level";
checkstyleExecutor = new DefaultCheckstyleExecutor(pluginExecutor, mavenXpp3Reader);
checkstyleExecutor.setLog(log);
}
@Test
public void canPerformCheck()
throws MojoFailureException, MojoExecutionException, IOException, XmlPullParserException {
//given
final CheckConfiguration configuration = CheckConfiguration.builder()
.mavenProject(mavenProject)
.mavenSession(mavenSession)
.artifactRepository(artifactRepository)
.pluginManager(pluginManager)
.rulesetVersion("ruleset version")
.level(level)
.build();
given(artifactRepository.find(any())).willReturn(artifact);
final File artifactFile = folder.newFile("pom.xml");
given(artifact.getFile()).willReturn(artifactFile);
given(mavenXpp3Reader.read(any(FileReader.class))).willReturn(pomModel);
final Properties properties = new Properties();
given(pomModel.getProperties()).willReturn(properties);
given(pluginExecutor.element(eq("configLocation"), any())).willReturn(configElement);
given(pluginExecutor.element(eq("sourceDirectory"), any())).willReturn(sourceElement);
given(pluginExecutor.configuration(configElement, sourceElement)).willReturn(pluginConfig);
given(pluginExecutor.executionEnvironment(configuration)).willReturn(env);
final List<Dependency> dependencies = new ArrayList<>();
dependencies.add(checkstyle);
dependencies.add(sevntu);
dependencies.add(ruleset);
final String pluginVersion = "plugin version";
final String checkstyleVersion = "checkstyle version";
final String sevntuVersion = "sevntu version";
final String rulesetVersion = "ruleset version";
given(pluginExecutor.dependencies(checkstyle, sevntu, ruleset)).willReturn(dependencies);
given(pluginExecutor.dependency("com.puppycrawl.tools", "checkstyle", checkstyleVersion)).willReturn(
checkstyle);
given(pluginExecutor.dependency(
"com.github.sevntu.checkstyle", "sevntu-checkstyle-maven-plugin", sevntuVersion)).willReturn(sevntu);
given(pluginExecutor.dependency("net.kemitix", "kemtiix-checkstyle-ruleset", rulesetVersion)).willReturn(
ruleset);
properties.setProperty("maven-checkstyle-plugin.version", pluginVersion);
properties.setProperty("checkstyle.version", checkstyleVersion);
properties.setProperty("sevntu.version", sevntuVersion);
given(pluginExecutor.plugin(
eq("org.apache.maven.plugins"), eq("maven-checkstyle-plugin"), eq(pluginVersion), any())).willReturn(
rulesetPlugin);
//when
checkstyleExecutor.performCheck(configuration);
//then
then(pluginExecutor).should()
.executeMojo(rulesetPlugin, "check", pluginConfig, env);
}
}

View file

@ -1,177 +0,0 @@
package net.kemitix.checkstyle.ruleset.plugin;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.PluginConfigurationException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.twdata.maven.mojoexecutor.MojoExecutor;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
/**
* Tests for {@link DefaultPluginExecutor}.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
public class DefaultPluginExecutorTest {
private PluginExecutor pluginExecutor;
@Mock
private MavenProject mavenProject;
@Mock
private MavenSession mavenSession;
@Mock
private BuildPluginManager pluginManager;
@Mock
private Plugin plugin;
@Mock
private Xpp3Dom configuration;
@Mock
private PluginDescriptor pluginDescriptor;
@Mock
private MojoDescriptor mojoDescriptor;
@Mock
private PlexusConfiguration mojoConfiguration;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
pluginExecutor = new DefaultPluginExecutor();
}
@Test
public void canElement() {
//when
final MojoExecutor.Element element = pluginExecutor.element("name", "value");
//then
assertThat(element.toDom()).returns("name", Xpp3Dom::getName)
.returns("value", Xpp3Dom::getValue);
}
@Test
public void canConfiguration() {
//given
final MojoExecutor.Element alpha = pluginExecutor.element("alpha", "first");
final MojoExecutor.Element beta = pluginExecutor.element("beta", "second");
//when
final Xpp3Dom configuration = pluginExecutor.configuration(alpha, beta);
//then
assertThat(configuration.getChild("alpha")).returns("alpha", Xpp3Dom::getName)
.returns("first", Xpp3Dom::getValue);
assertThat(configuration.getChild("beta")).returns("beta", Xpp3Dom::getName)
.returns("second", Xpp3Dom::getValue);
}
@Test
public void canExecutionEnvironment() {
//given
final CheckConfiguration configuration = createCheckConfiguration();
//when
final MojoExecutor.ExecutionEnvironment environment = pluginExecutor.executionEnvironment(configuration);
//then
assertThat(environment).returns(mavenProject, MojoExecutor.ExecutionEnvironment::getMavenProject)
.returns(mavenSession, MojoExecutor.ExecutionEnvironment::getMavenSession)
.returns(pluginManager, MojoExecutor.ExecutionEnvironment::getPluginManager);
}
private CheckConfiguration createCheckConfiguration() {
return CheckConfiguration.builder()
.mavenProject(mavenProject)
.mavenSession(mavenSession)
.pluginManager(pluginManager)
.build();
}
@Test
public void canExecuteMojo()
throws MojoExecutionException, InvalidPluginDescriptorException, PluginResolutionException,
PluginDescriptorParsingException, PluginNotFoundException, PluginManagerException,
PluginConfigurationException, MojoFailureException {
//given
final String goal = "check";
final MojoExecutor.ExecutionEnvironment environment =
pluginExecutor.executionEnvironment(createCheckConfiguration());
given(mavenSession.getCurrentProject()).willReturn(mavenProject);
given(pluginManager.loadPlugin(eq(plugin), any(), any())).willReturn(pluginDescriptor);
given(pluginDescriptor.getMojo(goal)).willReturn(mojoDescriptor);
given(mojoDescriptor.getMojoConfiguration()).willReturn(mojoConfiguration);
given(mojoConfiguration.getAttributeNames()).willReturn(new String[]{});
given(mojoConfiguration.getChildren()).willReturn(new PlexusConfiguration[]{});
//when
pluginExecutor.executeMojo(plugin, goal, configuration, environment);
//then
then(pluginManager).should()
.executeMojo(eq(mavenSession), any());
}
@Test
public void canDependency() {
//given
final String groupId = "groupId";
final String artifactId = "artifactId";
final String version = "version";
//when
final Dependency dependency = pluginExecutor.dependency(groupId, artifactId, version);
//then
assertThat(dependency).returns(groupId, Dependency::getGroupId)
.returns(artifactId, Dependency::getArtifactId)
.returns(version, Dependency::getVersion);
}
@Test
public void canDependencies() {
//given
final Dependency dependency = pluginExecutor.dependency("groupId", "artifactId", "version");
//when
final List<Dependency> dependencies = pluginExecutor.dependencies(dependency);
//then
assertThat(dependencies).containsExactly(dependency);
}
@Test
public void canPlugin() {
//given
final String groupId = "groupId";
final String artifactId = "artifactId";
final String version = "version";
final List<Dependency> dependencies = pluginExecutor.dependencies(pluginExecutor.dependency("pg", "pa", "pv"));
//when
final Plugin plugin = pluginExecutor.plugin(groupId, artifactId, version, dependencies);
//then
assertThat(plugin).returns(groupId, Plugin::getGroupId)
.returns(artifactId, Plugin::getArtifactId)
.returns(version, Plugin::getVersion)
.returns(dependencies, Plugin::getDependencies);
}
}

28
pom.xml
View file

@ -3,13 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.kemitix</groupId>
<artifactId>kemitix-parent</artifactId>
<version>3.0.0</version>
<relativePath/>
</parent>
<groupId>net.kemitix</groupId>
<artifactId>kemitix-checkstyle-ruleset-parent</artifactId> <artifactId>kemitix-checkstyle-ruleset-parent</artifactId>
<version>3.4.0-SNAPSHOT</version> <version>3.4.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
@ -18,6 +13,10 @@
<description>Parent POM for the Kemitix Checkstyle Ruleset and it's Builder</description> <description>Parent POM for the Kemitix Checkstyle Ruleset and it's Builder</description>
<properties> <properties>
<tiles-maven-plugin.version>2.10</tiles-maven-plugin.version>
<kemitix-tiles.version>0.1.1</kemitix-tiles.version>
<java.version>1.8</java.version>
<maven-checkstyle-plugin.version>2.17</maven-checkstyle-plugin.version> <maven-checkstyle-plugin.version>2.17</maven-checkstyle-plugin.version>
<checkstyle.version>8.0</checkstyle.version> <checkstyle.version>8.0</checkstyle.version>
<sevntu.version>1.24.1</sevntu.version> <sevntu.version>1.24.1</sevntu.version>
@ -36,7 +35,6 @@
<modules> <modules>
<module>builder</module> <module>builder</module>
<module>ruleset</module> <module>ruleset</module>
<module>plugin</module>
<module>regressions</module> <module>regressions</module>
</modules> </modules>
@ -55,6 +53,22 @@
<inceptionYear>2016</inceptionYear> <inceptionYear>2016</inceptionYear>
<licenses>
<license>
<name>The MIT License (MIT)</name>
<url>https://opensource.org/licenses/MIT</url>
</license>
</licenses>
<developers>
<developer>
<name>Paul Campbell</name>
<email>pcampbell@kemitix.net</email>
<organization>Kemitix</organization>
<organizationUrl>https://github.com/kemitix/</organizationUrl>
</developer>
</developers>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>

View file

@ -13,17 +13,36 @@
<name>Kemitix Checkstyle :: Ruleset :: Regression Tests</name> <name>Kemitix Checkstyle :: Ruleset :: Regression Tests</name>
<properties> <properties>
<kemitix-checkstyle-ruleset.version>${project.version}</kemitix-checkstyle-ruleset.version> <!-- use the disabled ruleset for normal builds. comment out the following line to check that conditions are caught -->
<kemitix-checkstyle-ruleset.level>5-complexity</kemitix-checkstyle-ruleset.level> <ruleset.level>0-disabled</ruleset.level>
<digraph-dependency.basePackage>net.kemitix.checkstyle.regressions</digraph-dependency.basePackage>
<pitest.skip>true</pitest.skip> <pitest.skip>true</pitest.skip>
<immutables-value.version>2.5.6</immutables-value.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.immutables</groupId> <groupId>org.immutables</groupId>
<artifactId>value</artifactId> <artifactId>value</artifactId>
<version>${immutables-value.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>${tiles-maven-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>net.kemitix.tiles:all-tiles:${kemitix-tiles.version}</tile>
</tiles>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View file

@ -33,7 +33,6 @@ public class AvoidDefaultSerializableInInnerClasses {
/** /**
* Inner class should not use default implementations of {@code readObject()} and {@code writeObject()}. * Inner class should not use default implementations of {@code readObject()} and {@code writeObject()}.
*/ */
@SuppressWarnings("avoiddefaultserializableininnerclasses")
public class InnerClass implements Serializable { public class InnerClass implements Serializable {
} }

View file

@ -22,7 +22,7 @@
package net.kemitix.checkstyle.regressions; package net.kemitix.checkstyle.regressions;
/** /**
* Sample class. * Sample class with no checkstyle issues.
* *
* @author Paul Campbell (pcampbell@kemitix.net) * @author Paul Campbell (pcampbell@kemitix.net)
*/ */

View file

@ -31,7 +31,6 @@ public class EmptyPublicCtorInClass {
/** /**
* Useless empty public constructors. * Useless empty public constructors.
*/ */
@SuppressWarnings("emptypublicctorinclass")
EmptyPublicCtorInClass() { EmptyPublicCtorInClass() {
} }

View file

@ -37,16 +37,12 @@ class ExplicitInitialization {
private Object validObject = new Object(); private Object validObject = new Object();
@SuppressWarnings("explicitinitialization")
private Boolean invalidBoolean = null; private Boolean invalidBoolean = null;
@SuppressWarnings("explicitinitialization")
private Integer invalidInteger = null; private Integer invalidInteger = null;
@SuppressWarnings("explicitinitialization")
private String invalidString = null; private String invalidString = null;
@SuppressWarnings("explicitinitialization")
private Object invalidObject = null; private Object invalidObject = null;
} }

View file

@ -31,7 +31,7 @@ class FinalizeImplementation {
/** /**
* Negates effect of superclass finalize. * Negates effect of superclass finalize.
*/ */
@SuppressWarnings({"PMD.EmptyFinalizer", "nofinalizer", "finalizeimplementation"}) @SuppressWarnings("PMD.EmptyFinalizer")
protected void finalize() { protected void finalize() {
// doesn't call super.finalize() // doesn't call super.finalize()
} }

View file

@ -41,7 +41,6 @@ class MoveVariableInsideIf {
* *
* @return value * @return value
*/ */
@SuppressWarnings("movevariableinsideif")
protected String invalid() { protected String invalid() {
String variable = input.substring(1); String variable = input.substring(1);
if (condition) { if (condition) {

View file

@ -16,87 +16,21 @@
<name>Kemitix Checkstyle :: Ruleset</name> <name>Kemitix Checkstyle :: Ruleset</name>
<description>Checkstyle Ruleset for use by packages derived from kemitix-parent</description> <description>Checkstyle Ruleset for use by packages derived from kemitix-parent</description>
<properties>
<maven-javadoc-plugin.version>2.10.4</maven-javadoc-plugin.version>
<maven-source-plugin.version>3.0.1</maven-source-plugin.version>
<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
</properties>
<profiles>
<profile>
<id>release</id>
<build> <build>
<plugins> <plugins>
<!-- plugin sequence: javadoc, sources, gpg, deploy -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>io.repaint.maven</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>tiles-maven-plugin</artifactId>
<version>${maven-javadoc-plugin.version}</version> <version>${tiles-maven-plugin.version}</version>
<executions> <extensions>true</extensions>
<execution>
<id>attach-javadocs</id>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin><!-- maven-javadoc-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${maven-source-plugin.version}</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin><!-- maven-source-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>${maven-gpg-plugin.version}</version>
<configuration> <configuration>
<passphrase>${gpg.passphrase}</passphrase> <tiles>
<tile>net.kemitix.tiles:maven-plugins-tile:${kemitix-tiles.version}</tile>
<tile>net.kemitix.tiles:enforcer-tile:${kemitix-tiles.version}</tile>
<tile>net.kemitix.tiles:release-tile:${kemitix-tiles.version}</tile>
</tiles>
</configuration> </configuration>
<executions> </plugin>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin><!-- maven-gpg-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
</plugin><!-- maven deploy-plugin -->
</plugins> </plugins>
</build> </build>
</profile><!-- release -->
</profiles>
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<name>Nexus Release Repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</project> </project>