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