/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cb.util;
import java.util.HashSet;
import java.util.Iterator;
import cb.petal.BooleanLiteral;
import cb.petal.DescendingVisitor;
import cb.petal.FloatLiteral;
import cb.petal.IntegerLiteral;
import cb.petal.PetalFile;
import cb.petal.PetalNode;
import cb.petal.PetalObject;
import cb.petal.StringLiteral;
/**
* Generate class derived from petal object for given type.
*
* @version $Id: ObjectGenerator.java,v 1.3 2011/09/12 11:47:29 gpolet Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public class ObjectGenerator extends DescendingVisitor {
private String ident;
private boolean first = false;
private HashSet found = new HashSet();
private ObjectGenerator(String id) {
this.ident = id;
}
@Override
public void visitObject(PetalObject obj) {
if (obj.getName().equals(ident)) {
if (!first) {
String class_name = Constants.makeName(obj.getName());
System.out.println("package cb.petal;\nimport java.util.Collection;\n\n" + "/**\n * Represents " + obj.getName()
+ " object\n" + " *\n" + " * @version $Id: ObjectGenerator.java,v 1.3 2011/09/12 11:47:29 gpolet Exp $\n"
+ " * @author <A HREF=\"http://www.berlin.de/~markus.dahm/\">" + "M. Dahm</A>\n */");
System.out.println("public class " + class_name + " extends PetalObject {");
System.out.println(" public " + class_name + "(PetalObject parent, Collection params) {");
System.out.println(" super(parent, \"" + ident + "\", params);");
System.out.println(" }\n");
System.out.println(" public " + class_name + "() {");
System.out.println(" super(\"" + ident + "\");");
System.out.println(" }\n");
int k = 0;
for (Iterator i = obj.getParameterList().iterator(); i.hasNext(); k++) {
System.out.println(" public void setViewParameter(String o) {");
System.out.println(" params.set(" + k + ", o);\n }\n");
System.out.println(" public String getViewParameter() {");
System.out.println(" return (String)params.get(" + k + ");\n }\n");
i.next();
}
// for DefaultVisitor and Visitor
System.err.println(" public void visit(" + class_name + " obj) { visitObject(obj); }");
}
for (Iterator i = obj.getNames().iterator(), j = obj.getPropertyList().iterator(); i.hasNext();) {
String name = (String) i.next();
PetalNode node = (PetalNode) j.next();
String type = getShortType(node);
if (!found.contains(name) && type != null && !name.equals("quid") && !name.equals("quidu")) {
String type2 = getLongType(type);
String method = Constants.makeName(name);
boolean prim = true;
if (name.equals("name")) {
method = obj.getName() + "Name";
}
if (name.equals("value")) {
type = type2 = "PetalNode";
}
try { // Hack warning
java.lang.Class cl = java.lang.Class.forName("java.lang." + type2);
} catch (ClassNotFoundException e) {
prim = false;
}
if (prim) {
System.out.println(" public " + type + " get" + method + "() {\n" + " return getPropertyAs" + type2 + "(\""
+ name + "\");\n" + " }\n");
System.out.println(" public void set" + method + "(" + type + " o) {\n" + " defineProperty(\"" + name
+ "\", o);\n" + " }\n");
} else {
System.out.println(" public " + type + " get" + method + "() {\n" + " return (" + type + ")getProperty(\""
+ name + "\");\n }\n");
System.out.println(" public void set" + method + "(" + type + " o) {\n" + " defineProperty(\"" + name
+ "\", o);\n" + " }\n");
}
}
found.add(name);
}
first = true;
}// else
// System.err.println("Unknown object type " + obj.getName());
super.visitObject(obj);
}
private static String getShortType(PetalNode node) {
if (node instanceof StringLiteral) {
return "String";
} else if (node instanceof IntegerLiteral) {
return "int";
} else if (node instanceof BooleanLiteral) {
return "boolean";
} else if (node instanceof FloatLiteral) {
return "double";
} else {
String name = node.getClass().getName();
int index = name.lastIndexOf('.');
return name.substring(index + 1);
}
}
private static String getLongType(String type) {
if (type.equals("double")) {
return "Float";
} else if (type.equals("int")) {
return "Integer";
} else if (type.equals("boolean")) {
return "Boolean";
} else {
return type;
}
}
public static void main(String[] args) {
PetalFile tree = cb.parser.PetalParser.parse(args);
tree.accept(new ObjectGenerator(args[1]));
System.out.println(" public void accept(Visitor v) {\n v.visit(this);\n }");
System.out.println("}");
}
}