package org.jooq.codegen;
import static java.util.Arrays.asList;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
import static org.jooq.SQLDialect.POSTGRES;
import static org.jooq.codegen.AbstractGenerator.Language.KOTLIN;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.jooq.codegen.AbstractGenerator.Language;
import org.jooq.meta.ArrayDefinition;
import org.jooq.meta.CatalogDefinition;
import org.jooq.meta.ColumnDefinition;
import org.jooq.meta.ConstraintDefinition;
import org.jooq.meta.Definition;
import org.jooq.meta.DomainDefinition;
import org.jooq.meta.EmbeddableDefinition;
import org.jooq.meta.EnumDefinition;
import org.jooq.meta.ForeignKeyDefinition;
import org.jooq.meta.IdentityDefinition;
import org.jooq.meta.IndexDefinition;
import org.jooq.meta.PackageDefinition;
import org.jooq.meta.RoutineDefinition;
import org.jooq.meta.SchemaDefinition;
import org.jooq.meta.SequenceDefinition;
import org.jooq.meta.TableDefinition;
import org.jooq.meta.UDTDefinition;
import org.jooq.meta.UniqueKeyDefinition;
import org.jooq.tools.StringUtils;
public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy {
private String targetDirectory;
private String targetPackage;
private Locale targetLocale = Locale.getDefault();
private Language targetLanguage = Language.JAVA;
private boolean instanceFields = true;
private boolean javaBeansGettersAndSetters = false;
@Override
public void setInstanceFields(boolean instanceFields) {
this.instanceFields = instanceFields;
}
@Override
public boolean getInstanceFields() {
return instanceFields;
}
@Override
public void setJavaBeansGettersAndSetters(boolean javaBeansGettersAndSetters) {
this.javaBeansGettersAndSetters = javaBeansGettersAndSetters;
}
@Override
public boolean getJavaBeansGettersAndSetters() {
return javaBeansGettersAndSetters;
}
@Override
public String getTargetDirectory() {
return targetDirectory;
}
@Override
public void setTargetDirectory(String directory) {
this.targetDirectory = directory;
}
@Override
public String getTargetPackage() {
return targetPackage;
}
@Override
public void setTargetPackage(String packageName) {
this.targetPackage = packageName;
}
@Override
public Locale getTargetLocale() {
return targetLocale;
}
@Override
public void setTargetLocale(Locale targetLocale) {
this.targetLocale = targetLocale;
}
@Override
public Language getTargetLanguage() {
return targetLanguage;
}
@Override
public void setTargetLanguage(Language targetLanguage) {
this.targetLanguage = targetLanguage;
}
@Override
public String (Definition container, Class<? extends Definition> objectType) {
return "This file is generated by jOOQ.";
}
@Override
public String (Definition definition, Mode mode) {
return "This file is generated by jOOQ.";
}
@Override
public String getJavaIdentifier(Definition definition) {
String identifier = getFixedJavaIdentifier(definition);
if (identifier != null)
return identifier;
else if (definition instanceof IndexDefinition && asList(MARIADB, MYSQL).contains(definition.getDatabase().getDialect().family()))
return ((IndexDefinition) definition).getTable().getOutputName().toUpperCase(targetLocale) + "_" + definition.getOutputName().toUpperCase(targetLocale);
else if (definition instanceof ForeignKeyDefinition && asList(POSTGRES).contains(definition.getDatabase().getDialect().family()))
return ((ForeignKeyDefinition) definition).getTable().getOutputName().toUpperCase(targetLocale) + "__" + definition.getOutputName().toUpperCase(targetLocale);
else if (definition instanceof EmbeddableDefinition)
return ((EmbeddableDefinition) definition).getReferencingOutputName().toUpperCase(targetLocale);
else
return definition.getOutputName().toUpperCase(targetLocale);
}
private String getterSetterSuffix(Definition definition) {
if (javaBeansGettersAndSetters) {
String name = getJavaMemberName(definition);
if (Character.isUpperCase(name.charAt(0)))
return name;
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)))
return name;
char chars[] = name.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
if (definition instanceof EmbeddableDefinition)
return getJavaClassName0(((EmbeddableDefinition) definition).getReferencingOutputName(), Mode.DEFAULT);
else
return getJavaClassName0(definition, Mode.DEFAULT);
}
@Override
public String getJavaSetterName(Definition definition, Mode mode) {
return "set" + getterSetterSuffix(definition);
}
@Override
public String getJavaGetterName(Definition definition, Mode mode) {
return "get" + getterSetterSuffix(definition);
}
@Override
public String getJavaMethodName(Definition definition, Mode mode) {
if (definition instanceof ForeignKeyDefinition) {
ForeignKeyDefinition fk = (ForeignKeyDefinition) definition;
TableDefinition referenced = fk.getReferencedTable();
if (fk.getKeyTable().getForeignKeys(referenced).size() == 1)
return getJavaMethodName(referenced, mode);
}
return getJavaClassName0LC(definition, Mode.DEFAULT);
}
@Override
public String getGlobalReferencesJavaClassExtends(Definition container, Class<? extends Definition> objectType) {
return null;
}
@Override
public String getJavaClassExtends(Definition definition, Mode mode) {
return null;
}
@Override
public List<String> getGlobalReferencesJavaClassImplements(Definition container, Class<? extends Definition> objectType) {
return new ArrayList<>();
}
@Override
public List<String> getJavaClassImplements(Definition definition, Mode mode) {
return new ArrayList<>();
}
@Override
public String getGlobalReferencesJavaClassName(Definition container, Class<? extends Definition> objectType) {
if (ArrayDefinition.class.isAssignableFrom(objectType))
return "Arrays";
else if (ConstraintDefinition.class.isAssignableFrom(objectType))
return "Keys";
else if (DomainDefinition.class.isAssignableFrom(objectType))
return "Domains";
else if (EmbeddableDefinition.class.isAssignableFrom(objectType))
return "Embeddables";
else if (EnumDefinition.class.isAssignableFrom(objectType))
return "Enums";
else if (IdentityDefinition.class.isAssignableFrom(objectType))
return "Identities";
else if (IndexDefinition.class.isAssignableFrom(objectType))
return "Indexes";
else if (PackageDefinition.class.isAssignableFrom(objectType))
return "UDTs";
else if (RoutineDefinition.class.isAssignableFrom(objectType))
return "Routines";
else if (SequenceDefinition.class.isAssignableFrom(objectType))
return "Sequences";
else if (TableDefinition.class.isAssignableFrom(objectType))
return "Tables";
else if (UDTDefinition.class.isAssignableFrom(objectType))
return "UDTs";
else
return "UnknownTypes";
}
@Override
public String getJavaClassName(Definition definition, Mode mode) {
String name = getFixedJavaClassName(definition);
if (name != null)
return name;
else
return getJavaClassName0(definition, mode);
}
@Override
public String getGlobalReferencesJavaPackageName(Definition container, Class<? extends Definition> objectType) {
String packageName = getJavaPackageName(container);
if (container instanceof PackageDefinition)
packageName = packageName + "." + getJavaIdentifier(container).toLowerCase(targetLocale);
if (targetLanguage == KOTLIN) {
String className = getGlobalReferencesJavaClassName(container, objectType).toLowerCase(targetLocale);
if (TableDefinition.class.isAssignableFrom(objectType))
packageName = packageName + "." + className + ".references";
else if (RoutineDefinition.class.isAssignableFrom(objectType))
packageName = packageName + "." + className + ".references";
else if (UDTDefinition.class.isAssignableFrom(objectType))
packageName = packageName + "." + className + ".references";
else
packageName = packageName + "." + className;
}
return packageName;
}
@Override
public String getJavaPackageName(Definition definition, Mode mode) {
StringBuilder sb = new StringBuilder();
sb.append(getTargetPackage());
if (definition.getDatabase().getCatalogs().size() > 1) {
sb.append(".");
sb.append(getJavaIdentifier(definition.getCatalog()).toLowerCase(targetLocale));
}
if (!(definition instanceof CatalogDefinition)) {
if (definition.getDatabase().getSchemata().size() > 1) {
sb.append(".");
sb.append(getJavaIdentifier(definition.getSchema()).toLowerCase(targetLocale));
}
if (!(definition instanceof SchemaDefinition)) {
String subPackage = getSubPackage(definition);
if (!StringUtils.isBlank(subPackage)) {
sb.append(".");
sb.append(subPackage);
}
if (mode == Mode.RECORD) {
sb.append(".records");
}
else if (mode == Mode.POJO) {
sb.append(".pojos");
}
else if (mode == Mode.DAO) {
sb.append(".daos");
}
else if (mode == Mode.INTERFACE) {
sb.append(".interfaces");
}
}
}
return sb.toString();
}
@Override
public String getJavaMemberName(Definition definition, Mode mode) {
if (definition instanceof EmbeddableDefinition)
return getJavaClassName0LC(((EmbeddableDefinition) definition).getReferencingOutputName(), mode);
else
return getJavaClassName0LC(definition, mode);
}
private String getJavaClassName0LC(Definition definition, Mode mode) {
String result = getJavaClassName0(definition, mode);
return result.substring(0, 1).toLowerCase(targetLocale) + result.substring(1);
}
private String getJavaClassName0LC(String outputName, Mode mode) {
String result = getJavaClassName0(outputName, mode);
return result.substring(0, 1).toLowerCase(targetLocale) + result.substring(1);
}
private String getJavaClassName0(Definition definition, Mode mode) {
return getJavaClassName0(definition.getOutputName(), mode);
}
private String getJavaClassName0(String outputName, Mode mode) {
StringBuilder result = new StringBuilder();
result.append(StringUtils.toCamelCase(
outputName.replace(' ', '_')
.replace('-', '_')
.replace('.', '_')
));
if (mode == Mode.RECORD)
result.append("Record");
else if (mode == Mode.DAO)
result.append("Dao");
else if (mode == Mode.INTERFACE)
result.insert(0, "I");
return result.toString();
}
private String getSubPackage(Definition definition) {
if (definition instanceof TableDefinition) {
return "tables";
}
else if (definition instanceof EmbeddableDefinition) {
return "embeddables";
}
else if (definition instanceof UDTDefinition) {
UDTDefinition udt = (UDTDefinition) definition;
if (udt.getPackage() != null)
return "packages." + getJavaIdentifier(udt.getPackage()).toLowerCase(targetLocale) + ".udt";
else
return "udt";
}
else if (definition instanceof PackageDefinition) {
return "packages";
}
else if (definition instanceof RoutineDefinition) {
RoutineDefinition routine = (RoutineDefinition) definition;
if (routine.getPackage() instanceof UDTDefinition) {
return "udt." + getJavaIdentifier(routine.getPackage()).toLowerCase(targetLocale);
}
else if (routine.getPackage() != null) {
return "packages." + getJavaIdentifier(routine.getPackage()).toLowerCase(targetLocale);
}
else {
return "routines";
}
}
else if (definition instanceof EnumDefinition) {
return "enums";
}
else if (definition instanceof DomainDefinition) {
return "domains";
}
else if (definition instanceof ArrayDefinition) {
ArrayDefinition array = (ArrayDefinition) definition;
if (array.getPackage() != null)
return "packages." + getJavaIdentifier(array.getPackage()).toLowerCase(targetLocale) + ".udt";
else
return "udt";
}
return "";
}
@Override
public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
return overloadIndex;
}
}