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.GETTER_METHOD_PREFIX;
import static com.speedment.internal.core.code.DefaultJavaClassTranslator.SETTER_METHOD_PREFIX; import static com.speedment.internal.core.code.DefaultJavaClassTranslator.SETTER_METHOD_PREFIX;
import com.speedment.internal.core.code.EntityAndManagerTranslator; import com.speedment.internal.core.code.EntityAndManagerTranslator;
import com.speedment.internal.util.JavaLanguageNamer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
Expand Down
Expand Up @@ -59,9 +59,9 @@
public final class GeneratedEntityManagerImplTranslator extends EntityAndManagerTranslator<Class> { public final class GeneratedEntityManagerImplTranslator extends EntityAndManagerTranslator<Class> {


private static final String SPEEDMENT_VARIABLE_NAME = "speedment"; private static final String SPEEDMENT_VARIABLE_NAME = "speedment";

private final Speedment speedment; private final Speedment speedment;

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


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

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

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

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

//
clazz.add(Field.of(typeMapperName(col), mapperType) // clazz.add(Field.of(typeMapperName(col), mapperType)
.private_().final_() // .private_().final_()
.set(new ReferenceValue("new " + mapper.getClass().getSimpleName() + "()")) // .set(new ReferenceValue("new " + mapper.getClass().getSimpleName() + "()"))
); // );
}) // })
.build() .build()
.public_().abstract_() .public_().abstract_()
.setSupertype(Type.of(AbstractSqlManager.class) .setSupertype(Type.of(AbstractSqlManager.class)
.add(Generic.of().add(entity.getType())) .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 + ";"
), "}"
), "};"
) )
.call($ -> file.add(Import.of(entity.getImplType()))) .add(manager.getGeneratedType())
.call($ -> file.add(Import.of(Type.of(Speedment.class)))) .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 { 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))); file.add(Import.of(Type.of(SpeedmentException.class)));


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


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

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


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


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


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


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


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


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


protected Method generateSet(File file) { protected Method generateSet(File file) {
file.add(Import.of(Type.of(IllegalArgumentException.class))); file.add(Import.of(Type.of(IllegalArgumentException.class)));
return Method.of("set", VOID).public_().add(OVERRIDE) return Method.of("set", VOID).public_().add(OVERRIDE)
.add(Field.of("entity", entity.getType())) .add(Field.of("entity", entity.getType()))
.add(Field.of("column", Type.of(Column.class))) .add(Field.of("column", Type.of(Column.class)))
.add(Field.of("value", Type.of(Object.class))) .add(Field.of("value", Type.of(Object.class)))
.add("switch (column.getName()) " + block( .add("switch (column.getName()) " + block(
columns() columns()
.peek(c -> file.add(Import.of(Type.of(c.findTypeMapper().getJavaType())))) .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())) .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() + \"'.\");" + nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
)); ));
} }


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


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

0 comments on commit 642f177

Please sign in to comment.