package net.sf.minuteProject.configuration.bean.enrichment.convention; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import net.sf.minuteProject.configuration.bean.BusinessModel; import net.sf.minuteProject.configuration.bean.enrichment.Enrichment; import net.sf.minuteProject.configuration.bean.enrichment.Entity; import net.sf.minuteProject.configuration.bean.enrichment.Field; import net.sf.minuteProject.configuration.bean.model.data.ForeignKey; import net.sf.minuteProject.configuration.bean.model.data.Reference; import net.sf.minuteProject.configuration.bean.model.data.Table; import net.sf.minuteProject.plugin.format.I18nUtils; import net.sf.minuteProject.utils.ReferenceUtils; import net.sf.minuteProject.utils.enrichment.EnrichmentUtils; public class ReferenceNamingConvention extends ModelConvention { public final String APPLY_REFERENCED_ALIAS_WHEN_NO_AMBIGUITY="apply-referenced-alias-when-no-ambiguity"; //TODO public final String APPLY_REFERENCED_ALIAS_WHEN_NO_AMBIGUITY_AND_NOT_PRESENT="apply-referenced-alias-when-no-ambiguity-and-not-present"; public final String APPLY_MANY_TO_MANY_ALIASING = "apply-many-to-many-aliasing"; private boolean isToPlurialize; @Override public void apply(BusinessModel model) { if (APPLY_REFERENCED_ALIAS_WHEN_NO_AMBIGUITY.equals(type)) { if (model.getBusinessPackage()!=null) { for (Table table : model.getBusinessPackage().getEntities()) { apply (table); } } } else if (APPLY_MANY_TO_MANY_ALIASING.equals(type)) { if (model.getBusinessPackage()!=null) { for (Table table : model.getBusinessPackage().getEntities()) { if (table.isManyToMany()) applyM2MAlias (table); } } } } private void applyM2MAlias(Table table) { // get table other end for (Reference parent : table.getParents()) { String retrievedAlias = retrieveAlias(table, parent); if (retrievedAlias!=null) parent.setAlias(retrievedAlias); } // check that reference is enriched } private String retrieveAlias(Table table, Reference parent) { String retrievedAlias = getRetrievedAlias (table, parent); if (retrievedAlias!=null) if (isToPlurialize) retrievedAlias = I18nUtils.plurialize(retrievedAlias); return retrievedAlias; } private String getRetrievedAlias (Table table, Reference parent) { Field field = getRetrievedField(table, parent); if (field!=null) return field.getLinkReferenceAlias(); return null; } private Field getRetrievedField(Table table, Reference parent) { BusinessModel businessModel = table.getDatabase().getDataModel().getModel().getBusinessModel(); if (businessModel!=null){ Enrichment enrichment = businessModel.getEnrichment(); for (Entity entity : enrichment.getEntities()){ if (net.sf.minuteProject.utils.StringUtils.compareName(entity.getName(), table.getName())) { // System.out.println(">>> table "+entity.getName()+"--"+ table.getName()); for (Field field : entity.getFields()) { if (net.sf.minuteProject.utils.StringUtils.compareName(field.getLinkToTargetEntity(), parent.getForeignTable().getName())) { // System.out.println(">>> field "+field.getName()+"-link: "+field.getLinkToTargetEntity()+"- parent: "+parent.getForeignTable().getName()); return field; } } } } } return null; } private void apply(Table table) { // List<Reference> fks = getApplicableReferenceNotMany2Many(table); // for (Reference reference : fks) { // reference.setAlias(getFinalName(table)); // } applyNotMany2ManyReference(table); applyMany2ManyReference(table); } private void applyMany2ManyReference (Table table) { List<Reference> list = getReferenceChildrenAndMany2Many(table); for (Reference reference : EnrichmentUtils.getLinkedTargetReferenceByMany2Many(table)) { if (!reference.getForeignTable().isManyToMany()) { if (isNoAmbiguityReference(reference, list)) reference.setAlias(getNameForUnambiguiousCaseAndMany2Many(table, reference)); else { // System.out.println(">>>>>>>>>> a "+reference.getAlias()); // if (StringUtils.isEmpty(reference.getAlias()) // && !(ReferenceUtils.getDefaultAlias(reference)).equals(reference.getAlias())) { // System.out.println(">>>>>>>>>> alias"); reference.setAlias(getNameForAmbiguiousCaseAndMany2Many(table, reference)); // } } } } } private void applyNotMany2ManyReference(Table table) { List<Reference> list = getReferenceChildrenAndMany2Many(table); for (Reference reference : table.getChildren()) { if (!reference.getForeignTable().isManyToMany()) { if (isNoAmbiguityReference(reference, list)) reference.setAlias(getNameForUnambiguiousCaseAndNotMany2Many(reference.getForeignTable())); else reference.setAlias(getNameForAmbiguiousCaseAndNotMany2Many(table, reference)); } } } private List<Reference> getReferenceChildrenAndMany2Many (Table table) { List<Reference> list = new ArrayList<Reference>(); for (Reference reference : table.getChildren()) { list.add(reference); } for (Reference reference : EnrichmentUtils.getLinkedTargetReferenceByMany2Many(table)) { list.add(reference); } return list; } private String getNameForUnambiguiousCaseAndNotMany2Many(Table table) { return getFinalName(table.getAlias()); } public String getNameForAmbiguiousCaseAndNotMany2Many(Table table, Reference reference) { String name = reference.getForeignTable().getAlias()+"_"+reference.getForeignColumn().getAlias(); return getFinalName(name); } private String getNameForUnambiguiousCaseAndMany2Many(Table table, Reference reference) { String name = reference.getForeignTable().getAlias(); return getFinalName(name); } public String getNameForAmbiguiousCaseAndMany2Many(Table table, Reference reference) { //{targetTableVariableName}Via${linkTableName}By${localColumnName}s String name = reference.getForeignTable().getAlias()+"_VIA_"+reference.getLocalTable().getAlias()+"_BY_"+reference.getForeignColumn().getAlias(); return getFinalName(name); } private String getFinalName(String name) { return (!isToPlurialize)?name:I18nUtils.plurializeUppercase(name); } private boolean isNoAmbiguityReference (Reference reference, List<Reference> list) { int cpt = 0; for (Reference ref : list) { if (ref.getForeignTableName().equals(reference.getForeignTableName())) cpt++; } if (cpt>1) return false; return true; } public boolean isToPlurialize() { return isToPlurialize; } public void setIsToPlurialize(boolean isToPlurialize) { this.isToPlurialize = isToPlurialize; } }