net.anotheria.asg.generator.model.db.VOGenerator Maven / Gradle / Ivy
package net.anotheria.asg.generator.model.db;
import java.util.ArrayList;
import java.util.List;
import net.anotheria.asg.generator.CommentGenerator;
import net.anotheria.asg.generator.Context;
import net.anotheria.asg.generator.FileEntry;
import net.anotheria.asg.generator.GeneratedClass;
import net.anotheria.asg.generator.GeneratorDataRegistry;
import net.anotheria.asg.generator.IGenerateable;
import net.anotheria.asg.generator.IGenerator;
import net.anotheria.asg.generator.meta.MetaContainerProperty;
import net.anotheria.asg.generator.meta.MetaDocument;
import net.anotheria.asg.generator.meta.MetaGenericProperty;
import net.anotheria.asg.generator.meta.MetaListProperty;
import net.anotheria.asg.generator.meta.MetaProperty;
import net.anotheria.asg.generator.meta.MetaTableProperty;
import net.anotheria.asg.generator.model.AbstractDataObjectGenerator;
import net.anotheria.util.StringUtils;
/**
* Generates value objects for db bound document implementation.
*
* @author another
* @version $Id: $Id
*/
public class VOGenerator extends AbstractDataObjectGenerator implements IGenerator{
/**
* Constant for dao-created column name.
*/
public static final String DAO_CREATED = "daoCreated";
/**
* Constant for dao-updaten column name.
*/
public static final String DAO_UPDATED = "daoUpdated";
/**
* The id property.
*/
MetaProperty id = new MetaProperty("id",MetaProperty.Type.STRING);
/**
* The dao created property (not included in document property set).
*/
MetaProperty daoCreated = new MetaProperty(DAO_CREATED, MetaProperty.Type.LONG);
/**
* The dao created property (not included in document property set).
*/
MetaProperty daoUpdated = new MetaProperty(DAO_UPDATED, MetaProperty.Type.LONG);
/** {@inheritDoc} */
public List generate(IGenerateable gdoc){
MetaDocument doc = (MetaDocument)gdoc;
id.setReadonly(true);
List _ret = new ArrayList();
_ret.add(new FileEntry(generateDocument(doc)));
_ret.add(new FileEntry(generateDocumentFactory(doc)));
return _ret;
}
/** {@inheritDoc} */
public String getDataObjectImplName(MetaDocument doc){
return getDocumentImplName(doc);
}
/**
* getDocumentImplName.
*
* @param doc a {@link net.anotheria.asg.generator.meta.MetaDocument} object.
* @return a {@link java.lang.String} object.
*/
public static String getDocumentImplName(MetaDocument doc){
return doc.getName()+"VO";
}
/**
* getClassImplName.
*
* @param doc a {@link net.anotheria.asg.generator.meta.MetaDocument} object.
* @return a {@link java.lang.String} object.
*/
public static String getClassImplName(MetaDocument doc){
return doc.getName()+"Document";
}
private GeneratedClass generateDocument(MetaDocument doc){
GeneratedClass clazz = new GeneratedClass();
startNewJob(clazz);
clazz.setPackageName(getPackageName(doc));
clazz.setTypeComment(CommentGenerator.generateJavaTypeComment("The implementation of the "+(doc.getName())+".", this));
for (int i=0; i");
}
appendMark(1);
clazz.setName(getDocumentImplName(doc));
clazz.setParent("AbstractVO");
startClassBody();
appendMark(2);
generatePropertyFields(doc);
emptyline();
appendMark(3);
generateDefaultConstructor(doc);
emptyline();
appendMark(4);
generateCloneConstructor(doc);
emptyline();
generateBuilderConstructor(doc);
emptyline();
generatePropertyAccessMethods(doc);
emptyline();
generateToStringMethod(doc);
emptyline();
generateCloneMethod(doc);
emptyline();
generateCopyMethod(doc);
emptyline();
generateGetPropertyValueMethod(doc);
emptyline();
generateAdditionalMethods(doc);
if (doc.isComparable()){
emptyline();
generateCompareMethod(doc);
}
emptyline();
generateDefNameMethod(doc);
emptyline();
generateDefParentNameMethod(doc);
emptyline();
generateGetFootprintMethod(doc);
emptyline();
generateEqualsMethod(doc);
return clazz;
}
private void generateDefaultConstructor(MetaDocument doc){
appendString("public "+getDocumentImplName(doc)+"(String anId){");
increaseIdent();
appendStatement("id = anId");
append(closeBlock());
}
private void generateCloneConstructor(MetaDocument doc){
appendString("public "+getDocumentImplName(doc)+"("+getDocumentImplName(doc)+" toClone){");
increaseIdent();
//TODO add multilingual support
appendStatement("this.id = toClone.id");
appendStatement("copyAttributesFrom(toClone)");
append(closeBlock());
}
private void generateBuilderConstructor(MetaDocument doc){
appendString(getDocumentImplName(doc)+"("+getDocumentBuilderName(doc)+" builder){");
increaseIdent();
//TODO add multilingual support
appendStatement("id = "+quote(""));
for (MetaProperty p : doc.getProperties()){
appendStatement(p.getName().toLowerCase()," = ", "builder.", p.getName());
}
for (MetaProperty p : doc.getLinks()){
appendStatement(p.getName().toLowerCase()," = ", "builder.", p.getName());
}
append(closeBlock());
}
private void generatePropertyFields(MetaDocument doc){
_generatePropertyField(id);
_generatePropertyFields(doc.getProperties());
_generatePropertyFields(doc.getLinks());
//support for dao information
_generatePropertyField(daoCreated);
_generatePropertyField(daoUpdated);
}
private MetaProperty getMetaGenericProperty(MetaListProperty p){
MetaProperty tmp = new MetaGenericProperty(p.getName(), MetaProperty.Type.LIST, p.getContainedProperty());
if (p.isMultilingual())
tmp.setMultilingual(true);
return tmp;
}
private void _generatePropertyFields(List propertyList){
for (int i=0; i columns = ((MetaTableProperty)p).getColumns();
for (int t=0; t properties){
for (int i=0; i columns = p.getColumns();
for (int t=0; t columns = p.getColumns();
for (int t=0; t props = doc.getProperties();
for (int i=0; i columns = ((MetaTableProperty)p).getColumns();
for (int t=0; tproperties = new ArrayList(doc.getProperties());
properties.addAll(doc.getLinks());
// Generate getter for ID property
appendString("if ("+id.toNameConstant()+".equals(propertyName))");
appendIncreasedStatement("return get"+id.getAccesserName()+"()");
// Generate getters for other properties
for (MetaProperty p : properties){
appendString("if ("+p.toNameConstant()+".equals(propertyName))");
appendIncreasedStatement("return get"+p.getAccesserName()+"()");
}
appendStatement("throw new RuntimeException("+quote("No property getter for ")+"+propertyName)");
append(closeBlock());
}
/**
* getDocumentImport.
*
* @param context a {@link net.anotheria.asg.generator.Context} object.
* @param doc a {@link net.anotheria.asg.generator.meta.MetaDocument} object.
* @return a {@link java.lang.String} object.
*/
public static final String getDocumentImport(Context context, MetaDocument doc){
return context.getPackageName(doc)+".data."+getDocumentImplName(doc);
}
private void generateAdditionalMethods(MetaDocument doc){
List properties = doc.getProperties();
for (MetaProperty p : properties){
if (p instanceof MetaContainerProperty)
generateContainerMethods((MetaContainerProperty)p);
if (p instanceof MetaTableProperty)
generateTableMethods((MetaTableProperty)p);
if (p instanceof MetaListProperty)
generateListMethods((MetaListProperty)p);
}
}
private void generateContainerMethods(MetaContainerProperty container){
appendString("public int "+getContainerSizeGetterName(container)+"(){");
increaseIdent();
// MetaProperty pr = container instanceof MetaTableProperty ?
// ((MetaTableProperty)container).getColumns().get(0) :
// container;
// appendStatement("return getList("+pr.toNameConstant()+").size()");
appendStatement("return get"+container.getAccesserName()+"().size()");
append(closeBlock());
emptyline();
}
private void generateListMethods(MetaListProperty list){
MetaProperty genericList = getMetaGenericProperty(list);
MetaProperty c = list.getContainedProperty();
String decl = "public void "+getContainerEntryAdderName(list)+"(";
decl += c.toJavaType()+" "+c.getName();
decl += "){";
appendString(decl);
increaseIdent();
appendStatement(c.toJavaObjectType()+" p = new "+c.toJavaObjectType()+"("+c.getName()+")");
appendStatement(genericList.toJavaType() + " tmp = get"+list.getAccesserName()+"()");
appendStatement("tmp.add(p)");
// appendStatement("set"+list.getAccesserName()+"(tmp)");
append(closeBlock());
emptyline();
appendString("public void "+getContainerEntryDeleterName(list)+"(int index){");
increaseIdent();
// appendStatement("getListProperty("+list.toNameConstant()+").remove(index)");
appendStatement("get"+list.getAccesserName()+"().remove(index)");
append(closeBlock());
emptyline();
appendString("public void "+getContainerEntrySwapperName(list)+"(int index1, int index2){");
increaseIdent();
appendStatement(c.toJavaType()+" tmp1, tmp2");
// appendStatement("tmp1 = (("+c.toJavaType()+")getList("+list.toNameConstant()+").get(index1)).get"+c.toJavaType()+"()");
// appendStatement("tmp2 = (("+c.toJavaType()+")getList("+list.toNameConstant()+").get(index2)).get"+c.toJavaType()+"()");
// appendStatement("(("+c.toJavaType()+"Property"+")getList("+list.toNameConstant()+").get(index1)).set"+c.toJavaType()+"(tmp2)");
// appendStatement("(("+c.toJavaType()+"Property"+")getList("+list.toNameConstant()+").get(index2)).set"+c.toJavaType()+"(tmp1)");
appendStatement(genericList.toJavaType() + " tmpList = get"+list.getAccesserName()+"()");
appendStatement("tmp1 = (("+c.toJavaObjectType()+")tmpList.get(index1))");
appendStatement("tmp2 = (("+c.toJavaObjectType()+")tmpList.get(index2))");
appendStatement("tmpList.set(index1, tmp2)");
appendStatement("tmpList.set(index2, tmp1)");
append(closeBlock());
emptyline();
appendString("public "+c.toJavaType()+ " "+getListElementGetterName(list)+"(int index){");
increaseIdent();
// appendStatement(c.toJavaType()+"Property p = ("+c.toJavaType()+"Property"+")getList("+list.toNameConstant()+").get(index)");
// appendStatement("return p.get"+c.toJavaType()+"()");
appendStatement(c.toJavaType()+" p = ("+c.toJavaObjectType()+""+")get"+list.getAccesserName()+"().get(index)");
appendStatement("return p");
append(closeBlock());
emptyline();
}
private void generateTableMethods(MetaTableProperty table){
List columns = table.getColumns();
String decl = "public void "+getContainerEntryAdderName(table)+"(";
for (int i =0; i properties = extractSortableProperties(doc);
for (int i=0; igetContainerSizeGetterName.
*
* @param p a {@link net.anotheria.asg.generator.meta.MetaContainerProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getContainerSizeGetterName(MetaContainerProperty p){
return "get"+StringUtils.capitalize(p.getName())+"Size";
}
/**
* getTableGetterName.
*
* @param p a {@link net.anotheria.asg.generator.meta.MetaTableProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getTableGetterName(MetaTableProperty p){
return "get"+StringUtils.capitalize(p.getName())+"Table";
}
/**
* getContainerEntryAdderName.
*
* @param p a {@link net.anotheria.asg.generator.meta.MetaContainerProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getContainerEntryAdderName(MetaContainerProperty p){
return "add"+StringUtils.capitalize(p.getName())+p.getContainerEntryName();
}
/**
* getContainerEntryDeleterName.
*
* @param p a {@link net.anotheria.asg.generator.meta.MetaContainerProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getContainerEntryDeleterName(MetaContainerProperty p){
return "remove"+StringUtils.capitalize(p.getName())+p.getContainerEntryName();
}
/**
* getContainerEntrySwapperName.
*
* @param p a {@link net.anotheria.asg.generator.meta.MetaContainerProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getContainerEntrySwapperName(MetaContainerProperty p){
return "swap"+StringUtils.capitalize(p.getName())+p.getContainerEntryName();
}
/**
* getListElementGetterName.
*
* @param list a {@link net.anotheria.asg.generator.meta.MetaListProperty} object.
* @return a {@link java.lang.String} object.
*/
public static String getListElementGetterName(MetaListProperty list){
return "get"+StringUtils.capitalize(list.getName())+list.getContainerEntryName();
}
private void generateCopyMethod(MetaDocument doc){
appendString("public void copyAttributesFrom("+doc.getName()+" toCopy){");
increaseIdent();
for (MetaProperty p : doc.getProperties()){
appendStatement("this."+p.getName().toLowerCase() + " = toCopy."+p.toGetter()+"()");
}
for (MetaProperty p : doc.getLinks()){
appendStatement("this."+p.getName().toLowerCase() + " = toCopy."+p.toGetter()+"()");
}
append(closeBlock());
}
}