CodeGenerationUtils.java revision 8bcb8538c3c913ddf6a43e656d5d663c7035db7e
1814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenpackage com.github.javaparser.utils; 26aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 3ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.io.File; 4ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.nio.file.Path; 5ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.nio.file.Paths; 6ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 7814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenimport static com.github.javaparser.utils.Utils.capitalize; 8cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassettiimport static com.github.javaparser.utils.Utils.decapitalize; 96aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 10814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenpublic final class CodeGenerationUtils { 11814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggen private CodeGenerationUtils() { 126aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen } 136aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 14968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen public static String getterName(Class<?> type, String name) { 15968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen if (name.startsWith("is")) { 16968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return name; 17968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } else if (type.equals(Boolean.class)) { 18968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return "is" + capitalize(name); 19968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 20968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return "get" + capitalize(name); 21968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 22968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen 2327e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti public static String getterToPropertyName(String getterName) { 2427e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti if (getterName.startsWith("is")) { 25cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassetti return decapitalize(getterName.substring("is".length())); 2627e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } else if (getterName.startsWith("get")) { 27cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassetti return decapitalize(getterName.substring("get".length())); 285c774718904c5e01f0c5161779c5fec4677f041dFederico Tomassetti } else if (getterName.startsWith("has")) { 295c774718904c5e01f0c5161779c5fec4677f041dFederico Tomassetti return decapitalize(getterName.substring("has".length())); 3027e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } 3127e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti throw new IllegalArgumentException("Unexpected getterName '" + getterName + "'"); 3227e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } 3327e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti 34b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen public static String setterName(String fieldName) { 357388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen if (fieldName.startsWith("is")) { 367388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen return "set" + fieldName.substring(2); 377388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen } 38b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return "set" + capitalize(fieldName); 39b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } 407388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen 41b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen public static String optionalOf(String text, boolean isOptional) { 42b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen if (isOptional) { 43b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return f("Optional.of(%s)", text); 44b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } else { 45b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return "Optional.empty()"; 46b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } 47968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 48968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen 496aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen /** 506aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen * A shortcut to String.format. 516aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen */ 526aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen public static String f(String format, Object... params) { 536aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen return String.format(format, params); 546aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen } 556aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 56ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 57ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Calculates the path to a file in a package. 58ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * 59ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param root the root directory in which the package resides 60ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param pkg the package in which the file resides, like "com.laamella.parser" 61ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param file the filename of the file in the package. 62ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 639d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageAbsolutePath(String root, String pkg, String file) { 64ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen pkg = packageToPath(pkg); 65ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return Paths.get(root, pkg, file).normalize(); 66ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 67ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 689d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageAbsolutePath(Path root, String pkg, String file) { 699d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return fileInPackageAbsolutePath(root.toString(), pkg, file); 709d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen } 719d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen 729d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen /** 739d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen * Turns a package and a file into a relative path. "com.laamella" and "Simple.java" will become 749d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen * "com/laamella/Simple.java" 759d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen */ 769d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageRelativePath(String pkg, String file) { 779d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen pkg = packageToPath(pkg); 789d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return Paths.get(pkg, file).normalize(); 79ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 80ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 81ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 82ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Converts a package name like "com.laamella.parser" to a path like "com/laamella/parser" 83ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 84ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen public static String packageToPath(String pkg) { 85ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return pkg.replace(".", File.separator); 86ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 87ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 88ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 89ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Calculates the path of a package. 90ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * 91ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param root the root directory in which the package resides 92ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param pkg the package, like "com.laamella.parser" 93ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 949d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path packageAbsolutePath(String root, String pkg) { 95ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen pkg = packageToPath(pkg); 96ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return Paths.get(root, pkg).normalize(); 97ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 98ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 999d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path packageAbsolutePath(Path root, String pkg) { 1009d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return packageAbsolutePath(root.toString(), pkg); 101ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 1028bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen 1038bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen /** 1048bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * @return the root directory of the classloader for class c. 1058bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen */ 1068bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen public static Path classLoaderRoot(Class<?> c) { 1078bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen return Paths.get(c.getProtectionDomain().getCodeSource().getLocation().getPath()); 1088bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen } 1098bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen 1108bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen /** 1118bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * Useful for locating source code in your Maven project. Finds the classpath for class c, then backs up out of 1128bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * "target/(test-)classes", giving the directory containing the pom.xml. 1138bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen */ 1148bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen public static Path mavenModuleRoot(Class<?> c) { 1158bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen return classLoaderRoot(c).resolve(Paths.get("..", "..")).normalize(); 1168bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen } 1178bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen 1188bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen /** 1198bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * Useful for locating source code in your Maven project. 1208bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * Finds the classpath for the JavaParser code (which is probably the classpath for your code too,) 1218bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * then backs up out of "target/(test-)classes", giving the directory containing the pom.xml. 1228bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen */ 1238bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen public static Path mavenModuleRoot() { 1248bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen return mavenModuleRoot(CodeGenerationUtils.class); 1258bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen } 1266aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen} 127