package org.jooq.codegen;
import static org.jooq.codegen.AbstractGenerator.Language.KOTLIN;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
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.IdentityDefinition;
import org.jooq.meta.IndexDefinition;
import org.jooq.meta.SchemaDefinition;
import org.jooq.meta.SequenceDefinition;
import org.jooq.meta.TypedElementDefinition;
public abstract class AbstractGeneratorStrategy implements GeneratorStrategy {
@Override
public final String getGlobalReferencesFileName(Definition container, Class<? extends Definition> objectType) {
return getGlobalReferencesJavaClassName(container, objectType) + ".java";
}
@Override
public final String getFileName(Definition definition) {
return getFileName(definition, Mode.DEFAULT);
}
@Override
public final String getFileName(Definition definition, Mode mode) {
return getJavaClassName(definition, mode) + ".java";
}
@Override
public final File getFileRoot() {
String dir = getTargetDirectory();
String pkg = getTargetPackage().replaceAll("\\.", "/");
return new File(dir + "/" + pkg);
}
@Override
public final File getGlobalReferencesFile(Definition container, Class<? extends Definition> objectType) {
String dir = getTargetDirectory();
String pkg = getGlobalReferencesJavaPackageName(container, objectType).replaceAll("\\.", "/");
return new File(dir + "/" + pkg, getGlobalReferencesFileName(container, objectType));
}
@Override
public final File getFile(Definition definition) {
return getFile(definition, Mode.DEFAULT);
}
@Override
public final File getFile(Definition definition, Mode mode) {
String dir = getTargetDirectory();
String pkg = getJavaPackageName(definition, mode).replaceAll("\\.", "/");
return new File(dir + "/" + pkg, getFileName(definition, mode));
}
@Override
public final File getFile(String fileName) {
String dir = getTargetDirectory();
String pkg = getTargetPackage().replaceAll("\\.", "/");
return new File(dir + "/" + pkg, fileName);
}
@Override
public final String (Definition definition) {
return getFileHeader(definition, Mode.DEFAULT);
}
@Override
public final String getFullJavaIdentifier(Definition definition) {
StringBuilder sb = new StringBuilder();
if (definition instanceof EmbeddableDefinition) {
EmbeddableDefinition e = ((EmbeddableDefinition) definition);
if (getInstanceFields())
sb.append(getFullJavaIdentifier(e.getReferencingTable()));
else
sb.append(getFullJavaClassName(e.getReferencingTable()));
}
else if (definition instanceof ColumnDefinition) {
TypedElementDefinition<?> e = (TypedElementDefinition<?>) definition;
if (getInstanceFields())
sb.append(getFullJavaIdentifier(e.getContainer()));
else
sb.append(getFullJavaClassName(e.getContainer()));
}
else if (definition instanceof SequenceDefinition
|| definition instanceof DomainDefinition
|| definition instanceof IndexDefinition
|| definition instanceof IdentityDefinition
|| definition instanceof ConstraintDefinition
) {
if (getTargetLanguage() == KOTLIN)
sb.append(getGlobalReferencesJavaPackageName(definition.getSchema(), definition.getClass()));
else
sb.append(getGlobalReferencesFullJavaClassName(definition.getSchema(), definition.getClass()));
}
else if (definition instanceof TypedElementDefinition) {
TypedElementDefinition<?> e = (TypedElementDefinition<?>) definition;
sb.append(getFullJavaClassName(e.getContainer()));
}
else {
sb.append(getFullJavaClassName(definition));
}
sb.append(".");
sb.append(getJavaIdentifier(definition));
return sb.toString();
}
@Override
public final String getJavaSetterName(Definition definition) {
return getJavaSetterName(definition, Mode.DEFAULT);
}
@Override
public final String getJavaGetterName(Definition definition) {
return getJavaGetterName(definition, Mode.DEFAULT);
}
@Override
public final String getJavaMethodName(Definition definition) {
return getJavaMethodName(definition, Mode.DEFAULT);
}
@Override
public final String getJavaClassExtends(Definition definition) {
return getJavaClassExtends(definition, Mode.DEFAULT);
}
@Override
public final List<String> getJavaClassImplements(Definition definition) {
return getJavaClassImplements(definition, Mode.DEFAULT);
}
@Override
public final String getJavaClassName(Definition definition) {
return getJavaClassName(definition, Mode.DEFAULT);
}
@Override
public final String getJavaPackageName(Definition definition) {
return getJavaPackageName(definition, Mode.DEFAULT);
}
@Override
public final String getJavaMemberName(Definition definition) {
return getJavaMemberName(definition, Mode.DEFAULT);
}
@Override
public final String getGlobalReferencesFullJavaClassName(Definition container, Class<? extends Definition> objectType) {
return getGlobalReferencesJavaPackageName(container, objectType) + "." + getGlobalReferencesJavaClassName(container, objectType);
}
@Override
public final String getFullJavaClassName(Definition definition) {
return getFullJavaClassName(definition, Mode.DEFAULT);
}
@Override
public final String getFullJavaClassName(Definition definition, Mode mode) {
return getJavaPackageName(definition, mode) + "." + getJavaClassName(definition, mode);
}
@Override
public final List<String> getJavaIdentifiers(Collection<? extends Definition> definitions) {
List<? extends Definition> nonNull = nonNull(definitions);
List<String> result = new ArrayList<>(nonNull.size());
for (Definition definition : nonNull)
result.add(getJavaIdentifier(definition));
return result;
}
@Override
public final List<String> getJavaIdentifiers(Definition... definitions) {
return getJavaIdentifiers(Arrays.asList(definitions));
}
@Override
public final List<String> getFullJavaIdentifiers(Collection<? extends Definition> definitions) {
List<? extends Definition> nonNull = nonNull(definitions);
List<String> result = new ArrayList<>(nonNull.size());
for (Definition definition : nonNull)
result.add(getFullJavaIdentifier(definition));
return result;
}
@Override
public final List<String> getFullJavaIdentifiers(Definition... definitions) {
return getFullJavaIdentifiers(Arrays.asList(definitions));
}
private static final <T> List<T> nonNull(Collection<? extends T> collection) {
List<T> result = new ArrayList<>();
for (T t : collection)
if (t != null)
result.add(t);
return result;
}
final String getFixedJavaIdentifier(Definition definition) {
if (definition instanceof IdentityDefinition)
return "IDENTITY_" + getJavaIdentifier(((IdentityDefinition) definition).getColumn().getContainer());
else if (definition instanceof CatalogDefinition && ((CatalogDefinition) definition).isDefaultCatalog())
return "DEFAULT_CATALOG";
else if (definition instanceof SchemaDefinition && ((SchemaDefinition) definition).isDefaultSchema())
return "DEFAULT_SCHEMA";
else
return null;
}
final String getFixedJavaClassName(Definition definition) {
if (definition instanceof CatalogDefinition && ((CatalogDefinition) definition).isDefaultCatalog())
return "DefaultCatalog";
else if (definition instanceof SchemaDefinition && ((SchemaDefinition) definition).isDefaultSchema())
return "DefaultSchema";
else
return null;
}
}