Handle Unicode in Project Generation

This commit replaces characters with accents with their US-ascii
counterpart.

See gh-1345
This commit is contained in:
nirbhay mishra
2022-11-24 11:03:28 +01:00
committed by Stephane Nicoll
parent 39208e3cb0
commit 7b204b1704
2 changed files with 20 additions and 4 deletions
@@ -16,6 +16,7 @@
package io.spring.initializr.web.project; package io.spring.initializr.web.project;
import java.text.Normalizer;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -34,6 +35,7 @@ import io.spring.initializr.metadata.Type;
import io.spring.initializr.metadata.support.MetadataBuildItemMapper; import io.spring.initializr.metadata.support.MetadataBuildItemMapper;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/** /**
* A default {@link ProjectRequestToDescriptionConverter} implementation that uses the * A default {@link ProjectRequestToDescriptionConverter} implementation that uses the
@@ -44,6 +46,7 @@ import org.springframework.util.Assert;
* @author Madhura Bhave * @author Madhura Bhave
* @author HaiTao Zhang * @author HaiTao Zhang
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Nirbhay Mishra
*/ */
public class DefaultProjectRequestToDescriptionConverter public class DefaultProjectRequestToDescriptionConverter
implements ProjectRequestToDescriptionConverter<ProjectRequest> { implements ProjectRequestToDescriptionConverter<ProjectRequest> {
@@ -82,14 +85,14 @@ public class DefaultProjectRequestToDescriptionConverter
validateDependencyRange(platformVersion, resolvedDependencies); validateDependencyRange(platformVersion, resolvedDependencies);
description.setApplicationName(request.getApplicationName()); description.setApplicationName(request.getApplicationName());
description.setArtifactId(request.getArtifactId()); description.setArtifactId(cleanInputValue(request.getArtifactId()));
description.setBaseDirectory(request.getBaseDir()); description.setBaseDirectory(request.getBaseDir());
description.setBuildSystem(getBuildSystem(request, metadata)); description.setBuildSystem(getBuildSystem(request, metadata));
description.setDescription(request.getDescription()); description.setDescription(request.getDescription());
description.setGroupId(request.getGroupId()); description.setGroupId(cleanInputValue(request.getGroupId()));
description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion())); description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion()));
description.setName(request.getName()); description.setName(cleanInputValue(request.getName()));
description.setPackageName(request.getPackageName()); description.setPackageName(cleanInputValue(request.getPackageName()));
description.setPackaging(Packaging.forId(request.getPackaging())); description.setPackaging(Packaging.forId(request.getPackaging()));
description.setPlatformVersion(platformVersion); description.setPlatformVersion(platformVersion);
description.setVersion(request.getVersion()); description.setVersion(request.getVersion());
@@ -188,4 +191,11 @@ public class DefaultProjectRequestToDescriptionConverter
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
private String cleanInputValue(String inputString) {
if (StringUtils.hasText(inputString)) {
return Normalizer.normalize(inputString, Normalizer.Form.NFKD).replaceAll("\\p{M}", "");
}
return inputString;
}
} }
@@ -36,4 +36,10 @@ public class ProjectGenerationControllerArchiveIntegrationTests extends Abstract
assertDefaultProject(project.resolveModule("demo trial")); assertDefaultProject(project.resolveModule("demo trial"));
} }
@Test
void projectNameWithAccentRemoved() {
ProjectStructure project = downloadZip("/starter.zip?artifactId=demo&baseDir=demo trial&name=Demö");
assertDefaultProject(project.resolveModule("demo trial"));
}
} }