package im.actor.generator.generators.java; import im.actor.generator.FileGenerator; import im.actor.generator.scheme.SchemeDefinition; import im.actor.generator.scheme.SchemeStruct; import im.actor.generator.scheme.SchemeTrait; import java.io.File; import java.io.IOException; /** * Created by ex3ndr on 15.11.14. */ public class StructGenerator { public static void generate(SchemeDefinition definition, String path) throws IOException { generate(definition, path, JavaConfig.PACKAGE); } public static void generate(SchemeDefinition definition, String path, String pkg) throws IOException { String destFolder = path + "/" + StringJoin.join("/", pkg.split("\\.")); new File(destFolder).mkdirs(); for (SchemeTrait u : definition.getAllTraits()) { String javaName = JavaConfig.getStructName(u.getName()); FileGenerator generator = new FileGenerator(destFolder + "/" + javaName + ".java"); generator.appendLn("package " + pkg + ";"); generator.appendLn(JavaConfig.NOTICE); generator.appendLn(); for (String im : JavaConfig.IMPORTS) { generator.appendLn("import " + im + ";"); } generator.appendLn(); generator.appendLn("public abstract class " + javaName + " extends BserObject {"); generator.increaseDepth(); if (u.isContainer()) { generator.appendLn("public static " + javaName + " fromBytes(byte[] src) throws IOException {"); generator.increaseDepth(); generator.appendLn("BserValues values = new BserValues(BserParser.deserialize(new DataInput(src, 0, src.length)));"); generator.appendLn("int key = values.getInt(1);"); generator.appendLn("byte[] content = values.getBytes(2);"); } else { generator.appendLn("public static " + javaName + " fromBytes(int key, byte[] content) throws IOException {"); generator.increaseDepth(); } generator.appendLn("switch(key) { "); generator.increaseDepth(); for (SchemeStruct r : definition.getTraitedStructs(u.getName())) { generator.appendLn("case " + r.getTraitRef().getKey() + ": return Bser.parse(new " + JavaConfig.getStructName(r.getName()) + "(), content);"); } generator.appendLn("default: return new " + JavaConfig.getStructName(u.getName()) + "Unsupported(key, content);"); generator.decreaseDepth(); generator.appendLn("}"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn("public abstract int getHeader();"); generator.appendLn(); generator.appendLn("public byte[] buildContainer() throws IOException {"); generator.increaseDepth(); generator.appendLn("DataOutput res = new DataOutput();"); generator.appendLn("BserWriter writer = new BserWriter(res);"); generator.appendLn("writer.writeInt(1, getHeader());"); generator.appendLn("writer.writeBytes(2, toByteArray());"); generator.appendLn("return res.toByteArray();"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); generator.decreaseDepth(); generator.appendLn("}"); generator.close(); generator = new FileGenerator(destFolder + "/" + javaName + "Unsupported.java"); generator.appendLn("package " + pkg + ";"); generator.appendLn(JavaConfig.NOTICE); generator.appendLn(); for (String im : JavaConfig.IMPORTS) { generator.appendLn("import " + im + ";"); } generator.appendLn(); generator.appendLn("public class " + javaName + "Unsupported extends " + javaName + " {"); generator.increaseDepth(); generator.appendLn(); generator.appendLn("private int key;"); generator.appendLn("private byte[] content;"); generator.appendLn(); generator.appendLn("public " + javaName + "Unsupported(int key, byte[] content) {"); generator.increaseDepth(); generator.appendLn("this.key = key;"); generator.appendLn("this.content = content;"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); generator.appendLn("@Override"); generator.appendLn("public int getHeader() {"); generator.increaseDepth(); generator.appendLn("return this.key;"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); generator.appendLn("@Override"); generator.appendLn("public void parse(BserValues values) throws IOException {"); generator.increaseDepth(); generator.appendLn("throw new IOException(\"Parsing is unsupported\");"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); generator.appendLn("@Override"); generator.appendLn("public void serialize(BserWriter writer) throws IOException {"); generator.increaseDepth(); // if (u.isContainer()) { // generator.appendLn("writer.writeInt(1, key);"); // generator.appendLn("writer.writeBytes(2, content);"); // } else { // // generator.appendLn("writer.writeRaw(content);"); // } generator.appendLn("writer.writeRaw(content);"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); generator.decreaseDepth(); generator.appendLn("}"); generator.close(); } for (SchemeStruct u : definition.getAllStructs()) { String javaName = JavaConfig.getStructName(u.getName()); FileGenerator generator = new FileGenerator(destFolder + "/" + javaName + ".java"); generator.appendLn("package " + pkg + ";"); generator.appendLn(JavaConfig.NOTICE); generator.appendLn(); for (String im : JavaConfig.IMPORTS) { generator.appendLn("import " + im + ";"); } generator.appendLn(); if (u.getTraitRef() != null) { generator.appendLn("public class " + javaName + " extends " + JavaConfig.getStructName(u.getTraitRef().getTrait()) + " {"); } else { generator.appendLn("public class " + javaName + " extends BserObject {"); } generator.increaseDepth(); generator.appendLn(); ContainerGenerator.generateFields(generator, definition, u); generator.appendLn(); if (u.getAttributes().size() > 0) { ContainerGenerator.generateConstructor(generator, definition, u, javaName); } generator.appendLn("public " + javaName + "() {"); generator.appendLn(); generator.appendLn("}"); generator.appendLn(); if (u.getTraitRef() != null) { generator.appendLn("public int getHeader() {"); generator.increaseDepth(); generator.appendLn("return " + u.getTraitRef().getKey() + ";"); generator.decreaseDepth(); generator.appendLn("}"); generator.appendLn(); } ContainerGenerator.generateGetters(generator, definition, u); ContainerGenerator.generateDeserialization(generator, u, definition, u.isExpandable()); ContainerGenerator.generateSerialization(generator, u, definition, u.isExpandable()); ContainerGenerator.generateToString(generator, u, definition); generator.decreaseDepth(); generator.appendLn("}"); generator.close(); } } }