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