package io.trygvis.container.compiler; import io.trygvis.container.compiler.model.ClassG; import io.trygvis.container.compiler.model.Imports; import io.trygvis.container.compiler.model.TypeRef; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.persistence.PersistenceException; import javax.tools.JavaFileObject; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import static io.trygvis.container.compiler.model.ClassG.addAll; import static java.lang.Character.isUpperCase; import static java.lang.Character.toLowerCase; import static java.lang.Character.toUpperCase; import static org.apache.commons.lang.StringUtils.stripEnd; public class Utils { public static final String EOL = System.getProperty("line.separator"); public static String toFieldName(TypeRef type) { return toFieldName(type.className); } public static String toFieldName(String s) { if (s.length() < 1) { return s.toLowerCase(); } if (s.startsWith("set")) { s = s.substring(3, s.length()); } else if (s.startsWith("get")) { s = s.substring(3, s.length()); } char[] chars = s.toCharArray(); boolean toUpper = false; int j = 0; for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (c == '_') { toUpper = true; } else { if (j == 0) { chars[j++] = toLowerCase(c); } else { chars[j++] = toUpper ? toUpperCase(c) : c; } toUpper = false; } } return new String(chars, 0, j); } public static String toClassName(String s) { s = toFieldName(s); return toUpperCase(s.charAt(0)) + s.substring(1, s.length()); } public static String toSetterName(String s) { s = toFieldName(s); return "set" + toUpperCase(s.charAt(0)) + s.substring(1, s.length()); } public static String toGetterName(String s) { s = toFieldName(s); return "get" + toUpperCase(s.charAt(0)) + s.substring(1, s.length()); } public static String toJavaString(String s) { try { BufferedReader reader = new BufferedReader(new StringReader(s)); String line = reader.readLine(); StringBuilder buffer = new StringBuilder(); while (line != null) { buffer.append('"'); buffer.append(line.replace("\"", "\\\"")); buffer.append('"'); line = reader.readLine(); if (line != null) { buffer.append(" +").append(EOL); } } return buffer.toString(); } catch (IOException e) { throw new RuntimeException(e); } } public static void writeFile(ProcessingEnvironment processingEnv, ClassG g, Element element) throws IOException { JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(g.type.fqName, element); try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) { for (String s : g.generate()) { w.println(stripEnd(s, " ")); } } } public static List tryCatchSqlException(Imports imports, List body) { TypeRef sqlException = imports.add(SQLException.class); TypeRef persistenceException = imports.add(PersistenceException.class); List newBody = new ArrayList<>(); newBody.add("try {"); addAll(1, newBody, body); newBody.add("} catch (" + sqlException.plainName + " e) {"); newBody.add(" throw new " + persistenceException.plainName + "(e);"); // TODO: Add context info. newBody.add("}"); return newBody; } public static String sqlName(String javaName) { StringBuilder builder = new StringBuilder(); for (char c : javaName.toCharArray()) { if (isUpperCase(c) && builder.length() > 0) { builder.append("_"); } if (Character.isLetterOrDigit(c)) { builder.append(toLowerCase(c)); } else { builder.append('_'); } } return builder.toString(); } }