1814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenpackage com.github.javaparser.utils; 26aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 3ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.io.File; 48de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggenimport java.net.URISyntaxException; 5ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.nio.file.Path; 6ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggenimport java.nio.file.Paths; 7ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 8814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenimport static com.github.javaparser.utils.Utils.capitalize; 9cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassettiimport static com.github.javaparser.utils.Utils.decapitalize; 106aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 11814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggenpublic final class CodeGenerationUtils { 12814f3f23d37d3e0906e257bdaf16382bad93266eDanny van Bruggen private CodeGenerationUtils() { 136aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen } 146aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 15968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen public static String getterName(Class<?> type, String name) { 16968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen if (name.startsWith("is")) { 17968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return name; 18968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } else if (type.equals(Boolean.class)) { 19968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return "is" + capitalize(name); 20968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 21968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen return "get" + capitalize(name); 22968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 23968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen 2427e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti public static String getterToPropertyName(String getterName) { 2527e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti if (getterName.startsWith("is")) { 26cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassetti return decapitalize(getterName.substring("is".length())); 2727e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } else if (getterName.startsWith("get")) { 28cad95538287a2837d9791e8ecb15f951d4f495e9Federico Tomassetti return decapitalize(getterName.substring("get".length())); 295c774718904c5e01f0c5161779c5fec4677f041dFederico Tomassetti } else if (getterName.startsWith("has")) { 305c774718904c5e01f0c5161779c5fec4677f041dFederico Tomassetti return decapitalize(getterName.substring("has".length())); 3127e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } 3227e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti throw new IllegalArgumentException("Unexpected getterName '" + getterName + "'"); 3327e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti } 3427e2684b5db6453f5e2a34c543a96fcca8a01d70Federico Tomassetti 35b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen public static String setterName(String fieldName) { 367388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen if (fieldName.startsWith("is")) { 377388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen return "set" + fieldName.substring(2); 387388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen } 39b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return "set" + capitalize(fieldName); 40b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } 417388c8050ba64e8ac73bf29d1199c89fb53ec299Danny van Bruggen 42b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen public static String optionalOf(String text, boolean isOptional) { 43b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen if (isOptional) { 44b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return f("Optional.of(%s)", text); 45b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } else { 46b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen return "Optional.empty()"; 47b12d4d933f76cfe8de43ee919aa8357dcd38afb8Danny van Bruggen } 48968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen } 49968a83319e36ab864daf78398bf45afa1eb34de7Danny van Bruggen 506aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen /** 516aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen * A shortcut to String.format. 526aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen */ 536aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen public static String f(String format, Object... params) { 546aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen return String.format(format, params); 556aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen } 566aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen 57ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 58ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Calculates the path to a file in a package. 59ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * 60ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param root the root directory in which the package resides 61ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param pkg the package in which the file resides, like "com.laamella.parser" 62ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param file the filename of the file in the package. 63ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 649d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageAbsolutePath(String root, String pkg, String file) { 65ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen pkg = packageToPath(pkg); 66ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return Paths.get(root, pkg, file).normalize(); 67ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 68ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 699d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageAbsolutePath(Path root, String pkg, String file) { 709d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return fileInPackageAbsolutePath(root.toString(), pkg, file); 719d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen } 729d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen 739d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen /** 749d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen * Turns a package and a file into a relative path. "com.laamella" and "Simple.java" will become 759d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen * "com/laamella/Simple.java" 769d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen */ 779d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path fileInPackageRelativePath(String pkg, String file) { 789d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen pkg = packageToPath(pkg); 799d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return Paths.get(pkg, file).normalize(); 80ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 81ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 82ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 83ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Converts a package name like "com.laamella.parser" to a path like "com/laamella/parser" 84ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 85ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen public static String packageToPath(String pkg) { 86ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return pkg.replace(".", File.separator); 87ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 88ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 89ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen /** 90ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * Calculates the path of a package. 91ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * 92ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param root the root directory in which the package resides 93ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen * @param pkg the package, like "com.laamella.parser" 94ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen */ 959d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path packageAbsolutePath(String root, String pkg) { 96ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen pkg = packageToPath(pkg); 97ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen return Paths.get(root, pkg).normalize(); 98ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 99ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen 1009d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen public static Path packageAbsolutePath(Path root, String pkg) { 1019d88cd67abacf53ded599667aa1b26a8da40b6ecDanny van Bruggen return packageAbsolutePath(root.toString(), pkg); 102ed31b534d8416d22e8e9939c475ab16d186f87faDanny van Bruggen } 1038bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen 1048bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen /** 1058bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * @return the root directory of the classloader for class c. 1068bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen */ 1078bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen public static Path classLoaderRoot(Class<?> c) { 1088de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggen try { 1098de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggen return Paths.get(c.getProtectionDomain().getCodeSource().getLocation().toURI()); 1108de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggen } catch (URISyntaxException e) { 1118de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggen throw new AssertionError("Bug in JavaParser, please report.", e); 1128de0c2c7931cf6db738d5f6e8faa6b3d27d791c8Danny van Bruggen } 1138bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen } 1148bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen 1158bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen /** 1168bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * Useful for locating source code in your Maven project. Finds the classpath for class c, then backs up out of 1178bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen * "target/(test-)classes", giving the directory containing the pom.xml. 1188bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen */ 1198bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen public static Path mavenModuleRoot(Class<?> c) { 1208bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen return classLoaderRoot(c).resolve(Paths.get("..", "..")).normalize(); 1218bcb8538c3c913ddf6a43e656d5d663c7035db7eDanny van Bruggen } 122293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen 123293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen /** 124293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen * Shortens path "full" by cutting "difference" off the end of it. 125293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen */ 126293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen public static Path subtractPaths(Path full, Path difference) { 127293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen while (difference != null) { 128293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen if (difference.getFileName().equals(full.getFileName())) { 129293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen difference = difference.getParent(); 130293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen full = full.getParent(); 131293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen } else { 132293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen throw new RuntimeException(f("'%s' could not be subtracted from '%s'", difference, full)); 133293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen } 134293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen } 135293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen return full; 136293b988fc980fcc615e1d18fb06b35e543679b82Danny van Bruggen } 1376aee546763ad699cc206376c4ab50a8b9e111d95Danny van Bruggen} 138