in grails-forge-core/src/main/java/org/grails/forge/util/NameUtils.java [41:66]
public static ProjectIdentifier parseProjectIdentifier(String name) throws IllegalArgumentException {
if (!isValidAppName(name)) {
throw new IllegalArgumentException("\"" + name + "\" is not a valid app name");
}
String packageName;
String appName;
String[] parts = name.split("\\.");
if (parts.length == 1) {
appName = parts[0];
packageName = createPackageName(appName);
} else {
if (parts.length == 0) {
throw new IllegalArgumentException("Cannot create a valid package name for [" + name + "]. Please specify a name that is also a valid Java package.");
}
int lastIdx = parts.length - 1;
appName = parts[lastIdx];
packageName = Arrays.stream(parts).limit(lastIdx).collect(Collectors.joining("."));
}
if (!isValidJavaPackage(packageName)) {
throw new IllegalArgumentException("Cannot create a valid package name for [" + packageName + "]. Please specify a name that is also a valid Java package.");
}
if (!isValidAppName(appName)) {
throw new IllegalArgumentException("\"" + appName + "\" is not a valid app name");
}
return new ProjectIdentifier(packageName, appName);
}