Skip to content

Commit

Permalink
Make manager use fields directly for typeMapper
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Feb 23, 2016
1 parent 24c2f9d commit 642f177
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 92 deletions.
Expand Up @@ -38,7 +38,6 @@
import static com.speedment.internal.core.code.DefaultJavaClassTranslator.GETTER_METHOD_PREFIX;
import static com.speedment.internal.core.code.DefaultJavaClassTranslator.SETTER_METHOD_PREFIX;
import com.speedment.internal.core.code.EntityAndManagerTranslator;
import com.speedment.internal.util.JavaLanguageNamer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down
Expand Up @@ -59,9 +59,9 @@
public final class GeneratedEntityManagerImplTranslator extends EntityAndManagerTranslator<Class> {

private static final String SPEEDMENT_VARIABLE_NAME = "speedment";

private final Speedment speedment;

public GeneratedEntityManagerImplTranslator(Speedment speedment, Generator gen, Table table) {
super(speedment, gen, table, Class::of);
this.speedment = speedment;
Expand All @@ -71,48 +71,48 @@ public GeneratedEntityManagerImplTranslator(Speedment speedment, Generator gen,
protected Class makeCodeGenModel(File file) {

return newBuilder(file, manager.getGeneratedImplName())
.forEveryColumn((clazz, col) -> {

final TypeMapper<?, ?> mapper = col.findTypeMapper();
final java.lang.Class<?> javaType = mapper.getJavaType();
final java.lang.Class<?> dbType = mapper.getDatabaseType();

final Type mapperType = Type.of(TypeMapper.class)
.add(Generic.of().add(Type.of(dbType)))
.add(Generic.of().add(Type.of(javaType)));

file.add(Import.of(Type.of(mapper.getClass())));

clazz.add(Field.of(typeMapperName(col), mapperType)
.private_().final_()
.set(new ReferenceValue("new " + mapper.getClass().getSimpleName() + "()"))
);
})
.build()
.public_().abstract_()
.setSupertype(Type.of(AbstractSqlManager.class)
.add(Generic.of().add(entity.getType()))
)
.add(manager.getGeneratedType())
.call(i -> file.add(Import.of(entity.getImplType())))
.add(Constructor.of()
.protected_()
.add(Field.of(SPEEDMENT_VARIABLE_NAME, Type.of(Speedment.class)))
.add("super(" + SPEEDMENT_VARIABLE_NAME + ");")
.add("setEntityMapper(this::newEntityFrom);"))
.add(newEntityFrom(file))
.add(Method.of("newEmptyEntity", entity.getType())
.public_().add(OVERRIDE)
.add("return new " + entity.getImplName() + "() {", indent(
"@Override",
"protected " + Speedment.class.getSimpleName() + " speedment() {", indent(
"return " + SPEEDMENT_VARIABLE_NAME + ";"
), "}"
), "};"
// .forEveryColumn((clazz, col) -> {
//
// final TypeMapper<?, ?> mapper = col.findTypeMapper();
// final java.lang.Class<?> javaType = mapper.getJavaType();
// final java.lang.Class<?> dbType = mapper.getDatabaseType();
//
// final Type mapperType = Type.of(TypeMapper.class)
// .add(Generic.of().add(Type.of(dbType)))
// .add(Generic.of().add(Type.of(javaType)));
//
// file.add(Import.of(Type.of(mapper.getClass())));
//
// clazz.add(Field.of(typeMapperName(col), mapperType)
// .private_().final_()
// .set(new ReferenceValue("new " + mapper.getClass().getSimpleName() + "()"))
// );
// })
.build()
.public_().abstract_()
.setSupertype(Type.of(AbstractSqlManager.class)
.add(Generic.of().add(entity.getType()))
)
.call($ -> file.add(Import.of(entity.getImplType())))
.call($ -> file.add(Import.of(Type.of(Speedment.class))))
);
.add(manager.getGeneratedType())
.call(i -> file.add(Import.of(entity.getImplType())))
.add(Constructor.of()
.protected_()
.add(Field.of(SPEEDMENT_VARIABLE_NAME, Type.of(Speedment.class)))
.add("super(" + SPEEDMENT_VARIABLE_NAME + ");")
.add("setEntityMapper(this::newEntityFrom);"))
.add(newEntityFrom(file))
.add(Method.of("newEmptyEntity", entity.getType())
.public_().add(OVERRIDE)
.add("return new " + entity.getImplName() + "() {", indent(
"@Override",
"protected " + Speedment.class.getSimpleName() + " speedment() {", indent(
"return " + SPEEDMENT_VARIABLE_NAME + ";"
), "}"
), "};"
)
.call($ -> file.add(Import.of(entity.getImplType())))
.call($ -> file.add(Import.of(Type.of(Speedment.class))))
);
}

private static enum Primitive {
Expand Down Expand Up @@ -144,9 +144,9 @@ private Method newEntityFrom(File file) {
file.add(Import.of(Type.of(SpeedmentException.class)));

final Method method = Method.of("newEntityFrom", entity.getType())
.protected_()
.add(Field.of("resultSet", Type.of(ResultSet.class)))
.add("final " + entity.getName() + " entity = newEmptyEntity();");
.protected_()
.add(Field.of("resultSet", Type.of(ResultSet.class)))
.add("final " + entity.getName() + " entity = newEmptyEntity();");

final JavaTypeMapperComponent mapperComponent = speedment.getJavaTypeMapperComponent();
final Stream.Builder<String> streamBuilder = Stream.builder();
Expand All @@ -159,47 +159,46 @@ private Method newEntityFrom(File file) {
dbmsTypeOf(speedment, dbmsOrThrow()),
c.findTypeMapper().getDatabaseType()
);

final StringBuilder sb = new StringBuilder()
.append("entity.set")
.append(typeName(c))
.append("(")
.append(typeMapperName(c))
.append(".toJavaType(");
.append("entity.set")
.append(typeName(c))
.append("(")
.append(typeMapperName(c))
.append(".toJavaType(");

final String getterName = "get" + mapping.getResultSetMethodName(dbmsOrThrow());

final boolean isResultSetMethod = Stream.of(ResultSet.class.getMethods())
.map(java.lang.reflect.Method::getName)
.anyMatch(getterName::equals);
.map(java.lang.reflect.Method::getName)
.anyMatch(getterName::equals);

final boolean isResultSetMethodReturnsPrimitive = Stream.of(ResultSet.class.getMethods())
.filter(m -> m.getName().equals(getterName))
.anyMatch(m -> m.getReturnType().isPrimitive());
.filter(m -> m.getName().equals(getterName))
.anyMatch(m -> m.getReturnType().isPrimitive());

if (isResultSetMethod && !(c.isNullable() && isResultSetMethodReturnsPrimitive)) {
sb
.append("resultSet.")
.append("get")
.append(mapping.getResultSetMethodName(dbmsOrThrow()))
.append("(").append(position.getAndIncrement()).append(")");
.append("resultSet.")
.append("get")
.append(mapping.getResultSetMethodName(dbmsOrThrow()))
.append("(").append(position.getAndIncrement()).append(")");
} else {
sb
.append("get")
.append(mapping.getResultSetMethodName(dbmsOrThrow()))
.append("(resultSet, ")
.append(position.getAndIncrement()).append(")");
.append("get")
.append(mapping.getResultSetMethodName(dbmsOrThrow()))
.append("(resultSet, ")
.append(position.getAndIncrement()).append(")");
}
sb.append("));");
streamBuilder.add(sb.toString());
});

method
.add("try " + block(streamBuilder.build()))
.add("catch (" + SQLException.class.getSimpleName() + " sqle) " + block(
"throw new " + SpeedmentException.class.getSimpleName() + "(sqle);"
))
.add("return entity;");
.add("try " + block(streamBuilder.build()))
.add("catch (" + SQLException.class.getSimpleName() + " sqle) " + block(
"throw new " + SpeedmentException.class.getSimpleName() + "(sqle);"
))
.add("return entity;");

return method;
}
Expand All @@ -226,31 +225,31 @@ public Type getImplType() {
protected Method generateGet(File file) {
file.add(Import.of(Type.of(IllegalArgumentException.class)));
return Method.of("get", OBJECT).public_().add(OVERRIDE)
.add(Field.of("entity", entity.getType()))
.add(Field.of("column", Type.of(Column.class)))
.add("switch (column.getName()) " + block(
columns().map(c -> "case \"" + c.getName() + "\" : return entity." + GETTER_METHOD_PREFIX + typeName(c) + "();").collect(Collectors.joining(nl()))
+ nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
));
.add(Field.of("entity", entity.getType()))
.add(Field.of("column", Type.of(Column.class)))
.add("switch (column.getName()) " + block(
columns().map(c -> "case \"" + c.getName() + "\" : return entity." + GETTER_METHOD_PREFIX + typeName(c) + "();").collect(Collectors.joining(nl()))
+ nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
));
}

protected Method generateSet(File file) {
file.add(Import.of(Type.of(IllegalArgumentException.class)));
return Method.of("set", VOID).public_().add(OVERRIDE)
.add(Field.of("entity", entity.getType()))
.add(Field.of("column", Type.of(Column.class)))
.add(Field.of("value", Type.of(Object.class)))
.add("switch (column.getName()) " + block(
columns()
.peek(c -> file.add(Import.of(Type.of(c.findTypeMapper().getJavaType()))))
.map(c -> "case \"" + c.getName() + "\" : entity." + SETTER_METHOD_PREFIX + typeName(c) + "((" + c.findTypeMapper().getJavaType().getSimpleName() + ") value); break;").collect(Collectors.joining(nl()))
+ nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
));
.add(Field.of("entity", entity.getType()))
.add(Field.of("column", Type.of(Column.class)))
.add(Field.of("value", Type.of(Object.class)))
.add("switch (column.getName()) " + block(
columns()
.peek(c -> file.add(Import.of(Type.of(c.findTypeMapper().getJavaType()))))
.map(c -> "case \"" + c.getName() + "\" : entity." + SETTER_METHOD_PREFIX + typeName(c) + "((" + c.findTypeMapper().getJavaType().getSimpleName() + ") value); break;").collect(Collectors.joining(nl()))
+ nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
));
}

protected Method generatePrimaryKeyFor(File file) {
final Method method = Method.of("primaryKeyFor", typeOfPK()).public_().add(OVERRIDE)
.add(Field.of("entity", entity.getType()));
.add(Field.of("entity", entity.getType()));

final int count = (int) primaryKeyColumns().count();
switch (count) {
Expand All @@ -261,15 +260,15 @@ protected Method generatePrimaryKeyFor(File file) {
}
case 1: {
method.add("return entity.get" + typeName(
primaryKeyColumns().findFirst().get().findColumn().get()
primaryKeyColumns().findFirst().get().findColumn().get()
) + "();");
break;
}
default: {
file.add(Import.of(Type.of(Arrays.class)));
method.add(primaryKeyColumns()
.map(pkc -> "entity.get" + typeName(pkc.findColumn().get()) + "()")
.collect(Collectors.joining(", ", "return Arrays.asList(", ");"))
.map(pkc -> "entity.get" + typeName(pkc.findColumn().get()) + "()")
.collect(Collectors.joining(", ", "return Arrays.asList(", ");"))
);
break;
}
Expand All @@ -278,7 +277,7 @@ protected Method generatePrimaryKeyFor(File file) {
return method;
}

private String typeMapperName(Column c) {
return variableName(c) + "TypeMapper";
private String typeMapperName(Column col) {
return entity.getName() + "." + javaLanguageNamer().javaStaticFieldName(col.getJavaName()) + ".typeMapper()";
}
}
}

0 comments on commit 642f177

Please sign in to comment.