Code Generator for Eclipse Code
Brought to you by:
hotzst
changed | /ast/src/ch/sahits/codegen/java/ast/CreateBean.java |
copied | /ast/src/ch/sahits/sahits/codegen/java/ast -> /ast/src/ch/sahits/codegen/java/ast |
--- a +++ b/ast/src/ch/sahits/codegen/java/ast/CreateBean.java @@ -0,0 +1,160 @@ +package ch.sahits.codegen.java.ast; + +import java.util.Iterator; +import java.util.List; + +import org.eclipse.jdt.core.dom.*; + +import cg.sahits.codegen.java.util.ASTBuildHelper; +import ch.sahits.codegen.java.model.DataBaseTable; +import ch.sahits.codegen.java.model.DataBaseTableField; +/** + * This class creates a simple bean with all the + * fields in the model defined. + * @author Andi Hotz + * + */ +public class CreateBean extends ASTBuildHelper{ + /** + * Holds the model of the {@link DataBaseTable} + */ + private DataBaseTable model = null; + /** + * Name of the package + */ + private String packageName = ""; + /** + * Representation of the source-code to be generated as an abstract syntax tree. + */ + protected AST ast=null; + /** + * Constructor initializes the database model + * @param dbt {@link DataBaseTable} model + */ + public CreateBean(DataBaseTable dbt){ + model=dbt; + } + /** + * Retrieve the package name + * @return name of the package to be generated + */ + public String getPackageName() { + return packageName; + } + /** + * Set the package name to be generated + * @param packageName + */ + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + @SuppressWarnings("unchecked") + public void generate(){ + ast = AST.newAST(AST.JLS3); // Generate Java 5.0 compiliant code + unit = ast.newCompilationUnit(); + PackageDeclaration packageDecl = ast.newPackageDeclaration(); + packageDecl.setName(ast.newName(packageName.split("."))); + unit.setPackage(packageDecl); + // TODO: Add imports + SimpleName name = ast.newSimpleName(camelCase(model.getTableName().toLowerCase(), "_")); + TypeDeclaration classType = ast.newTypeDeclaration(); + classType.modifiers().add(Modifier.PUBLIC); + classType.setInterface(false); + classType.setName(name); + classType= defineClassBody(classType); + unit.types().add(classType); + } + /** + * Add the definition of the class body + * @param classType class type definition + * @return classType with all added methods and fields + */ + @SuppressWarnings("unchecked") + private TypeDeclaration defineClassBody(TypeDeclaration classType) { + List<DataBaseTableField> fields = model.getFields(); + for (Iterator iterator = fields.iterator(); iterator.hasNext();) { + DataBaseTableField dbtf = (DataBaseTableField) iterator + .next(); + FieldDeclaration field = generateFieldDeclaration(dbtf); + classType.bodyDeclarations().add(field); + } + for (Iterator iterator = fields.iterator(); iterator.hasNext();) { + DataBaseTableField dbtf = (DataBaseTableField) iterator + .next(); + // Adding the getter + MethodDeclaration method = generateGetterMethod(dbtf); + classType.bodyDeclarations().add(method); + // Adding the setter + method = generateSetterMethod(dbtf); + classType.bodyDeclarations().add(method); + } + return classType; + } + /** + * This method generates the field definition of the designated field + * @param dbtf Model of the field + * @return abstract syntax for the field declaration + */ + private FieldDeclaration generateFieldDeclaration(DataBaseTableField dbtf) { + VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment(); + SimpleName name = ast.newSimpleName(getClassShortName(dbtf)); + fragment.setName(name); + fragment.setInitializer(ast.newNullLiteral()); + FieldDeclaration field = ast.newFieldDeclaration(fragment); + return field; + } + /** + * This method generates the setter method based on a field description + * @param dbtf Model of the field + * @return abstract syntax for the setter method + */ + @SuppressWarnings("unchecked") + private MethodDeclaration generateSetterMethod(DataBaseTableField dbtf) { + MethodDeclaration method = ast.newMethodDeclaration(); + method.modifiers().add(Modifier.PUBLIC); + SimpleName setName = ast.newSimpleName("set"+camelCase(dbtf.getFieldName(), "_")); + method.setName(setName); + method.setReturnType2(ast.newPrimitiveType(org.eclipse.jdt.core.dom.PrimitiveType.VOID)); + SimpleType stringType = ast.newSimpleType(ast.newName("String")); + SimpleName paramName = ast.newSimpleName(toLowerCaseFirst(camelCase(dbtf.getFieldName(),"_"))); + SingleVariableDeclaration param = ast.newSingleVariableDeclaration(); + param.modifiers().add(Modifier.NONE); + param.setType(stringType); + param.setName(paramName); + Assignment assignement = ast.newAssignment(); + FieldAccess lhs = ast.newFieldAccess(); + lhs.setExpression(ast.newThisExpression()); + lhs.setName(ast.newSimpleName(toLowerCaseFirst(camelCase(dbtf.getFieldName(),"_")))); + assignement.setLeftHandSide(lhs); + assignement.setOperator(Assignment.Operator.ASSIGN); + assignement.setRightHandSide(paramName); + Block block = ast.newBlock(); + block.statements().add(assignement); + method.setBody(block); + return method; + } + /** + * This method generates the getter method for the designated field + * @param dbtf Model of the field + * @return abstract syntax for the getter method + */ + @SuppressWarnings("unchecked") + private MethodDeclaration generateGetterMethod(DataBaseTableField dbtf) { + MethodDeclaration method = ast.newMethodDeclaration(); + method.modifiers().add(Modifier.PUBLIC); + SimpleName getName = ast.newSimpleName("get"+camelCase(dbtf.getFieldName(), "_")); + method.setName(getName); + SimpleType stringType = ast.newSimpleType(ast.newName("String")); + method.setReturnType2(stringType); + ReturnStatement rStmt = ast.newReturnStatement(); + FieldAccess fa = ast.newFieldAccess(); + fa.setExpression(ast.newThisExpression()); + fa.setName(ast.newSimpleName(toLowerCaseFirst(camelCase(dbtf.getFieldName(),"_")))); + rStmt.setExpression(fa); + Block block = ast.newBlock(); + block.statements().add(rStmt); + method.setBody(block); + return method; + } +}