Polish "Clean artifactId and groupId"

Closes gh-924
This commit is contained in:
Madhura Bhave 2019-06-17 15:59:27 -07:00
parent 10c7a4f32e
commit 06286e4fe9
2 changed files with 113 additions and 32 deletions

View File

@ -43,6 +43,8 @@ public class ProjectRequestToDescriptionConverter {
private static final Version VERSION_1_5_0 = Version.parse("1.5.0.RELEASE"); private static final Version VERSION_1_5_0 = Version.parse("1.5.0.RELEASE");
private static final char[] VALID_MAVEN_SPECIAL_CHARACTERS = new char[] { '_', '-', '.' };
public ProjectDescription convert(ProjectRequest request, InitializrMetadata metadata) { public ProjectDescription convert(ProjectRequest request, InitializrMetadata metadata) {
validate(request, metadata); validate(request, metadata);
String springBootVersion = getSpringBootVersion(request, metadata); String springBootVersion = getSpringBootVersion(request, metadata);
@ -50,16 +52,14 @@ public class ProjectRequestToDescriptionConverter {
validateDependencyRange(springBootVersion, resolvedDependencies); validateDependencyRange(springBootVersion, resolvedDependencies);
ProjectDescription description = new ProjectDescription(); ProjectDescription description = new ProjectDescription();
description.setApplicationName(getApplicationName(request, metadata)); description.setApplicationName(getApplicationName(request, metadata));
description.setArtifactId(determineValue(artificialIdCorrection(request.getArtifactId()), description.setArtifactId(getArtifactId(request, metadata));
() -> metadata.getArtifactId().getContent())); description.setBaseDirectory(getBaseDirectory(request.getBaseDir(), request.getArtifactId()));
description.setBaseDirectory(baseDirectoryCorrection(request.getBaseDir(), request.getArtifactId()));
description.setBuildSystem(getBuildSystem(request, metadata)); description.setBuildSystem(getBuildSystem(request, metadata));
description description
.setDescription(determineValue(request.getDescription(), () -> metadata.getDescription().getContent())); .setDescription(determineValue(request.getDescription(), () -> metadata.getDescription().getContent()));
description.setGroupId( description.setGroupId(getGroupId(request, metadata));
determineValue(groupIdCorrection(request.getGroupId()), () -> metadata.getGroupId().getContent()));
description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion())); description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion()));
description.setName(determineValue(request.getName(), () -> metadata.getName().getContent())); description.setName(getName(request, metadata));
description.setPackageName(getPackageName(request, metadata)); description.setPackageName(getPackageName(request, metadata));
description.setPackaging(Packaging.forId(request.getPackaging())); description.setPackaging(Packaging.forId(request.getPackaging()));
description.setPlatformVersion(Version.parse(springBootVersion)); description.setPlatformVersion(Version.parse(springBootVersion));
@ -74,36 +74,64 @@ public class ProjectRequestToDescriptionConverter {
return (StringUtils.hasText(candidate)) ? candidate : fallback.get(); return (StringUtils.hasText(candidate)) ? candidate : fallback.get();
} }
private String baseDirectoryCorrection(String baseDir, String artifactId) { private String getBaseDirectory(String baseDir, String artifactId) {
if (baseDir != null && baseDir.equals(artifactId)) { if (baseDir != null && baseDir.equals(artifactId)) {
return coordinateCorrection(baseDir, "-"); return cleanMavenCoordinate(baseDir, "-");
} }
return baseDir; return baseDir;
} }
private String artificialIdCorrection(String artifactId) { private String getName(ProjectRequest request, InitializrMetadata metadata) {
return coordinateCorrection(artifactId, "-"); String name = request.getName();
if (!StringUtils.hasText(name)) {
return metadata.getName().getContent();
}
if (name.equals(request.getArtifactId())) {
return cleanMavenCoordinate(name, "-");
}
return name;
} }
private String groupIdCorrection(String groupId) { private String getGroupId(ProjectRequest request, InitializrMetadata metadata) {
return coordinateCorrection(groupId, "."); if (!StringUtils.hasText(request.getGroupId())) {
return metadata.getGroupId().getContent();
}
return cleanMavenCoordinate(request.getGroupId(), ".");
} }
private String coordinateCorrection(String coordinate, String delimiter) { private String getArtifactId(ProjectRequest request, InitializrMetadata metadata) {
String[] elements = coordinate.split("[^A-Za-z0-9_\\-.]+"); if (!StringUtils.hasText(request.getArtifactId())) {
if (elements.length <= 1) { return metadata.getArtifactId().getContent();
}
return cleanMavenCoordinate(request.getArtifactId(), "-");
}
private String cleanMavenCoordinate(String coordinate, String delimiter) {
String[] elements = coordinate.split("[^\\w\\-.]+");
if (elements.length == 1) {
return coordinate; return coordinate;
} }
StringBuilder sb = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (String element : elements) { for (String element : elements) {
if (!(element.startsWith("-") || element.startsWith("_") || element.startsWith(".")) && sb.length() > 0 if (shouldAppendDelimiter(element, builder)) {
&& !(sb.charAt(sb.length() - 1) == '-' || sb.charAt(sb.length() - 1) == '_' builder.append(delimiter);
|| sb.charAt(sb.length() - 1) == '.')) {
sb.append(delimiter);
} }
sb.append(element); builder.append(element);
} }
return sb.toString(); return builder.toString();
}
private boolean shouldAppendDelimiter(String element, StringBuilder builder) {
if (builder.length() == 0) {
return false;
}
for (char c : VALID_MAVEN_SPECIAL_CHARACTERS) {
int prevIndex = builder.length() - 1;
if (element.charAt(0) == c || builder.charAt(prevIndex) == c) {
return false;
}
}
return true;
} }
private void validate(ProjectRequest request, InitializrMetadata metadata) { private void validate(ProjectRequest request, InitializrMetadata metadata) {

View File

@ -272,36 +272,89 @@ public class ProjectRequestToDescriptionConverterTests {
} }
@Test @Test
void conventionCorrectionForArtifactIdWithDifferentNameAsBaseDir() { void baseDirWhenNotSameAsArtifactIdShouldNotBeCleaned() {
ProjectRequest request = createProjectRequest(); ProjectRequest request = createProjectRequest();
String artifactId = "correct ! ID @"; String artifactId = "correct ! ID @";
String validArtifactId = "correct-ID";
request.setArtifactId(artifactId); request.setArtifactId(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata); ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo(validArtifactId);
assertThat(description.getBaseDirectory()).isEqualTo(request.getBaseDir()); assertThat(description.getBaseDirectory()).isEqualTo(request.getBaseDir());
} }
@Test @Test
void conventionCorrectionForArtifactIdWithSameNameAsBaseDir() { void baseDirWhenSameAsArtifactIdShouldBeCleaned() {
ProjectRequest request = createProjectRequest(); ProjectRequest request = createProjectRequest();
String artifactId = "correct ! ID @"; String artifactId = "correct ! ID @";
String validArtifactId = "correct-ID";
request.setArtifactId(artifactId); request.setArtifactId(artifactId);
request.setBaseDir(artifactId); request.setBaseDir(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata); ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo(validArtifactId); assertThat(description.getBaseDirectory()).isEqualTo("correct-ID");
assertThat(description.getBaseDirectory()).isEqualTo(validArtifactId);
} }
@Test @Test
void conventionCorrectionForGroupId() { void nameWhenNotSameAsArtifactIdShouldNotBeCleaned() {
ProjectRequest request = createProjectRequest();
String artifactId = "correct ! ID @";
request.setArtifactId(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getName()).isEqualTo(request.getName());
}
@Test
void nameWhenSameAsArtifactIdShouldBeCleaned() {
ProjectRequest request = createProjectRequest();
String artifactId = "correct ! ID @";
request.setArtifactId(artifactId);
request.setName(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getName()).isEqualTo("correct-ID");
}
@Test
void artifactIdWhenHasValidCharsOnlyShouldNotBeCleaned() {
ProjectRequest request = createProjectRequest();
String artifactId = "correct_test";
request.setArtifactId(artifactId);
request.setBaseDir(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo("correct_test");
}
@Test
void artifactIdWhenInvalidShouldBeCleanedWithHyphenDelimiter() {
ProjectRequest request = createProjectRequest();
String artifactId = "correct ! ID @";
request.setArtifactId(artifactId);
request.setBaseDir(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo("correct-ID");
}
@Test
void artifactIdWhenCleanedShouldNotContainHyphenBeforeOrAfterValidSpecialCharacter() {
ProjectRequest request = createProjectRequest();
String artifactId = "correct !_!ID @";
request.setArtifactId(artifactId);
request.setBaseDir(artifactId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo("correct_ID");
}
@Test
void groupIdWhenInvalidShouldBeCleanedWithDotDelimiter() {
ProjectRequest request = createProjectRequest(); ProjectRequest request = createProjectRequest();
String groupId = "correct ! ID12 @"; String groupId = "correct ! ID12 @";
String validGroupId = "correct.ID12";
request.setGroupId(groupId); request.setGroupId(groupId);
ProjectDescription description = this.converter.convert(request, this.metadata); ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getGroupId()).isEqualTo(validGroupId); assertThat(description.getGroupId()).isEqualTo("correct.ID12");
}
@Test
void groupIdWhenHasValidCharactersOnlyShouldNotBeCleaned() {
ProjectRequest request = createProjectRequest();
String groupId = "correct_ID12";
request.setGroupId(groupId);
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getGroupId()).isEqualTo("correct_ID12");
} }
private ProjectRequest createProjectRequest() { private ProjectRequest createProjectRequest() {