Skip to content

Commit

Permalink
Add convenancy methods for entity interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Mar 29, 2015
1 parent 2f8be26 commit a3cddcb
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 64 deletions.
Expand Up @@ -22,7 +22,9 @@
import com.speedment.codegen.lang.models.Generic; import com.speedment.codegen.lang.models.Generic;
import com.speedment.codegen.lang.models.Type; import com.speedment.codegen.lang.models.Type;
import com.speedment.codegen.lang.models.constants.DefaultType; import com.speedment.codegen.lang.models.constants.DefaultType;
import com.speedment.codegen.lang.models.implementation.GenericImpl;
import com.speedment.orm.config.model.Table; import com.speedment.orm.config.model.Table;
import java.util.Optional;


/** /**
* *
Expand All @@ -32,15 +34,17 @@
public abstract class BaseEntityAndManagerTranslator<T extends ClassOrInterface<T>> extends DefaultJavaClassTranslator<Table, T> { public abstract class BaseEntityAndManagerTranslator<T extends ClassOrInterface<T>> extends DefaultJavaClassTranslator<Table, T> {


// private final CodeGenerator cg; // private final CodeGenerator cg;

public class ClassType { public class ClassType {


private ClassType(String typeName, String implTypeName) { private ClassType(String typeName, String implTypeName) {
this.type = Type.of(fullyQualifiedTypeName() + typeName); this.type = Type.of(fullyQualifiedTypeName() + typeName);
this.optionalType = Type.of(Optional.class).add(new GenericImpl().add(type));
this.implType = Type.of(fullyQualifiedTypeName("impl") + typeName + implTypeName); this.implType = Type.of(fullyQualifiedTypeName("impl") + typeName + implTypeName);

} }


private final Type type; private final Type type;
private final Type optionalType;
private final Type implType; private final Type implType;


public Type getType() { public Type getType() {
Expand All @@ -58,6 +62,10 @@ public String getName() {
public String getImplName() { public String getImplName() {
return Formatting.shortName(implType.getName()); return Formatting.shortName(implType.getName());
} }

public Type getOptionalType() {
return optionalType;
}
} }


public final ClassType ENTITY = new ClassType("", "Impl"), public final ClassType ENTITY = new ClassType("", "Impl"),
Expand Down Expand Up @@ -94,39 +102,38 @@ protected Type typeOfPK() {
} }
} }
} }
/* /*
protected abstract String getFileName(); protected abstract String getFileName();
@Override
public File get() {
final File file = new FileImpl(baseDirectoryName() + "/" + (isInImplPackage() ? "impl/" : "") + getFileName() + ".java");
final T item = make(file);
item.set(getJavaDoc());
file.add(item);
file.call(new AutoImports(cg.getDependencyMgr()));
return file;
}
protected abstract T make(File file); @Override
public File get() {
final File file = new FileImpl(baseDirectoryName() + "/" + (isInImplPackage() ? "impl/" : "") + getFileName() + ".java");
final T item = make(file);
item.set(getJavaDoc());
file.add(item);
file.call(new AutoImports(cg.getDependencyMgr()));
return file;
}
protected abstract String getJavadocRepresentText(); protected abstract T make(File file);
protected Javadoc getJavaDoc() { protected abstract String getJavadocRepresentText();
return new JavadocImpl(getJavadocRepresentText() + " representing an entity (for example, a row) in the " + getNode().toString() + "." + GENERATED_JAVADOC_MESSAGE)
.add(AUTHOR.setValue("Speedment"));
}
public CodeGenerator getCodeGenerator() { protected Javadoc getJavaDoc() {
return cg; return new JavadocImpl(getJavadocRepresentText() + " representing an entity (for example, a row) in the " + getNode().toString() + "." + GENERATED_JAVADOC_MESSAGE)
} .add(AUTHOR.setValue("Speedment"));
}
protected boolean isInImplPackage() { public CodeGenerator getCodeGenerator() {
return false; return cg;
} */ }
protected boolean isInImplPackage() {
return false;
} */


// @Override // @Override
// public String packagePath() { // public String packagePath() {
// return super.packagePath() + "/" + table().getRelativeName(project()); // return super.packagePath() + "/" + table().getRelativeName(project());
// } // }

} }
Expand Up @@ -16,6 +16,7 @@
*/ */
package com.speedment.orm.code.model.java.entity; package com.speedment.orm.code.model.java.entity;


