package net.sf.minuteProject.utils.enrichment; import java.util.ArrayList; import java.util.List; import net.sf.minuteProject.configuration.bean.GeneratorBean; import net.sf.minuteProject.configuration.bean.Model; import net.sf.minuteProject.configuration.bean.Template; import net.sf.minuteProject.configuration.bean.model.data.Column; import net.sf.minuteProject.configuration.bean.model.data.Database; import net.sf.minuteProject.configuration.bean.model.data.Reference; import net.sf.minuteProject.configuration.bean.model.data.Table; import net.sf.minuteProject.configuration.bean.model.data.View; import net.sf.minuteProject.configuration.bean.system.Property; import net.sf.minuteProject.loader.mapping.node.Variable; import net.sf.minuteProject.utils.TableUtils; public class EnrichmentUtils { public static final String generateForTag = "generateForTag"; public static boolean hasMenuLinkDirectResultAccess (GeneratorBean bean) { if (hasTag(bean, "menuLinkDirectResultAccess")) return true; return false; } // set caching in model map for entity tag public static boolean hasEntityTag (Model model, String tag){ for (Table entity : model.getBusinessModel().getBusinessPackage().getEntities()) { if (hasTag(entity, tag)) return true; } return false; } // set caching in model map for field tag public static boolean hasFieldTag (Model model, String tag){ for (Table entity : model.getBusinessModel().getBusinessPackage().getEntities()) { if (hasFieldTag(entity, tag)) return true; } return false; } public static boolean hasFieldTag (Table table, String tag) { for (Column column : table.getColumns()) { if (hasTag(column, tag)) return true; } return false; } public static boolean hasTag (GeneratorBean bean, String tag) { for (Property property : bean.getProperties()) { if (property.getName().equals(tag)) return true; } return false; } //TODO caching public static Table[] getTablesWithTag (Model model, String tag) { List<Table> tables = new ArrayList<Table>(); for (Table entity : model.getBusinessModel().getBusinessPackage().getEntities()) { if (hasFieldTag(entity, tag)) tables.add(entity); } return (Table[]) tables.toArray(new Table[tables.size()]); } //TODO caching public static Column[] getColumnsWithTag (Table table, String tag) { List<Column> columns = new ArrayList<Column>(); for (Column column : table.getColumns()) { if (hasTag(column, tag)) columns.add(column); } return (Column[]) columns.toArray(new Column[columns.size()]); } public static Property[] getProperties (GeneratorBean bean, String tag) { for (Property property : bean.getProperties()) { if (property.getName().equals(tag)) return property.getPropertiesArray(); } return null; } public static Table[] getLinkedEntityByForeignKeyForTag (Table table, String tag) { List<Table> list = new ArrayList<Table>(); Reference[] reference = table.getParents(); for (int i = 0; i < reference.length; i++) { Table linkedTable = reference[i].getForeignTable(); if (hasTag(linkedTable, tag)) list.add(linkedTable); } return (Table[]) list.toArray(new Table[list.size()]); } public static Reference[] getLinkedReferenceByForeignKeyForTag (Table table, String tag) { List<Reference> list = new ArrayList<Reference>(); Reference[] reference = table.getParents(); for (int i = 0; i < reference.length; i++) { Table linkedTable = reference[i].getForeignTable(); if (hasTag(linkedTable, tag)) list.add(reference[i]); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Reference[] getLinkedReferenceByForeignKey (Table table) { List<Reference> list = new ArrayList<Reference>(); Reference[] reference = table.getParents(); for (int i = 0; i < reference.length; i++) { Table linkedTable = reference[i].getForeignTable(); // if (hasTag(linkedTable, tag)) list.add(reference[i]); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Table[] getLinkedMany2ManyEntity (Table table) { return getLinkedEntityByChildren (table, true); } public static Table[] getLinkedMany2ManyEntityForTag (Table table, String tag) { return getLinkedEntityByChildrenForTag(table, tag, true); } public static Table[] getLinkedEntityByChildrenForTag (Table table, String tag) { return getLinkedEntityByChildrenForTag(table, tag, false); } /* * get linked ref for m2m => ref[] * :Reference[] getLinkedMany2ManyReferenceForTag (Table table, String tag) * for each ref * get other side of the relationship ref input(ref)-> table, * :Reference getTargetReferenceEntityByMany2ManyForTag (Reference origin, String tag) */ public static Table[] getLinkedEntityByChildrenForTag (Table table, String tag, boolean filterMany2Many) { List<Table> list = new ArrayList<Table>(); Reference[] reference = table.getChildren(); for (int i = 0; i < reference.length; i++) { Table child = reference[i].getForeignTable(); if (hasTag(child, tag)) if (filterMany2Many) { if (child.isManyToMany()) list.add(child); } else list.add(child); } return (Table[]) list.toArray(new Table[list.size()]); } public static Table[] getLinkedEntityByChildren(Table table, boolean filterMany2Many) { List<Table> list = new ArrayList<Table>(); Reference[] reference = table.getChildren(); for (int i = 0; i < reference.length; i++) { Table child = reference[i].getForeignTable(); // if (hasTag(child, tag)) if (filterMany2Many) { if (child.isManyToMany()) list.add(child); } else list.add(child); } return (Table[]) list.toArray(new Table[list.size()]); } public static Table getLinkedEntityByMany2ManyForTag (Table origin, Table many2many, String tag) { if (many2many.isManyToMany()) { Table[] m2mTables = getLinkedEntityByForeignKeyForTag(many2many, tag); for (int i = 0; i < m2mTables.length; i++) { if (!m2mTables[i].getName().equals(origin.getName())) return m2mTables[i]; } } return null; } public static Reference getTargetReferenceEntityByMany2ManyForTag (Reference origin, String tag) { Table m2m = origin.getForeignTable(); // System.out.println("m2m = "+m2m.getName()); return getTargetReferenceEntityByMany2ManyForTag(origin, m2m, tag); } public static Reference getTargetReferenceEntityByMany2Many (Reference origin) { Table m2m = origin.getForeignTable(); return getTargetReferenceEntityByMany2Many(origin, m2m); } public static Reference getTargetReferenceEntityByMany2ManyForTag (Reference origin, Table many2many, String tag) { if (many2many.isManyToMany()) { Reference[] m2mReference = getLinkedReferenceByForeignKeyForTag(many2many, tag); for (int i = 0; i < m2mReference.length; i++) { Reference ref = m2mReference[i]; // System.out.println("origin = "+origin.getLocalColumnName()+"-"+origin.getLocalTableName()+"-"+origin.getForeignColumnName()+"-"+origin.getForeignTableName()); // System.out.println("ref = "+ref.getLocalColumnName()+"-"+ref.getLocalTableName()+"-"+ref.getForeignColumnName()+"-"+ref.getForeignTableName()); if (!isEqual(origin, ref)) return ref; // if (!ref.getLocalColumnName().equals(origin.getForeignColumnName()) || // !ref.getLocalTableName().equals(origin.getForeignTableName()) || // !ref.getForeignColumnName().equals(origin.getLocalColumnName()) || // !ref.getForeignColumnName().equals(origin.getLocalColumnName()) ) // return ref; } } return null; } public static Reference getTargetReferenceEntityByMany2Many (Reference origin, Table many2many) { if (many2many.isManyToMany()) { Reference[] m2mReference = getLinkedReferenceByForeignKey(many2many); for (int i = 0; i < m2mReference.length; i++) { Reference ref = m2mReference[i]; if (!isEqual(origin, ref)) { // if (origin.isMasterRelationship()) // ref.setAggregateRelationship(); return ref; } } } return null; } private static boolean isEqual (Reference origin, Reference ref) { if (!ref.getLocalColumnName().equals(origin.getForeignColumnName()) || !ref.getLocalTableName().equals(origin.getForeignTableName()) || !ref.getForeignColumnName().equals(origin.getLocalColumnName()) || !ref.getForeignColumnName().equals(origin.getLocalColumnName()) ) return false; return true; } private static boolean isEqualLocal (Reference origin, Reference ref) { if (!ref.getLocalTableName().equals(origin.getLocalTableName()) ) return false; return true; } public static Reference[] getLinkedRefenceByChildrenForTag (Table table, String tag, boolean filterMany2Many) { List<Reference> list = new ArrayList<Reference>(); Reference[] reference = table.getChildren(); for (int i = 0; i < reference.length; i++) { Table child = reference[i].getForeignTable(); if (hasTag(child, tag)) if (filterMany2Many) { if (child.isManyToMany()) list.add(reference[i]); } else list.add(reference[i]); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Reference[] getLinkedRefenceByChildren (Table table, boolean filterMany2Many) { List<Reference> list = new ArrayList<Reference>(); // System.out.println(">>table="+table); // System.out.println(">>table="+table.getName()); Reference[] reference = table.getChildren(); for (int i = 0; i < reference.length; i++) { Table child = reference[i].getForeignTable(); // if (hasTag(child, tag)) if (filterMany2Many) { if (child.isManyToMany()) { boolean present = false; for (Reference ref : list) { if (ref==reference[i]) present = true; break; } if (!present) list.add(reference[i]); } } else list.add(reference[i]); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Reference[] getLinkedReferenceByChildrenForTag (Table table, String tag) { return getLinkedRefenceByChildrenForTag(table, tag, false); } public static Reference[] getLinkedMany2ManyReferenceForTag (Table table, String tag) { return getLinkedRefenceByChildrenForTag(table, tag, true); } public static Reference[] getLinkedMany2ManyReference (Table table) { return getLinkedRefenceByChildren(table, true); } public static Reference[] getLinkedTargetReferenceByMany2ManyForTag (Table table, String tag) { List<Reference> list = new ArrayList<Reference>(); Reference[] referenceOrigin = getLinkedMany2ManyReferenceForTag(table, tag); for (int i = 0; i < referenceOrigin.length; i++) { Reference ref = getTargetReferenceEntityByMany2ManyForTag(referenceOrigin[i], tag); list.add(ref); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Reference[] getLinkedTargetReferenceByMany2Many (Table table) { List<Reference> list = new ArrayList<Reference>(); if(table!=null) { Reference[] referenceOrigin = getLinkedMany2ManyReference(table); for (int i = 0; i < referenceOrigin.length; i++) { Reference ref = getTargetReferenceEntityByMany2Many(referenceOrigin[i]); list.add(ref); } } return (Reference[]) list.toArray(new Reference[list.size()]); } public static Reference[] getDistinctLinkedTargetReferenceByMany2ManyForTag (Table table, String tag) { List<Reference> list = new ArrayList<Reference>(); Reference[] referenceOrigin = getLinkedTargetReferenceByMany2ManyForTag (table, tag); for (int i = 0; i < referenceOrigin.length; i++) { boolean isToAdd = true; for (Reference reference : list) { if (isEqualLocal(referenceOrigin[i], reference)) isToAdd = false; } if (isToAdd) list.add(referenceOrigin[i]); } return (Reference[]) list.toArray(new Reference[list.size()]); } public static boolean isToGenerateBasedOnModelEntityTag(Template template, Model model) { List<Property> templateProp = template.getProperties(); for (Property property : templateProp) { if (property.getName().equals(generateForTag)) { return hasEntityTag(model, property.getName()); } } return false; } public static boolean isToGenerateBasedOnModelFieldTag(Template template, Model model) { List<Property> templateProp = template.getProperties(); for (Property property : templateProp) { if (property.getName().equals(generateForTag)) { return hasFieldTag(model, property.getName()); } } return false; } public static boolean isToGenerateBasedOnTag(Template template, GeneratorBean bean) { // List<Property> beanProp = bean.getProperties(); // List<Property> templateProp = template.getProperties(); // for (Property property : templateProp) { // if (property.getName().equals(generateForTag) || property.getTag().equals(generateForTag)) { // for (Property property2 : beanProp) { // if (property2.getName().equals(property.getValue())) // return true; // } // } // } return (getPropertyGenerateBasedOnTag(template, bean)==null)?false:true; } public static String getGenerateBasedOnTagAlias(Template template, GeneratorBean bean) { // TODO Auto-generated method stub Property p =getPropertyGenerateBasedOnTag(template, bean); if (p!=null) { return p.getAlias(); } return null; } public static Property getPropertyGenerateBasedOnTag(Template template, GeneratorBean bean) { List<Property> beanProp = bean.getProperties(); List<Property> templateProp = template.getProperties(); for (Property property : templateProp) { if (property.getName().equals(generateForTag)) { for (Property property2 : beanProp) { if (property2.getTag().equals(property.getValue())) return property2; } } } return null; } public static boolean isToGenerateBasedOnTargetPresence(Template template, GeneratorBean bean) { return isToGenerateBasedOnPropertyNamePresence(template, bean, "target-presence"); } public static boolean isToGenerateBasedOnPropertyPresence(Template template, GeneratorBean bean) { return isToGenerateBasedOnPropertyNamePresence(template, bean, "property-presence"); } public static boolean isToGenerateBasedOnPropertyPresenceValue(Template template, GeneratorBean bean) { Property property = retrievePropertyPresence(template, bean, "property-presence"); if (property!=null) { String value = template.getPropertyValue("property-presence-value"); if (value!=null) return (value.equals(property.getValue())); } return false; } public static Property retrievePropertyPresence(Template template, GeneratorBean bean, String name) { return template.getPropertyByName(template.getPropertyValue(name)); } public static boolean isToGenerateBasedOnPropertyNamePresence(Template template, GeneratorBean bean, String name) { return (template.getPropertyValue(template.getPropertyValue(name))!=null)?true:false; } public static boolean isToGenerateBasedOnTagAndNotMany2Many(Template template, GeneratorBean bean) { if (bean instanceof Table) { Table table = (Table) bean; if (!table.isManyToMany()) { //return isToGenerateBasedOnTag(template, table); return true; } } return false; } public static boolean isToGenerateBasedOnCompositePKNotMany2Many (Template template, GeneratorBean bean) { if (bean instanceof Table) { Table table = (Table) bean; return TableUtils.isCompositePrimaryKeyNotMany2Many(table); } return false; } public static boolean isToGenerateBasedOnNotMany2Many(Template template, GeneratorBean bean) { if (bean instanceof Table) { Table table = (Table) bean; if (!table.isManyToMany()) { // return isToGenerateBasedOnTag(template, table); return true; } } else if (bean instanceof View) return true; return false; } public static Column getOtherColumn (Table table, Column column) { if (table!=null && column!=null) for (Column col : table.getColumns()) { if (!col.getName().equals(column.getName())) return col; } return null; } }