Skip to content

Issue #41: Setup integration tests pipeline #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config/import-control.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
<allow pkg="javax.xml.stream"/>
<allow pkg="org.checkstyle"/>
<allow pkg="java.util"/>
<allow pkg="com.puppycrawl.tools.checkstyle"/>
</import-control>
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>${checkstyle.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openrewrite</groupId>
<artifactId>rewrite-test</artifactId>
Expand Down
26 changes: 25 additions & 1 deletion src/main/java/org/checkstyle/autofix/CheckstyleAutoFix.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
import java.nio.file.Path;
import java.util.List;

import org.checkstyle.autofix.parser.CheckConfiguration;
import org.checkstyle.autofix.parser.CheckstyleReportParser;
import org.checkstyle.autofix.parser.CheckstyleViolation;
import org.checkstyle.autofix.parser.ConfigurationLoader;
import org.openrewrite.Option;
import org.openrewrite.Recipe;

Expand All @@ -35,6 +37,17 @@ public class CheckstyleAutoFix extends Recipe {
example = "target/checkstyle/checkstyle-report.xml")
private String violationReportPath;

@Option(displayName = "Checkstyle config path",
description = "Path to the file containing Checkstyle configuration.",
example = "config/checkstyle.xml")
private String configurationPath;

@Option(displayName = "Checkstyle properties file path",
description = "Path to the file containing the Checkstyle Properties.",
example = "config/checkstyle.properties",
required = false)
private String propertiesPath;

@Override
public String getDisplayName() {
return "Checkstyle autoFix";
Expand All @@ -49,12 +62,23 @@ public String getViolationReportPath() {
return violationReportPath;
}

public String getConfigurationPath() {
return configurationPath;
}

public String getPropertiesPath() {
return propertiesPath;
}

@Override
public List<Recipe> getRecipeList() {

final List<CheckstyleViolation> violations = CheckstyleReportParser
.parse(Path.of(getViolationReportPath()));

return CheckstyleRecipeRegistry.getRecipes(violations);
}

private CheckConfiguration loadCheckstyleConfiguration() {
return ConfigurationLoader.loadConfiguration(getConfigurationPath(), getPropertiesPath());
}
}
108 changes: 108 additions & 0 deletions src/main/java/org/checkstyle/autofix/parser/CheckConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
///////////////////////////////////////////////////////////////////////////////////////////////
// checkstyle-openrewrite-recipes: Automatically fix Checkstyle violations with OpenRewrite.
// Copyright (C) 2025 The Checkstyle OpenRewrite Recipes Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///////////////////////////////////////////////////////////////////////////////////////////////

package org.checkstyle.autofix.parser;

import java.util.List;
import java.util.Map;

public final class CheckConfiguration {
private final String name;
private final Map<String, String> properties;
private final List<CheckConfiguration> children;
private CheckConfiguration parent;

public CheckConfiguration(String name,
Map<String, String> properties, List<CheckConfiguration> children) {
this.name = name;
this.properties = properties;
this.children = children;

for (CheckConfiguration child : children) {
child.setParent(this);
}
}

public String getName() {
return name;
}

public Map<String, String> getProperties() {
return properties;
}

public List<CheckConfiguration> getChildren() {
return children;
}

public String getProperty(String key) {
return properties.get(key);
}

public int getInt(String propertyName) {
final String value = properties.get(propertyName);
final int result;
try {
result = Integer.parseInt(value);
}
catch (NumberFormatException exception) {
throw new IllegalArgumentException("Invalid integer value for property '"
+ propertyName + "': " + value, exception);
}
return result;
}

public boolean getBoolean(String propertyName) {
return Boolean.parseBoolean(properties.get(propertyName));
}

public int[] getIntArray(String propertyName) {
final String value = properties.get(propertyName);
final int[] result;
final String[] parts = value.split(",");
result = new int[parts.length];
for (int index = 0; index < parts.length; index++) {
try {
result[index] = Integer.parseInt(parts[index].trim());
}
catch (NumberFormatException exception) {
throw new IllegalArgumentException("Property '" + propertyName
+ "' has an invalid integer value: " + parts[index].trim(), exception);
}
}
return result;
}

public CheckConfiguration getChildByName(String childName) {
CheckConfiguration result = null;
for (CheckConfiguration child : children) {
if (childName.equals(child.getName())) {
result = child;
break;
}
}
return result;
}

public CheckConfiguration getParent() {
return parent;
}

private void setParent(CheckConfiguration parent) {
this.parent = parent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
///////////////////////////////////////////////////////////////////////////////////////////////
// checkstyle-openrewrite-recipes: Automatically fix Checkstyle violations with OpenRewrite.
// Copyright (C) 2025 The Checkstyle OpenRewrite Recipes Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///////////////////////////////////////////////////////////////////////////////////////////////

package org.checkstyle.autofix.parser;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.puppycrawl.tools.checkstyle.PropertiesExpander;
import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
import com.puppycrawl.tools.checkstyle.api.Configuration;

public final class ConfigurationLoader {

private ConfigurationLoader() {
// utility class
}

public static CheckConfiguration mapConfiguration(Configuration config) {
final Map<String, String> properties = new HashMap<>();
final String[] propertyNames = config.getPropertyNames();
for (String propertyName : propertyNames) {
try {
final String value = config.getProperty(propertyName);
properties.put(propertyName, value);

}
catch (CheckstyleException exception) {
throw new IllegalStateException("Error getting property " + propertyName,
exception);
}
}

final Configuration[] checkstyleChildren = config.getChildren();
final CheckConfiguration[] simpleChildren =
new CheckConfiguration[checkstyleChildren.length];
for (int index = 0; index < checkstyleChildren.length; index++) {
simpleChildren[index] = mapConfiguration(checkstyleChildren[index]);
}

return new CheckConfiguration(config.getName(), properties, List.of(simpleChildren));
}

public static CheckConfiguration loadConfiguration(String checkstyleConfigurationPath,
String propFile) {
Properties props = new Properties();

if (propFile == null) {
props = System.getProperties();
}
else {
try (FileInputStream input = new FileInputStream(propFile)) {
props.load(input);
}
catch (IOException exception) {
throw new IllegalStateException("Failed to read: " + propFile, exception);
}
}

final Configuration checkstyleConfig;
try {
checkstyleConfig = com.puppycrawl.tools.checkstyle.ConfigurationLoader
.loadConfiguration(checkstyleConfigurationPath, new PropertiesExpander(props));
}
catch (CheckstyleException exception) {
throw new IllegalStateException("Failed to load configuration:"
+ checkstyleConfigurationPath, exception);
}

return mapConfiguration(checkstyleConfig);
}

}
1 change: 1 addition & 0 deletions src/main/resources/META-INF/rewrite/recipes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ tags:
recipeList:
- org.checkstyle.autofix.CheckstyleAutoFix:
violationReportPath: "target/checkstyle/checkstyle-report.xml"
configurationPath: "https://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-${checkstyle.version}/config/checkstyle-checks.xml"
Loading
Loading