import com.speedment.codegen.Formatting;
import com.speedment.orm.code.model.java.BaseEntityAndManagerTranslator; import com.speedment.orm.code.model.java.BaseEntityAndManagerTranslator;
import com.speedment.codegen.base.CodeGenerator; import com.speedment.codegen.base.CodeGenerator;
import com.speedment.codegen.lang.models.File; import com.speedment.codegen.lang.models.File;
Expand Down Expand Up @@ -71,8 +72,9 @@ protected Interface make(File file) {
final Type returnType = Type.of(Stream.class).add(fu.getEmt().GENERIC_OF_ENTITY); final Type returnType = Type.of(Stream.class).add(fu.getEmt().GENERIC_OF_ENTITY);
final Method method = Method.of(methodName, returnType) final Method method = Method.of(methodName, returnType)
.default_() .default_()
.add("return Platform.get().get(ManagerComponent.class)") .add("return " + managerTypeName(fu.getTable()) + ".get()")
.add(" .manager(" + managerTypeName(fu.getTable()) + ".class)") // .add("return Platform.get().get(ManagerComponent.class)")
// .add(" .manager(" + managerTypeName(fu.getTable()) + ".class)")
.add(" .stream().filter(" + variableName(fu.getTable()) + " -> Objects.equals(this." + GETTER_METHOD_PREFIX + typeName(fu.getForeignColumn()) + "(), " + variableName(fu.getTable()) + "." + GETTER_METHOD_PREFIX + typeName(fu.getColumn()) + "()));"); .add(" .stream().filter(" + variableName(fu.getTable()) + " -> Objects.equals(this." + GETTER_METHOD_PREFIX + typeName(fu.getForeignColumn()) + "(), " + variableName(fu.getTable()) + "." + GETTER_METHOD_PREFIX + typeName(fu.getColumn()) + "()));");
i.add(method); i.add(method);
}) })
Expand All @@ -90,8 +92,8 @@ protected Interface make(File file) {
getCode = ".get()"; getCode = ".get()";
} }
final Method method = Method.of("find" + typeName(fu.getColumn()), returnType).default_(); final Method method = Method.of("find" + typeName(fu.getColumn()), returnType).default_();
method.add("return Platform.get().get(ManagerComponent.class)"); method.add("return "+fu.getForeignEmt().MANAGER.getName()+".get()");
method.add(" .manager(" + fu.getForeignEmt().MANAGER.getName() + ".class)"); // method.add(" .manager(" + fu.getForeignEmt().MANAGER.getName() + ".class)");
method.add(" .stream().filter(" + variableName(fu.getForeignTable()) + " -> Objects.equals(this." + GETTER_METHOD_PREFIX + typeName(fu.getColumn()) + "(), " + variableName(fu.getForeignTable()) + "." + GETTER_METHOD_PREFIX + typeName(fu.getForeignColumn()) + "())).findAny()" + getCode + ";"); method.add(" .stream().filter(" + variableName(fu.getForeignTable()) + " -> Objects.equals(this." + GETTER_METHOD_PREFIX + typeName(fu.getColumn()) + "(), " + variableName(fu.getForeignTable()) + "." + GETTER_METHOD_PREFIX + typeName(fu.getForeignColumn()) + "())).findAny()" + getCode + ";");
i.add(method); i.add(method);
}) })
Expand All @@ -116,13 +118,58 @@ protected Interface make(File file) {
} }
}); });


// Requred for persist() et. al
// file.add(Import.of(Type.of(Platform.class)));
// file.add(Import.of(Type.of(ManagerComponent.class)));
file.add(Import.of(Type.of(Optional.class)));

iface
.add(builder())
.add(toBuilder())
.add(persist())
.add(update())
.add(remove());
// .add(manager());

return iface; return iface;
} }


public String pluralis(Table table) { public String pluralis(Table table) {
return Pluralis.INSTANCE.pluralizeJavaIdentifier(variableName(table)); return Pluralis.INSTANCE.pluralizeJavaIdentifier(variableName(table));
} }


// private Method manager() {
// return Method.of("manager", MANAGER.getType()).static_()
// .add("return Platform.get().get(ManagerComponent.class).manager(" + MANAGER.getName() + ".class);");
// }

