diff --git a/initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java b/initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java index 32056130..6e4c0533 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java @@ -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 { @@ -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); diff --git a/initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java b/initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java index f942013d..4444ccb8 100644 --- a/initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java @@ -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();