package ilarkesto.mda.legacy.generator;
import ilarkesto.base.Reflect;
import ilarkesto.base.Str;
import ilarkesto.core.logging.Log;
import ilarkesto.mda.legacy.model.BeanModel;
import ilarkesto.mda.legacy.model.CompositeModel;
import ilarkesto.mda.legacy.model.DependencyModel;
import ilarkesto.mda.legacy.model.EventModel;
import ilarkesto.mda.legacy.model.ParameterModel;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public abstract class ABeanGenerator<B extends BeanModel> extends AClassGenerator {
protected B bean;
public ABeanGenerator(B bean) {
super();
this.bean = bean;
}
@Override
protected void writeContent() {
writeDependencies();
writeComposites();
writeEvents();
}
private void writeEvents() {
if (bean.getEvents().isEmpty()) return;
section("events");
List<String> multiEventListenerLines = new ArrayList<String>();
for (EventModel event : bean.getEvents()) {
String name = event.getName();
String nameL = Str.lowercaseFirstLetter(name);
String listenerType = name + "Listener";
String listenersVar = nameL + "Listeners";
String paramDeclaration = "";
String paramList = "";
for (ParameterModel param : event.getParameters()) {
paramDeclaration += ", " + param.getType() + " " + param.getName();
paramList += ", " + param.getName();
}
ln();
comment(name);
ln();
ln(" public static interface", listenerType, "{");
ln(" void on" + name + "(" + bean.getName() + " eventSource" + paramDeclaration + ");");
ln(" }");
ln();
ln(" private List<" + listenerType + ">", listenersVar + ";");
ln();
ln(" public final " + bean.getName() + " add" + name + "Listener(" + listenerType + " listener) {");
ln(" if (" + listenersVar + " == null) " + listenersVar + " = new ArrayList<" + listenerType
+ ">(3);");
ln(" " + listenersVar + ".add(listener);");
ln(" return (" + bean.getName() + ")this;");
ln(" }");
ln();
ln(" protected final void fire" + name + "("
+ (paramDeclaration.length() == 0 ? "" : paramDeclaration.substring(2)) + ") {");
ln(" if (" + listenersVar + " == null) return;");
ln(" for (" + listenerType + " listener : " + listenersVar + ") {");
ln(" listener.on" + name + "((" + bean.getName() + ")this" + paramList + ");");
ln(" }");
ln(" }");
multiEventListenerLines.add(" if (listener instanceof " + listenerType + ") add" + name
+ "Listener((" + listenerType + ")listener);");
}
if (multiEventListenerLines.size() > 1) {
ln();
comment("multi event listener");
ln();
ln(" public final " + bean.getName() + " addMultiEventListener(Object listener) {");
for (String line : multiEventListenerLines) {
ln(line);
}
ln(" return (" + bean.getName() + ") this;");
ln(" }");
}
}
protected void writeDependencies() {
if (bean.getDependencies().isEmpty()) return;
ln();
section("dependencies");
for (DependencyModel dependencyModel : bean.getDependencies()) {
dependency(dependencyModel.getType(), dependencyModel.getName(), true, false);
}
}
private void writeComposites() {
if (bean.getComposites().isEmpty()) return;
ln();
section("composites");
for (CompositeModel c : bean.getComposites()) {
String name = Str.lowercaseFirstLetter(c.getName());
String nameUpper = Str.uppercaseFirstLetter(c.getName());
ln();
comment(name);
ln();
ln(" private " + c.getType() + " " + name + ";");
ln();
ln(" public final " + c.getType() + " get" + nameUpper + "() {");
ln(" if (" + name + " == null) {");
ln(" " + name + " = create" + nameUpper + "();");
ln(" initialize" + nameUpper + "(" + name + ");");
ln(" }");
ln(" return " + name + ";");
ln(" }");
ln();
ln(" protected " + c.getType() + " create" + nameUpper + "() {");
ln(" return " + name + " = " + Reflect.class.getName() + ".newInstance(" + c.getType() + ".class);");
ln(" }");
ln();
ln(" protected void initialize" + nameUpper + "(" + c.getType() + " bean) {");
ln(" autowire(bean);");
ln(" " + Reflect.class.getName() + ".invokeInitializeIfThere(bean);");
ln(" }");
ln();
ln(" public final void reset" + nameUpper + "() {");
ln(" " + name + " = null;");
ln(" }");
}
}
@Override
protected String getName() {
return "G" + bean.getName();
}
@Override
protected String getPackage() {
return bean.getPackageName();
}
@Override
protected boolean isInterface() {
return false;
}
@Override
protected Set<String> getImports() {
Set<String> result = new LinkedHashSet<String>();
result.addAll(super.getImports());
result.add("ilarkesto.persistence.*");
result.add(Log.class.getName());
result.add("ilarkesto.base.*");
result.add("ilarkesto.base.time.*");
result.add("ilarkesto.auth.*");
return result;
}
@Override
protected boolean isOverwrite() {
return true;
}
}