private Method builder() {
return Method.of("builder", BUILDER.getType()).static_()
.add("return " + MANAGER.getName() + ".get().builder();");
}

private Method toBuilder() {
return Method.of("toBuilder", BUILDER.getType()).default_()
.add("return " + MANAGER.getName() + ".get().toBuilder(this);");
}

private Method persist() {
return dbMethod("persist");
}

private Method update() {
return dbMethod("update");
}

private Method remove() {
return dbMethod("remove");
}

private Method dbMethod(String name) {
return Method.of(name, ENTITY.getOptionalType()).default_()
.add("return " + MANAGER.getName() + ".get()." + name + "(this);");
}

@Override @Override
protected String getJavadocRepresentText() { protected String getJavadocRepresentText() {
return "An interface"; return "An interface";
Expand Down Expand Up @@ -159,8 +206,8 @@ public FkUtil(ForeignKey fk) {


public Stream<Import> imports() { public Stream<Import> imports() {
final Stream.Builder<Type> sb = Stream.builder(); final Stream.Builder<Type> sb = Stream.builder();
sb.add(Type.of(Platform.class)); // sb.add(Type.of(Platform.class));
sb.add(Type.of(ManagerComponent.class)); // sb.add(Type.of(ManagerComponent.class));
sb.add(Type.of(Objects.class)); sb.add(Type.of(Objects.class));
sb.add(getEmt().ENTITY.getType()); sb.add(getEmt().ENTITY.getType());
sb.add(getEmt().MANAGER.getType()); sb.add(getEmt().MANAGER.getType());
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/com/speedment/orm/core/manager/Manager.java
Expand Up @@ -26,6 +26,7 @@
import com.speedment.orm.config.model.Table; import com.speedment.orm.config.model.Table;
import com.speedment.orm.core.Buildable; import com.speedment.orm.core.Buildable;
import com.speedment.orm.core.lifecycle.Lifecyclable; import com.speedment.orm.core.lifecycle.Lifecyclable;
import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;


/** /**
Expand Down Expand Up @@ -84,7 +85,9 @@ default long size() {
void onDelete(ENTITY primaryKey); void onDelete(ENTITY primaryKey);


// Persistence // Persistence
ENTITY persist(ENTITY entity); Optional<ENTITY> persist(ENTITY entity);


ENTITY remove(ENTITY entity); Optional<ENTITY> update(ENTITY entity);

Optional<ENTITY> remove(ENTITY entity);
} }
Expand Up @@ -31,6 +31,7 @@
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
Expand Down Expand Up @@ -81,7 +82,7 @@ public void setSqlEntityMapper(Function<ResultSet, ENTITY> sqlEntityMapper) {
} }


@Override @Override
public ENTITY persist(ENTITY entity) { public Optional<ENTITY> persist(ENTITY entity) {
final Table table = getTable(); final Table table = getTable();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("insert into ").append(table.getRelativeName(Schema.class)); sb.append("insert into ").append(table.getRelativeName(Schema.class));
Expand All @@ -106,30 +107,42 @@ public ENTITY persist(ENTITY entity) {
}; };
}; };


return executeUpdate(entity, sb.toString(), values, generatedKeyconsumer).build(); return executeUpdate(entity, sb.toString(), values, generatedKeyconsumer);
} }


@Override @Override
public ENTITY update(ENTITY entity) { public Optional<ENTITY> update(ENTITY entity) {
final Table table = getTable(); final Table table = getTable();


final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("update ").append(table.getRelativeName(Schema.class)).append(" set "); sb.append("update ").append(table.getRelativeName(Schema.class)).append(" set ");
sb.append(table.streamOf(Column.class).map(c -> c.getName() + " = ?").collect(joining(", "))); sb.append(table.streamOf(Column.class).map(c -> c.getName() + " = ?").collect(joining(", ")));
sb.append(" where "); sb.append(" where ");
sb.append(table.streamOf(PrimaryKeyColumn.class).map(pk -> "("+pk.getName() + " = ?)").collect(joining(" AND "))); sb.append(table.streamOf(PrimaryKeyColumn.class).map(pk -> "(" + pk.getName() + " = ?)").collect(joining(" AND ")));
sb.toString();


final List<Object> values = table.streamOf(Column.class).map(c -> get(entity, c)).collect(Collectors.toList()); final List<Object> values = table.streamOf(Column.class).map(c -> get(entity, c)).collect(Collectors.toList());
table.streamOf(PrimaryKeyColumn.class).map(pkc -> pkc.getColumn()).forEachOrdered(c -> values.add(get(entity, c))); table.streamOf(PrimaryKeyColumn.class).map(pkc -> pkc.getColumn()).forEachOrdered(c -> values.add(get(entity, c)));


final Function<BUILDER, Consumer<List<Long>>> generatedKeyconsumer = b -> l -> { // Nothing to do for updates... final Function<BUILDER, Consumer<List<Long>>> generatedKeyconsumer = b -> l -> { // Nothing to do for updates...
}; };


return executeUpdate(entity, sb.toString(), values, generatedKeyconsumer).build(); return executeUpdate(entity, sb.toString(), values, generatedKeyconsumer);
} }


private BUILDER executeUpdate(ENTITY entity, String sql, List<Object> values, final Function<BUILDER, Consumer<List<Long>>> generatedKeyconsumer) { @Override
public Optional<ENTITY> remove(ENTITY entity) {
final Table table = getTable();
final StringBuilder sb = new StringBuilder();
sb.append("delete from ").append(table.getRelativeName(Schema.class)).append(" set ");
sb.append(" where ");
sb.append(table.streamOf(PrimaryKeyColumn.class).map(pk -> "(" + pk.getName() + " = ?)").collect(joining(" AND ")));
final List<Object> values = table.streamOf(PrimaryKeyColumn.class).map(pk -> get(entity, pk.getColumn())).collect(Collectors.toList());
final Function<BUILDER, Consumer<List<Long>>> generatedKeyconsumer = b -> l -> { // Nothing to do for updates...
};
return executeUpdate(entity, sb.toString(), values, generatedKeyconsumer);
}

private Optional<ENTITY> executeUpdate(ENTITY entity, String sql, List<Object> values, final Function<BUILDER, Consumer<List<Long>>> generatedKeyconsumer) {
final Table table = getTable(); final Table table = getTable();
final Dbms dbms = table.ancestor(Dbms.class).get(); final Dbms dbms = table.ancestor(Dbms.class).get();
final DbmsHandler dbmsHandler = Platform.get().get(DbmsHandlerComponent.class).get(dbms); final DbmsHandler dbmsHandler = Platform.get().get(DbmsHandlerComponent.class).get(dbms);
Expand All @@ -138,28 +151,9 @@ private BUILDER executeUpdate(ENTITY entity, String sql, List<Object> values, fi
dbmsHandler.executeUpdate(sql, values, generatedKeyconsumer.apply(builder)); dbmsHandler.executeUpdate(sql, values, generatedKeyconsumer.apply(builder));
} catch (SQLException sqle) { } catch (SQLException sqle) {
LOGGER.error("Unable to persist", sqle); LOGGER.error("Unable to persist", sqle);
throw new RuntimeException(sqle); return Optional.empty();
} }
return builder; return Optional.of(builder.build());
}

@Override
public ENTITY remove(ENTITY entity) {
final Table table = getTable();
final Map<String, Object> pks = new LinkedHashMap<>();
table.streamOf(PrimaryKeyColumn.class).forEachOrdered(pk -> {
pks.put(pk.getName(), get(entity, pk.getColumn()));
});
final StringBuilder sb = new StringBuilder();
sb.append("delete from ").append(table.getRelativeName(Schema.class)).append(" set ");
sb.append(" where ");
sb.append(pks.entrySet().stream().map(e -> e.getKey() + "=" + sqlQuote(e.getValue())).collect(joining(", ")));
sb.toString();

final Dbms dbms = table.ancestor(Dbms.class).get();
final DbmsHandler dbmsHandler = Platform.get().get(DbmsHandlerComponent.class).get(dbms);
//dbmsHandler.executeUpdate(sb.toString());
return entity;
} }


private String sqlQuote(Object o) { private String sqlQuote(Object o) {
Expand Down
Expand Up @@ -34,6 +34,5 @@ public interface SqlManager<PK, ENTITY, BUILDER extends Buildable<ENTITY>> exten


void setSqlEntityMapper(Function<ResultSet, ENTITY> sqlEntityMapper); void setSqlEntityMapper(Function<ResultSet, ENTITY> sqlEntityMapper);


public ENTITY update(ENTITY entity);


} }

0 comments on commit a3cddcb

Please sign in to comment.