package ilarkesto.mda.legacy.generator;
import ilarkesto.auth.AUserDao;
import ilarkesto.base.Str;
import ilarkesto.mda.legacy.model.DatobModel;
import ilarkesto.mda.legacy.model.DependencyModel;
import ilarkesto.mda.legacy.model.EntityModel;
import ilarkesto.mda.legacy.model.PropertyModel;
import ilarkesto.persistence.ADao;
import java.util.LinkedHashSet;
import java.util.Set;
public class DaoGenerator extends ABeanGenerator<EntityModel> {
public DaoGenerator(EntityModel bean) {
super(bean);
}
@Override
protected String getName() {
return "G" + bean.getName() + "Dao";
}
@Override
protected boolean isInterface() {
return false;
}
@Override
protected void writeContent() {
if (!bean.isAbstract()) {
ln();
ln(" public final String getEntityName() {");
ln(" return " + bean.getName() + ".TYPE;");
ln(" }");
ln();
ln(" public final Class getEntityClass() {");
ln(" return " + bean.getName() + ".class;");
ln(" }");
}
if (bean.isOwnable()) {
ln();
s(" public " + bean.getName() + " newEntityInstance(" + getUserClassName() + " user) {").ln();
s(" " + bean.getName() + " entity = newEntityInstance();").ln();
s(" entity.setOwner(user);").ln();
s(" return entity;").ln();
s(" }").ln();
}
if (bean.isViewProtected()) {
ln();
s(
" public Set<" + bean.getName() + "> getEntitiesVisibleForUser(final " + getUserClassName()
+ " user) {").ln();
s(" return getEntities(new Predicate<" + bean.getName() + ">() {").ln();
s(" public boolean test(" + bean.getName() + " e) {").ln();
s(" return Auth.isVisible(e, user);").ln();
s(" }").ln();
s(" });").ln();
s(" }").ln();
}
ln();
comment("clear caches");
ln(" public void clearCaches() {");
for (PropertyModel p : bean.getProperties()) {
if (!p.isUnique()) {
ln(" " + Str.lowercaseFirstLetter(bean.getName()) + "sBy"
+ Str.uppercaseFirstLetter(p.getNameSingular()) + "Cache.clear();");
}
if (!p.isBoolean()) {
ln(" " + p.getNameSingular() + "sCache = null;");
}
}
ln(" }");
ln();
ln(" @Override");
ln(" public void entityDeleted(EntityEvent event) {");
ln(" super.entityDeleted(event);");
ln(" if (event.getEntity() instanceof " + bean.getName() + ") {");
ln(" clearCaches();");
ln(" }");
ln(" }");
ln();
ln(" @Override");
ln(" public void entitySaved(EntityEvent event) {");
ln(" super.entitySaved(event);");
ln(" if (event.getEntity() instanceof " + bean.getName() + ") {");
ln(" clearCaches();");
ln(" }");
ln(" }");
for (PropertyModel property : bean.getProperties()) {
writeProperty(property);
}
ln();
comment("valueObject classes");
ln(" @Override");
ln(" protected Set<Class> getValueObjectClasses() {");
ln(" Set<Class> ret = new HashSet<Class>(super.getValueObjectClasses());");
for (PropertyModel property : bean.getProperties()) {
if (!property.isValueObject()) continue;
String className = property.getContentType();
// int idx = className.lastIndexOf('.');
// className = className.substring(0, idx) + "." + className.substring(idx + 2);
ln(" ret.add(" + className + ".class);");
}
ln(" return ret;");
ln(" }");
ln();
ln(" @Override");
ln(" public Map<String, Class> getAliases() {");
ln(" Map<String, Class> aliases = new HashMap<String, Class>(super.getAliases());");
writeAliases(bean);
ln(" return aliases;");
ln(" }");
ln();
comment("dependencies");
for (DependencyModel dependencyModel : bean.getDependencies()) {
dependency(dependencyModel.getType(), dependencyModel.getName(), false, false);
}
}
private void writeAliases(DatobModel bean) {
if (bean == null) return;
for (PropertyModel p : bean.getProperties()) {
if (!p.isValueObject()) continue;
ln(" aliases.put(\"" + Str.getLastToken(p.getContentType(), ".") + "\", " + p.getContentType()
+ ".class);");
}
writeAliases((DatobModel) bean.getSuperbean());
}
private void writeProperty(PropertyModel p) {
String pNameUpper = Str.uppercaseFirstLetter(p.getNameSingular());
String predicateClassNamePrefix = p.isCollection() ? "Contains" : "Is";
String pType = p.getContentType();
ln();
ln(" // -----------------------------------------------------------");
ln(" // - " + p.getName());
ln(" // -----------------------------------------------------------");
ln();
if (p.isUnique()) {
ln(" public final " + bean.getName() + " get" + bean.getName() + "By" + pNameUpper + "("
+ p.getContentType() + " " + p.getNameSingular() + ") {");
ln(" return getEntity(new " + predicateClassNamePrefix + pNameUpper + "(" + p.getNameSingular()
+ "));");
ln(" }");
} else {
if (p.isPrimitive()) {
if (pType.equals("boolean")) pType = "Boolean";
if (pType.equals("int")) pType = "Integer";
if (pType.equals("long")) pType = "Long";
}
String cacheVarName = Str.lowercaseFirstLetter(bean.getName()) + "sBy" + pNameUpper + "Cache";
String generic = "<" + pType + ",Set<" + bean.getName() + ">>";
ln(" private final Cache" + generic + " " + cacheVarName + " = new Cache" + generic + "(");
ln(" new Cache.Factory" + generic + "() {");
ln(" public Set<" + bean.getName() + "> create(" + pType + " " + p.getNameSingular() + ") {");
ln(" return getEntities(new " + predicateClassNamePrefix + pNameUpper + "("
+ p.getNameSingular() + "));");
ln(" }");
ln(" });");
ln();
ln(" public final Set<" + bean.getName() + "> get" + bean.getName() + "sBy" + pNameUpper + "("
+ p.getContentType() + " " + p.getNameSingular() + ") {");
ln(" return " + cacheVarName + ".get(" + p.getNameSingular() + ");");
ln(" }");
// ln(" public final Set<" + bean.getInterfaceName() + "> get" + bean.getName() + "sBy"
// + pNameUpper + "(" + p.getContentType() + " " + p.getNameSingular() + ") {");
// ln(" return getEntities(new " + predicateClassNamePrefix + pNameUpper + "("
// + p.getNameSingular() + "));");
// ln(" }");
}
if (!p.isBoolean()) {
String cacheName = p.getNameSingular() + "sCache";
ln(" private Set<" + pType + "> " + cacheName + ";");
ln();
ln(" public final Set<" + pType + "> get" + pNameUpper + "s" + "() {");
ln(" if (" + cacheName + " == null) {");
ln(" " + cacheName + " = new HashSet<" + pType + ">();");
ln(" for (" + bean.getName() + " e : getEntities()) {");
if (p.isCollection()) {
ln(" " + cacheName + ".addAll(e.get" + pNameUpper + "s());");
} else {
if (p.isPrimitive()) {
ln(" " + cacheName + ".add(e.get" + pNameUpper + "());");
} else {
ln(" if (e.is" + pNameUpper + "Set()) " + cacheName + ".add(e.get" + pNameUpper
+ "());");
}
}
ln(" }");
ln(" }");
ln(" return " + cacheName + ";");
ln(" }");
}
ln();
ln(" private static class " + predicateClassNamePrefix + pNameUpper + " implements Predicate<"
+ bean.getName() + "> {");
ln();
ln(" private " + p.getContentType() + " value;");
ln();
ln(" public " + predicateClassNamePrefix + pNameUpper + "(" + p.getContentType() + " value) {");
ln(" this.value = value;");
ln(" }");
ln();
ln(" public boolean test(" + bean.getName() + " e) {");
if (p.isBoolean()) {
ln(" return value == e." + predicateClassNamePrefix.toLowerCase() + pNameUpper + "();");
} else {
ln(" return e." + predicateClassNamePrefix.toLowerCase() + pNameUpper + "(value);");
}
ln(" }");
ln();
ln(" }");
}
protected final String getUserClassName() {
EntityModel userModel = bean.getUserModel();
if (userModel == null && bean.getName().equals("User")) userModel = bean;
return userModel.getPackageName() + "." + userModel.getName();
}
@Override
protected boolean isOverwrite() {
return true;
}
@Override
protected String getSuperclass() {
if ("User".equals(bean.getName())) return AUserDao.class.getName() + "<" + bean.getName() + ">";
return ADao.class.getName() + "<" + bean.getName() + ">";
}
@Override
protected Set<String> getImports() {
Set<String> result = new LinkedHashSet<String>();
result.addAll(super.getImports());
result.add("ilarkesto.base.*");
result.add("ilarkesto.base.time.*");
result.add("ilarkesto.auth.*");
result.add("ilarkesto.persistence.*");
result.add("ilarkesto.fp.*");
return result;
}
// --- dependencies ---
}