Merge pull request #1345 from nirbhay24

* pr/1345:
  Polish "Handle Unicode in Project Generation"
  Handle Unicode in Project Generation

Closes gh-1345
This commit is contained in:
Stephane Nicoll 2022-11-24 11:27:41 +01:00
commit 6fcd60d9ae
2 changed files with 49 additions and 4 deletions

View File

@ -16,6 +16,7 @@
package io.spring.initializr.web.project;
import java.text.Normalizer;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -34,6 +35,7 @@ import io.spring.initializr.metadata.Type;
import io.spring.initializr.metadata.support.MetadataBuildItemMapper;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* A default {@link ProjectRequestToDescriptionConverter} implementation that uses the
@ -44,6 +46,7 @@ import org.springframework.util.Assert;
* @author Madhura Bhave
* @author HaiTao Zhang
* @author Stephane Nicoll
* @author Nirbhay Mishra
*/
public class DefaultProjectRequestToDescriptionConverter
implements ProjectRequestToDescriptionConverter<ProjectRequest> {
@ -82,14 +85,14 @@ public class DefaultProjectRequestToDescriptionConverter
validateDependencyRange(platformVersion, resolvedDependencies);
description.setApplicationName(request.getApplicationName());
description.setArtifactId(request.getArtifactId());
description.setArtifactId(cleanInputValue(request.getArtifactId()));
description.setBaseDirectory(request.getBaseDir());
description.setBuildSystem(getBuildSystem(request, metadata));
description.setDescription(request.getDescription());
description.setGroupId(request.getGroupId());
description.setGroupId(cleanInputValue(request.getGroupId()));
description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion()));
description.setName(request.getName());
description.setPackageName(request.getPackageName());
description.setName(cleanInputValue(request.getName()));
description.setPackageName(cleanInputValue(request.getPackageName()));
description.setPackaging(Packaging.forId(request.getPackaging()));
description.setPlatformVersion(platformVersion);
description.setVersion(request.getVersion());
@ -97,6 +100,16 @@ public class DefaultProjectRequestToDescriptionConverter
MetadataBuildItemMapper.toDependency(dependency)));
}
/**
* Clean input value to rely on US-ascii character as much as possible.
* @param value the input value to clean
* @return a value that can be used as part of an identifier
*/
protected String cleanInputValue(String value) {
return StringUtils.hasText(value) ? Normalizer.normalize(value, Normalizer.Form.NFKD).replaceAll("\\p{M}", "")
: value;
}
private void validate(ProjectRequest request, InitializrMetadata metadata) {
validatePlatformVersion(request, metadata);
validateType(request.getType(), metadata);

View File

@ -47,6 +47,38 @@ class DefaultProjectRequestToDescriptionConverterTests {
private final DefaultProjectRequestToDescriptionConverter converter = new DefaultProjectRequestToDescriptionConverter();
@Test
void convertWhenArtifactIdHasAccentCleanValue() {
ProjectRequest request = createProjectRequest();
request.setArtifactId("tëst-âpp");
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getArtifactId()).isEqualTo("test-app");
}
@Test
void convertWhenGroupIdHasAccentCleanValue() {
ProjectRequest request = createProjectRequest();
request.setGroupId("com.êxample.äpp");
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getGroupId()).isEqualTo("com.example.app");
}
@Test
void convertWhenNameHasAccentCleanValue() {
ProjectRequest request = createProjectRequest();
request.setName("My Demö");
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getName()).isEqualTo("My Demo");
}
@Test
void convertWhenPackageNameHasAccentCleanValue() {
ProjectRequest request = createProjectRequest();
request.setPackageName("com.êxample.äpp");
ProjectDescription description = this.converter.convert(request, this.metadata);
assertThat(description.getPackageName()).isEqualTo("com.example.app");
}
@Test
void convertWhenTypeIsInvalidShouldThrowException() {
ProjectRequest request = createProjectRequest();