package ilarkesto.mda.legacy.generator;
import ilarkesto.base.Str;
import ilarkesto.core.logging.Log;
import ilarkesto.io.IO;
import ilarkesto.mda.legacy.model.ParameterModel;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
public abstract class AClassGenerator {
private static final Log LOG = Log.get(AClassGenerator.class);
protected abstract String getName();
protected abstract String getPackage();
protected abstract boolean isInterface();
protected abstract void writeContent();
private StringWriter stringWriter;
private PrintWriter out;
public final void generate() {
File file = getFile();
if (file.exists() && !isOverwrite()) return;
stringWriter = new StringWriter();
out = new PrintWriter(stringWriter);
if (isOverwrite()) {
for (int i = 0; i < 10; i++)
ln();
ln("// ----------> GENERATED FILE - DON'T TOUCH! <----------");
ln();
ln("// generator: " + getClass().getName());
for (int i = 0; i < 10; i++)
ln();
}
ln("package " + getPackage() + ";");
ln();
ln("import java.util.*;");
for (String im : getImports()) {
ln("import " + im + ";");
}
ln();
s("public ");
if (!isInterface() && isAbstract()) {
s("abstract ");
}
s(getType() + " " + getName() + getGenericAsString());
String superclass = getSuperclass();
if (superclass != null) {
ln();
s(" extends " + superclass);
}
Set<String> superinterfaces = getSuperinterfaces();
if (superinterfaces != null && superinterfaces.size() > 0) {
ln();
if (isInterface()) {
s(" extends ");
} else {
s(" implements ");
}
boolean first = true;
for (String superinterface : superinterfaces) {
if (first) {
first = false;
} else {
s(", ");
}
s(superinterface);
}
}
ln(" {");
for (String declaration : getMethodDeclarations()) {
ln();
ln(" public abstract " + declaration + ";");
}
writeContent();
ln();
ln("}");
out.close();
String code = stringWriter.toString();
code = code.trim();
if (file.exists()) {
String previousCode = IO.readFile(file, IO.UTF_8);
previousCode = previousCode.trim();
if (isSame(code, previousCode)) {
// LOG.info("No changes, skipping:", file.getPath());
return;
}
}
LOG.info("Writing:", file.getPath());
IO.writeFile(file, code, IO.UTF_8);
}
private boolean isSame(String a, String b) {
if (!a.equals(b)) return false;
// if (!a.equals(b)) {
// if (a.length() != b.length()) return false;
// int len = a.length();
// for (int i = 0; i < len; i++) {
// char ca = a.charAt(i);
// char cb = b.charAt(i);
// if (ca != cb) {
// LOG.debug("----different char @" + i + ":", ((int) ca) + " '" + ca + "'", "<->", ((int) cb) + " '"
// + cb + "'");
// IO.writeFile(Sys.getUsersHomeDir() + "/inbox/a.txt", a, IO.UTF_8);
// IO.writeFile(Sys.getUsersHomeDir() + "/inbox/b.txt", b, IO.UTF_8);
// return false;
// }
// }
// }
return true;
}
public AClassGenerator parameterNames(Collection<ParameterModel> parameters) {
boolean first = true;
for (ParameterModel parameter : parameters) {
if (first) {
first = false;
} else {
s(", ");
}
s(parameter.getName());
}
return this;
}
public AClassGenerator parameterDeclaration(Collection<ParameterModel> parameters) {
boolean first = true;
for (ParameterModel parameter : parameters) {
if (first) {
first = false;
} else {
s(", ");
}
s(parameter.getType(), parameter.getName());
}
return this;
}
public AClassGenerator s(String... ss) {
boolean first = true;
for (String s : ss) {
if (first) {
first = false;
} else {
out.print(" ");
}
out.print(s);
}
return this;
}
public AClassGenerator ln(String... ss) {
s(ss);
s("\n");
return this;
}
public AClassGenerator sU(String s) {
return s(Str.uppercaseFirstLetter(s));
}
public void comment(String s) {
s(" // --- ").s(s).s(" ---").ln();
}
public void section(String description) {
ln();
ln(" // -----------------------------------------------------------");
ln(" // - " + description);
ln(" // -----------------------------------------------------------");
}
public void dependency(String type, String name, boolean statik, boolean getter) {
ln();
s(" ");
if (statik) s("static ");
s(type).s(" ").s(name).s(";").ln();
ln();
s(" public ");
if (statik) s("static final ");
s("void set").sU(name).s("(").s(type).s(" ").s(name).s(") {").ln();
s(" ");
if (statik) {
s(getName());
} else {
s("this");
}
s(".").s(name).s(" = ").s(name).s(";").ln();
s(" }").ln();
if (getter) {
ln();
s(" public ");
if (statik) s("static final ");
s(type).s(" get").sU(name).s("() {").ln();
s(" return ");
if (statik) {
s(getName());
} else {
s("this");
}
s(".").s(name).s(";").ln();
s(" }").ln();
}
}
private String getGenericAsString() {
String generic = getGeneric();
if (generic == null) return "";
return "<" + generic + ">";
}
protected String getGeneric() {
return null;
}
protected boolean isOverwrite() {
return false;
}
protected boolean isAbstract() {
return true;
}
protected Set<String> getMethodDeclarations() {
return Collections.EMPTY_SET;
}
protected Set<String> getImports() {
return Collections.EMPTY_SET;
}
protected Set<String> getSuperinterfaces() {
return Collections.EMPTY_SET;
}
protected String getSuperclass() {
return null;
}
protected final String getType() {
return isInterface() ? "interface" : "class";
}
protected final File getFile() {
return new File(getSourcePath() + "/" + getPackage().replace('.', '/') + "/" + getName() + ".java");
}
protected String getSourcePath() {
return "src/" + (isOverwrite() ? "generated" : "main") + "/java";
// return "src/main/java";
}
}