From 10c7a4f32e2602f995439dfa09fec7f01d864b43 Mon Sep 17 00:00:00 2001 From: HaiTao Zhang Date: Tue, 11 Jun 2019 15:26:17 -0700 Subject: [PATCH] Clean artifactId and groupId Maven allows alphanumeric characters and `.`, `_` and `-` for group id and artifact id. This commit cleans the artifact id and group id if invalid characters are found. For artifact id, the invalid characters are replaced with a hyphen and for group id a dot is used. In cases where the base directory matches the artifact id, the base directory is also cleaned. See gh-924 --- .../ProjectRequestToDescriptionConverter.java | 42 +++++++++++++++++-- ...ectRequestToDescriptionConverterTests.java | 34 +++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverter.java b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverter.java index 2a044313..3e26447f 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverter.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverter.java @@ -37,6 +37,7 @@ import org.springframework.util.StringUtils; * Validates a {@link ProjectRequest} and creates a {@link ProjectDescription} from it. * * @author Madhura Bhave + * @author HaiTao Zhang */ public class ProjectRequestToDescriptionConverter { @@ -49,12 +50,14 @@ public class ProjectRequestToDescriptionConverter { validateDependencyRange(springBootVersion, resolvedDependencies); ProjectDescription description = new ProjectDescription(); description.setApplicationName(getApplicationName(request, metadata)); - description.setArtifactId(determineValue(request.getArtifactId(), () -> metadata.getArtifactId().getContent())); - description.setBaseDirectory(request.getBaseDir()); + description.setArtifactId(determineValue(artificialIdCorrection(request.getArtifactId()), + () -> metadata.getArtifactId().getContent())); + description.setBaseDirectory(baseDirectoryCorrection(request.getBaseDir(), request.getArtifactId())); description.setBuildSystem(getBuildSystem(request, metadata)); description .setDescription(determineValue(request.getDescription(), () -> metadata.getDescription().getContent())); - description.setGroupId(determineValue(request.getGroupId(), () -> metadata.getGroupId().getContent())); + description.setGroupId( + determineValue(groupIdCorrection(request.getGroupId()), () -> metadata.getGroupId().getContent())); description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion())); description.setName(determineValue(request.getName(), () -> metadata.getName().getContent())); description.setPackageName(getPackageName(request, metadata)); @@ -63,6 +66,7 @@ public class ProjectRequestToDescriptionConverter { description.setVersion(determineValue(request.getVersion(), () -> metadata.getVersion().getContent())); resolvedDependencies.forEach((dependency) -> description.addDependency(dependency.getId(), MetadataBuildItemMapper.toDependency(dependency))); + return description; } @@ -70,6 +74,38 @@ public class ProjectRequestToDescriptionConverter { return (StringUtils.hasText(candidate)) ? candidate : fallback.get(); } + private String baseDirectoryCorrection(String baseDir, String artifactId) { + if (baseDir != null && baseDir.equals(artifactId)) { + return coordinateCorrection(baseDir, "-"); + } + return baseDir; + } + + private String artificialIdCorrection(String artifactId) { + return coordinateCorrection(artifactId, "-"); + } + + private String groupIdCorrection(String groupId) { + return coordinateCorrection(groupId, "."); + } + + private String coordinateCorrection(String coordinate, String delimiter) { + String[] elements = coordinate.split("[^A-Za-z0-9_\\-.]+"); + if (elements.length <= 1) { + return coordinate; + } + StringBuilder sb = new StringBuilder(); + for (String element : elements) { + if (!(element.startsWith("-") || element.startsWith("_") || element.startsWith(".")) && sb.length() > 0 + && !(sb.charAt(sb.length() - 1) == '-' || sb.charAt(sb.length() - 1) == '_' + || sb.charAt(sb.length() - 1) == '.')) { + sb.append(delimiter); + } + sb.append(element); + } + return sb.toString(); + } + private void validate(ProjectRequest request, InitializrMetadata metadata) { validateSpringBootVersion(request); validateType(request.getType(), metadata); diff --git a/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverterTests.java b/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverterTests.java index 645a28a9..70d62abe 100644 --- a/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverterTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectRequestToDescriptionConverterTests.java @@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; * * @author Madhura Bhave * @author Stephane Nicoll + * @author HaiTao Zhang */ public class ProjectRequestToDescriptionConverterTests { @@ -270,6 +271,39 @@ public class ProjectRequestToDescriptionConverterTests { assertThat(description.getPackageName()).isEqualTo("com.example.demo"); } + @Test + void conventionCorrectionForArtifactIdWithDifferentNameAsBaseDir() { + ProjectRequest request = createProjectRequest(); + String artifactId = "correct ! ID @"; + String validArtifactId = "correct-ID"; + request.setArtifactId(artifactId); + ProjectDescription description = this.converter.convert(request, this.metadata); + assertThat(description.getArtifactId()).isEqualTo(validArtifactId); + assertThat(description.getBaseDirectory()).isEqualTo(request.getBaseDir()); + } + + @Test + void conventionCorrectionForArtifactIdWithSameNameAsBaseDir() { + ProjectRequest request = createProjectRequest(); + String artifactId = "correct ! ID @"; + String validArtifactId = "correct-ID"; + request.setArtifactId(artifactId); + request.setBaseDir(artifactId); + ProjectDescription description = this.converter.convert(request, this.metadata); + assertThat(description.getArtifactId()).isEqualTo(validArtifactId); + assertThat(description.getBaseDirectory()).isEqualTo(validArtifactId); + } + + @Test + void conventionCorrectionForGroupId() { + ProjectRequest request = createProjectRequest(); + String groupId = "correct ! ID12 @"; + String validGroupId = "correct.ID12"; + request.setGroupId(groupId); + ProjectDescription description = this.converter.convert(request, this.metadata); + assertThat(description.getGroupId()).isEqualTo(validGroupId); + } + private ProjectRequest createProjectRequest() { WebProjectRequest request = new WebProjectRequest(); request.initialize(this.metadata);