Author: chatellier Date: 2008-08-05 17:54:03 +0000 (Tue, 05 Aug 2008) New Revision: 1029 Modified: trunk/topia-service/src/java/org/codelutin/topia/migration/kernel/DependenciesHelper.java Log: Test to detect correct dependencies Modified: trunk/topia-service/src/java/org/codelutin/topia/migration/kernel/DependenciesHelper.java =================================================================== --- trunk/topia-service/src/java/org/codelutin/topia/migration/kernel/DependenciesHelper.java 2008-08-05 09:44:25 UTC (rev 1028) +++ trunk/topia-service/src/java/org/codelutin/topia/migration/kernel/DependenciesHelper.java 2008-08-05 17:54:03 UTC (rev 1029) @@ -37,6 +37,10 @@ import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; import org.hibernate.mapping.Subclass; +import org.hibernate.persister.collection.AbstractCollectionPersister; +import org.hibernate.persister.entity.AbstractEntityPersister; +import org.hibernate.persister.entity.Joinable; +import org.hibernate.type.AssociationType; import org.hibernate.type.CollectionType; import org.hibernate.type.Type; @@ -158,58 +162,87 @@ } Iterator i = clazz.getPropertyIterator(); - //on parcourt les proprietes de la classe courante - while (i.hasNext()) { - Property p = (Property)i.next(); - Type propertyType = p.getType(); - - // si c'est une association - if(propertyType.isAssociationType()) { - - String dependentClassName = null; + //on parcourt les proprietes de la classe courante + while (i.hasNext()) { + Property p = (Property)i.next(); + Type propertyType = p.getType(); + + + + // si c'est une association + if(propertyType.isAssociationType()) { - // on recupere le nom de la classe dont depend la classe courante - if(propertyType.isCollectionType()){ - //<list name="produits" cascade="all"> + AssociationType a = (AssociationType)propertyType; + Joinable j = a.getAssociatedJoinable(sfi); + String s = a.getAssociatedEntityName(sfi); + + String dependentClassName = null; + + // on recupere le nom de la classe dont depend la classe courante + if(propertyType.isCollectionType()){ + //<list name="produits" cascade="all"> // <key column="clients"/> // <index/> // <one-to-many class="domaine.Produit"/> //</list> - CollectionType collectionType = (CollectionType)propertyType; + CollectionType collectionType = (CollectionType)propertyType; - dependentClassName = collectionType.getAssociatedEntityName(sfi); - } - else { - if(!p.getCascadeStyle().equals(CascadeStyle.NONE)) { - //<one-to-one name="produit" class="domaine.Produit" /> - //<many-to-one name="produit" class="domaine.Produit" /> - dependentClassName = propertyType.getName(); - } - } + dependentClassName = collectionType.getAssociatedEntityName(sfi); + } + else { + + if(!p.getCascadeStyle().equals(CascadeStyle.NONE)) { + //<one-to-one name="produit" class="domaine.Produit" /> + //<many-to-one name="produit" class="domaine.Produit" /> + dependentClassName = propertyType.getName(); + } + } + + // essaye pour gerer les boucles dues aux doubles + // visibilites d'associations + /*if(j instanceof AbstractCollectionPersister) { + AbstractCollectionPersister acp = (AbstractCollectionPersister)j; + + // aggragate ? + if(!acp.isInverse() || acp.hasOrphanDelete()) { + dependentClassName = s; + + //if(mDependencies.get(new SimpleProxyClass(dependentClassName)) != null && mDependencies.get(new SimpleProxyClass(dependentClassName)).contains(pcCurrentClass)) { + // mDependencies.get(new SimpleProxyClass(dependentClassName)).remove(pcCurrentClass); + //} + } + } + else { + AbstractEntityPersister aep = (AbstractEntityPersister)j; + if(aep.getPropertyUpdateability() != null && aep.getPropertyUpdateability()[0]) { + dependentClassName = propertyType.getName(); + } + }*/ - if(dependentClassName != null) { - //on l'ajoute dans les listes correspondantes - ProxyClass pcDependentClass = new SimpleProxyClass(dependentClassName); - //classe courante -> classe dont elle depend - if(!lDependencies.contains(pcDependentClass)) { - lDependencies.add(pcDependentClass); - } + if(dependentClassName != null) { + //on l'ajoute dans les listes correspondantes + ProxyClass pcDependentClass = new SimpleProxyClass(dependentClassName); + //classe courante -> classe dont elle depend + if(!lDependencies.contains(pcDependentClass)) { + lDependencies.add(pcDependentClass); + } - //classe dont depend la classe courante -> classe courante - List<ProxyClass> lOldDependents = mInvertDependencies.get(pcDependentClass); - if(lOldDependents == null) { - lOldDependents = new LinkedList<ProxyClass>(); - mInvertDependencies.put(pcDependentClass, lOldDependents); - } - if(!lOldDependents.contains(pcCurrentClass)) { - lOldDependents.add(pcCurrentClass); - } - } - } - } - } - } + //classe dont depend la classe courante -> classe courante + List<ProxyClass> lOldDependents = mInvertDependencies.get(pcDependentClass); + if(lOldDependents == null) { + lOldDependents = new LinkedList<ProxyClass>(); + mInvertDependencies.put(pcDependentClass, lOldDependents); + } + if(!lOldDependents.contains(pcCurrentClass)) { + lOldDependents.add(pcCurrentClass); + } + } + } + } + } + } + /** * Permet de recuperer la liste des classes dont depend la Classe passee en parametre