Skip to content

Commit

Permalink
Break out common parts from the entity to separate classes
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Aug 26, 2015
1 parent 44fd108 commit a5a8253
Show file tree
Hide file tree
Showing 7 changed files with 490 additions and 121 deletions.
Expand Up @@ -35,6 +35,7 @@
import com.speedment.codegen.lang.models.implementation.GenericImpl; import com.speedment.codegen.lang.models.implementation.GenericImpl;
import static com.speedment.codegen.util.Formatting.indent; import static com.speedment.codegen.util.Formatting.indent;
import com.speedment.core.config.model.Table; import com.speedment.core.config.model.Table;
import com.speedment.core.entity.impl.AbstractBaseEntity;
import com.speedment.core.exception.SpeedmentException; import com.speedment.core.exception.SpeedmentException;
import com.speedment.core.manager.Manager; import com.speedment.core.manager.Manager;
import com.speedment.core.platform.Speedment; import com.speedment.core.platform.Speedment;
Expand All @@ -55,22 +56,22 @@
* @author pemi * @author pemi
*/ */
public class EntityImplTranslator extends BaseEntityAndManagerTranslator<Class> { public class EntityImplTranslator extends BaseEntityAndManagerTranslator<Class> {

private static final String SPEEDMENT_INSTANCE_NAME = "speedmentInstance_"; private static final String SPEEDMENT_NAME = "speedment";
private static final String MANAGER_METHOD = "manager_"; private static final String MANAGER_METHOD = "manager_";
private static final String MANAGER_OF_METHOD = "managerOf_"; private static final String MANAGER_OF_METHOD = "managerOf_";

public EntityImplTranslator(Generator cg, Table configEntity) { public EntityImplTranslator(Generator cg, Table configEntity) {
super(cg, configEntity); super(cg, configEntity);
} }

@Override @Override
protected Class make(File file) { protected Class make(File file) {
final Map<Table, List<String>> fkStreamers = new HashMap<>(); final Map<Table, List<String>> fkStreamers = new HashMap<>();

final Class newClass = new ClassBuilder(ENTITY.getImplName()) final Class newClass = new ClassBuilder(ENTITY.getImplName())
.addColumnConsumer((cl, c) -> { .addColumnConsumer((cl, c) -> {

final Type retType; final Type retType;
final String getter; final String getter;
if (c.isNullable()) { if (c.isNullable()) {
Expand All @@ -80,7 +81,7 @@ protected Class make(File file) {
retType = Type.of(c.getMapping()); retType = Type.of(c.getMapping());
getter = variableName(c); getter = variableName(c);
} }

cl cl
.add(fieldFor(c).private_()) .add(fieldFor(c).private_())
.add(Method.of(GETTER_METHOD_PREFIX + typeName(c), retType) .add(Method.of(GETTER_METHOD_PREFIX + typeName(c), retType)
Expand Down Expand Up @@ -112,16 +113,16 @@ protected Class make(File file) {
.addForeignKeyConsumer((i, fk) -> { .addForeignKeyConsumer((i, fk) -> {
final FkHolder fu = new FkHolder(getCodeGenerator(), fk); final FkHolder fu = new FkHolder(getCodeGenerator(), fk);
fu.imports().forEachOrdered(file::add); fu.imports().forEachOrdered(file::add);

final Type returnType; final Type returnType;
if (fu.getColumn().isNullable()) { if (fu.getColumn().isNullable()) {
file.add(Import.of(OPTIONAL)); file.add(Import.of(OPTIONAL));
returnType = OPTIONAL.add(fu.getForeignEmt().GENERIC_OF_ENTITY); returnType = OPTIONAL.add(fu.getForeignEmt().GENERIC_OF_ENTITY);

} else { } else {
returnType = fu.getForeignEmt().ENTITY.getType(); returnType = fu.getForeignEmt().ENTITY.getType();
} }

final Method method = Method.of("find" + typeName(fu.getColumn()), returnType).public_().add(OVERRIDE); final Method method = Method.of("find" + typeName(fu.getColumn()), returnType).public_().add(OVERRIDE);
if (fu.getColumn().isNullable()) { if (fu.getColumn().isNullable()) {
final String varName = variableName(fu.getForeignTable()); final String varName = variableName(fu.getForeignTable());
Expand All @@ -136,7 +137,7 @@ protected Class make(File file) {
} else { } else {
file.add(Import.of(Type.of(SpeedmentException.class))); file.add(Import.of(Type.of(SpeedmentException.class)));
//method.add("return " + fu.getForeignEmt().MANAGER.getName() + ".get().stream()\n" + indent( //method.add("return " + fu.getForeignEmt().MANAGER.getName() + ".get().stream()\n" + indent(
method.add("return " + MANAGER_OF_METHOD + "(" + fu.getForeignEmt().typeName() + ".class).stream()\n" + indent( method.add("return " + MANAGER_OF_METHOD + "(" + fu.getForeignEmt().typeName() + ".class).stream()\n" + indent(
".filter(" + typeName(fu.getForeignTable()) + "." + JavaLanguage.javaStaticFieldName(fu.getForeignColumn().getName()) + ".equal(get" + typeName(fu.getColumn()) + "()))\n" ".filter(" + typeName(fu.getForeignTable()) + "." + JavaLanguage.javaStaticFieldName(fu.getForeignColumn().getName()) + ".equal(get" + typeName(fu.getColumn()) + "()))\n"
+ ".findAny().orElseThrow(() -> new SpeedmentException(\n" + indent( + ".findAny().orElseThrow(() -> new SpeedmentException(\n" + indent(
"\"Foreign key constraint error. " + typeName(fu.getForeignTable()) + " is set to \" + get" + typeName(fu.getColumn()) + "()\n" "\"Foreign key constraint error. " + typeName(fu.getForeignTable()) + " is set to \" + get" + typeName(fu.getColumn()) + "()\n"
Expand All @@ -148,32 +149,36 @@ protected Class make(File file) {
.build() .build()
.public_() .public_()
.final_() .final_()
.setSupertype(Type.of(AbstractBaseEntity.class).add(Generic.of().add(ENTITY.getType())))
.add(ENTITY.getType()) .add(ENTITY.getType())
.add(Field.of(SPEEDMENT_INSTANCE_NAME, Type.of(Speedment.class)).private_().final_()) //.add(Field.of(SPEEDMENT_INSTANCE_NAME, Type.of(Speedment.class)).private_().final_())
.add(Constructor.of().add(Field.of(SPEEDMENT_INSTANCE_NAME, Type.of(Speedment.class))) .add(Constructor.of().add(Field.of(SPEEDMENT_NAME, Type.of(Speedment.class)))
.add("this." + SPEEDMENT_INSTANCE_NAME + " = " + SPEEDMENT_INSTANCE_NAME + ";") .add("super(" + SPEEDMENT_NAME + ");")
) )
.add(EntityTranslatorSupport.toJson().public_().add(OVERRIDE).add("return manager_().toJson(this);")) // .add(EntityTranslatorSupport.toJson().public_().add(OVERRIDE).add("return manager_().toJson(this);"))
//.add(EntityTranslatorSupport.toJsonExtended(ENTITY.getType()).public_().add(OVERRIDE)) //.add(EntityTranslatorSupport.toJsonExtended(ENTITY.getType()).public_().add(OVERRIDE))
//.add(stream()) //.add(stream())
.add(manager()) // .add(manager())
.add(managerOf(file)) // .add(managerOf(file))
.add(persist()) // .add(persist())
.add(update()) // .add(update())
.add(remove()) // .add(remove())
.add(persistWithListener()) // .add(persistWithListener())
.add(updateWithListener()) // .add(updateWithListener())
.add(removeWithListener()) // .add(removeWithListener())
.add(toString(file)) .add(toString(file))
.add(equalsMethod()) .add(equalsMethod())
.add(hashCodeMethod()); .add(hashCodeMethod())
.add(Method.of("getEntityClass_", Type.of(java.lang.Class.class).add(Generic.of().add(ENTITY.getType()))).public_().add(OVERRIDE)
.add("return " + ENTITY.getName() + ".class;")
);


// Create aggregate streaming functions, if any // Create aggregate streaming functions, if any
fkStreamers.keySet().stream().forEach((referencingTable) -> { fkStreamers.keySet().stream().forEach((referencingTable) -> {
final List<String> methodNames = fkStreamers.get(referencingTable); final List<String> methodNames = fkStreamers.get(referencingTable);
if (!methodNames.isEmpty()) { if (!methodNames.isEmpty()) {
final Method method = Method.of( final Method method = Method.of(
EntityTranslatorSupport.pluralis(referencingTable), EntityTranslatorSupport.pluralis(referencingTable),
Type.of(Stream.class).add(Generic.of().setLowerBound(typeName(referencingTable))) Type.of(Stream.class).add(Generic.of().setLowerBound(typeName(referencingTable)))
).public_().add(OVERRIDE); ).public_().add(OVERRIDE);


Expand All @@ -188,18 +193,18 @@ protected Class make(File file) {
newClass.add(method); newClass.add(method);
} }
}); });

return newClass; return newClass;

} }

private Method manager() { private Method manager() {
//file.add(Import.of(Type.of(ManagerComponent.class))); //file.add(Import.of(Type.of(ManagerComponent.class)));
return Method.of(MANAGER_METHOD, Type.of(Manager.class).add(Generic.of().add(ENTITY.getType()))).private_() return Method.of(MANAGER_METHOD, Type.of(Manager.class).add(Generic.of().add(ENTITY.getType()))).private_()
.add("return " + MANAGER_OF_METHOD + "(" + ENTITY.getName() + ".class);"); .add("return " + MANAGER_OF_METHOD + "(" + ENTITY.getName() + ".class);");
// .add("return " + SPEEDMENT_INSTANCE_NAME + ".get(ManagerComponent.class).managerOf(" + ENTITY.getName() + ".class);"); // .add("return " + SPEEDMENT_INSTANCE_NAME + ".get(ManagerComponent.class).managerOf(" + ENTITY.getName() + ".class);");
} }

private Method managerOf(File file) { private Method managerOf(File file) {
file.add(Import.of(Type.of(ManagerComponent.class))); file.add(Import.of(Type.of(ManagerComponent.class)));
final Generic genericTypeT = Generic.of().add(Type.of("T")); final Generic genericTypeT = Generic.of().add(Type.of("T"));
Expand All @@ -208,48 +213,48 @@ private Method managerOf(File file) {
.add(genericTypeT) .add(genericTypeT)
.add(Field.of(parameterName, Type.of(java.lang.Class.class).add(genericTypeT))) .add(Field.of(parameterName, Type.of(java.lang.Class.class).add(genericTypeT)))
.private_() .private_()
.add("return " + SPEEDMENT_INSTANCE_NAME + ".get(ManagerComponent.class).managerOf(" + parameterName + ");"); .add("return " + SPEEDMENT_NAME + ".get(ManagerComponent.class).managerOf(" + parameterName + ");");
} }

private Method persist() { private Method persist() {
return EntityTranslatorSupport.persist().public_().add(OVERRIDE) return EntityTranslatorSupport.persist(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().persist(this);"); .add("return manager_().persist(this);");

} }

private Method update() { private Method update() {
return EntityTranslatorSupport.update().public_().add(OVERRIDE) return EntityTranslatorSupport.update(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().update(this);"); .add("return manager_().update(this);");
} }

private Method remove() { private Method remove() {
return EntityTranslatorSupport.remove().public_().add(OVERRIDE) return EntityTranslatorSupport.remove(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().remove(this);"); .add("return manager_().remove(this);");
} }

private Method persistWithListener() { private Method persistWithListener() {
return EntityTranslatorSupport.persistWithListener(ENTITY.getType()).public_().add(OVERRIDE) return EntityTranslatorSupport.persistWithListener(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().persist(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");"); .add("return manager_().persist(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");");
} }

private Method updateWithListener() { private Method updateWithListener() {
return EntityTranslatorSupport.updateWithListener(ENTITY.getType()).public_().add(OVERRIDE) return EntityTranslatorSupport.updateWithListener(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().update(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");"); .add("return manager_().update(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");");
} }

private Method removeWithListener() { private Method removeWithListener() {
return EntityTranslatorSupport.removeWithListener(ENTITY.getType()).public_().add(OVERRIDE) return EntityTranslatorSupport.removeWithListener(ENTITY.getType()).public_().add(OVERRIDE)
.add("manager_().remove(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");"); .add("return manager_().remove(this, " + EntityTranslatorSupport.CONSUMER_NAME + ");");
} }

protected Method toString(File file) { protected Method toString(File file) {
file.add(Import.of(Type.of(StringJoiner.class))); file.add(Import.of(Type.of(StringJoiner.class)));
file.add(Import.of(Type.of(Objects.class))); file.add(Import.of(Type.of(Objects.class)));
final Method m = Method.of("toString", STRING) final Method m = Method.of("toString", STRING)
.public_() .public_()
.add(OVERRIDE) .add(OVERRIDE)
.add("final StringJoiner sj = new StringJoiner(\", \", \"{ \", \" }\");"); .add("final StringJoiner sj = new StringJoiner(\", \", \"{ \", \" }\");");

columns().forEachOrdered(c -> { columns().forEachOrdered(c -> {
final String getter; final String getter;
if (c.isNullable()) { if (c.isNullable()) {
Expand All @@ -259,15 +264,15 @@ protected Method toString(File file) {
} }
m.add("sj.add(\"" + variableName(c) + " = \"+Objects.toString(" + getter + "));"); m.add("sj.add(\"" + variableName(c) + " = \"+Objects.toString(" + getter + "));");
}); });

m.add("return \"" + ENTITY.getImplName() + " \"+sj.toString();"); m.add("return \"" + ENTITY.getImplName() + " \"+sj.toString();");

return m; return m;

} }

private Method equalsMethod() { private Method equalsMethod() {

final String thatName = "that"; final String thatName = "that";
final String thatCastedName = thatName + ENTITY.getName(); final String thatCastedName = thatName + ENTITY.getName();
final Method method = Method.of("equals", BOOLEAN_PRIMITIVE) final Method method = Method.of("equals", BOOLEAN_PRIMITIVE)
Expand All @@ -278,7 +283,7 @@ private Method equalsMethod() {
.add("if (!(" + thatName + " instanceof " + ENTITY.getName() + ")) { return false; }") .add("if (!(" + thatName + " instanceof " + ENTITY.getName() + ")) { return false; }")
.add("@SuppressWarnings(\"unchecked\")") .add("@SuppressWarnings(\"unchecked\")")
.add("final " + ENTITY.getName() + " " + thatCastedName + " = (" + ENTITY.getName() + ")" + thatName + ";"); .add("final " + ENTITY.getName() + " " + thatCastedName + " = (" + ENTITY.getName() + ")" + thatName + ";");

columns().forEachOrdered(c -> { columns().forEachOrdered(c -> {
final String getter = "get" + typeName(c); final String getter = "get" + typeName(c);
if (c.getMapping().isPrimitive()) { if (c.getMapping().isPrimitive()) {
Expand All @@ -287,17 +292,17 @@ private Method equalsMethod() {
method.add("if (!Objects.equals(this." + getter + "(), " + thatCastedName + "." + getter + "())) {return false; }"); method.add("if (!Objects.equals(this." + getter + "(), " + thatCastedName + "." + getter + "())) {return false; }");
} }
}); });

method.add("return true;"); method.add("return true;");
return method; return method;
} }

private Method hashCodeMethod() { private Method hashCodeMethod() {
final Method method = Method.of("hashCode", INT_PRIMITIVE) final Method method = Method.of("hashCode", INT_PRIMITIVE)
.public_() .public_()
.add(OVERRIDE) .add(OVERRIDE)
.add("int hash = 7;"); .add("int hash = 7;");

columns().forEachOrdered(c -> { columns().forEachOrdered(c -> {
final String getter = "get" + typeName(c); final String getter = "get" + typeName(c);
if (c.getMapping().isPrimitive()) { if (c.getMapping().isPrimitive()) {
Expand All @@ -307,21 +312,21 @@ private Method hashCodeMethod() {
method.add("hash = 31 * hash + Objects.hash(" + getter + "());"); method.add("hash = 31 * hash + Objects.hash(" + getter + "());");
} }
}); });

method.add("return hash;"); method.add("return hash;");
return method; return method;
} }

@Override @Override
protected String getJavadocRepresentText() { protected String getJavadocRepresentText() {
return "An implementation "; return "An implementation ";
} }

@Override @Override
protected String getFileName() { protected String getFileName() {
return ENTITY.getImplName(); return ENTITY.getImplName();
} }

@Override @Override
protected boolean isInImplPackage() { protected boolean isInImplPackage() {
return true; return true;
Expand Down

0 comments on commit a5a8253

Please sign in to comment.