/*
* 02/25/2002 - 13:26:10
*
* MCD
* Copyright (C) 2002 Dreux Loic
* dreuxl@free.fr
*
* Modifications :
* ---------------
* @author : Bruno Dabo <bruno.dabo@lywoonsoftware.com>
* @date : 2009 jan 22
* @Objet : Cardinalité à zéro
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.analyse.merise.mcd.composant;
import java.awt.Point;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Observer;
import java.util.Set;
import org.analyse.core.gui.zgraph.ZElement;
import org.analyse.core.gui.zgraph.ZGraphique;
import org.analyse.core.gui.zgraph.ZLien;
import org.analyse.core.util.GUIUtilities;
import org.analyse.core.util.Utilities;
import org.analyse.core.util.Constantes;
import org.analyse.merise.gui.table.DictionnaireTable;
/**
* Composant Graphique représentant un MCD.
*/
public class MCDComponent extends ZGraphique implements Observer {
/**
*
*/
private static final long serialVersionUID = -630088766787499921L;
/** dictionnaire des informations */
private DictionnaireTable data;
private String msg;
/**
* Créer un nouveau <code>MCDComponent</code>
*
* @param data
* Dictionnaire des informations à associer au MCD.
*/
public MCDComponent(DictionnaireTable data) {
super();
this.data = data;
data.addObserver(this);
}
/**
* Ajoute un MCDObjet dans le MCD.
*
* Utilisé lors d'un chargement d'un fichier
*/
public void addObjet(MCDObjet obj) {
data.addObserver(obj);
super.addElement(obj);
}
/**
* Ajoute une nouvelle <code>MCDEntite</code> vide.
*
* Utilisé lors de la création d'une nouvelle entité
*/
public MCDEntite addEntite(int x, int y) {
MCDEntite ent ;
//bug : 347422
ent = new MCDEntite(this, x, y) ;
super.addElement(ent);
data.addObserver(ent);
return ent;
}
/**
* Ajoute une nouvelle <code>MCDAssociation</code> vide.
*
* Utilisé lors de la création d'une nouvelle association
*/
public MCDAssociation addAssociation(int x, int y) {
MCDAssociation ass;
super.addElement(ass = new MCDAssociation(this, x, y));
data.addObserver(ass);
return ass;
}
/**
* Appelle la méthode creerLien, cette méthode permet à l'utilisateur de
* sélectionner deux <code>MCDObjet</code> afin de les lier.
*
* Utilisé lors de la création d'un nouveau lien
*/
public void addLien() {
creerLien(new MCDLien());
}
/**
* Supprime un lien ainsi que leurs références dans les
* <code>MCDObjet</code>.
*/
public void removeLien(ZLien lien) {
MCDObjet elem1 = (MCDObjet) (lien.getElement(Constantes.MCDENTITE1));
elem1.delLink((MCDLien) lien);
MCDObjet elem2 = (MCDObjet) (lien.getElement(Constantes.MCDENTITE2));
elem2.delLink((MCDLien) lien);
super.removeLien(lien);
}
/**
* Supprime le lien sélectionné
*/
public void removeLien() {
removeLien(lienClic);
}
/**
* Supprime le <code>MCDObjet</code>. Cette méthode s'occupe de libérer
* les informations que contenait le MCDObjet.
*/
public void removeObjet(ZElement element) {
MCDObjet obj = (MCDObjet) element;
obj.clearInformations();
super.removeElement(element);
}
/**
* Supprime le <code>MCDObjet</code> sélectionné.
*/
public MCDObjet removeObjet() {
ZElement element = elementClic;
this.removeObjet(elementClic);
return (MCDObjet) element;
}
/**
* Supprime les {@link MCDObjet}s sélectionnés.
*/
public Set<MCDObjet> removeObjets() {
Set<ZElement> selectionAvantEffacement = new LinkedHashSet<ZElement>(selectionCourante);
Set<MCDObjet> observersAEffacer = new LinkedHashSet<MCDObjet>();
for (ZElement element : selectionAvantEffacement) {
removeObjet(element);
if (element instanceof MCDObjet)
observersAEffacer.add((MCDObjet) element);
}
return observersAEffacer;
}
/**
*
*/
public void clear() {
super.clearAll();
}
/**
* Retourne le <code>MCDObjet</code> correspondant au nom passé en
* paramètre.
*/
public MCDObjet getElement(String name) {
for (Iterator<ZElement> e = enumElements(); e.hasNext();) {
MCDObjet o = (MCDObjet) e.next();
if (o.getName().equals(name))
return o;
}
return null;
}
/**
* Indique s'il est possible de créer un lien entre les deux éléments. <br>
* Retourne vrai si les deux éléments représentent une association et une
* entité, faux dans le cas contraire.
*/
public boolean peutCreerLien(ZElement elem1, ZElement elem2) {
return super.peutCreerLien(elem1, elem2)
&& (elem1 instanceof MCDAssociation
&& elem2 instanceof MCDEntite || elem2 instanceof MCDAssociation
&& elem1 instanceof MCDEntite);
}
/**
* Retourne la table du dictionnaire des informations correspondant au MCD.
*/
public DictionnaireTable getData() {
return data;
}
/**
* Retourne vrai si le MCD est correct.
*/
public boolean isCorrect(int showErrors) {
MCDObjet obj;
boolean correct = true;
boolean dicoCorrect = true;
msg = "";
// Vérification du dictionnaire
if (!data.allUse())
msg += "<b style=\"color: blue;\"><br/>/!\\Attention</b><br>" +
Utilities.getLangueMessage ("information_non_utilisee") + "<br>";
for (int i = 0; i < data.getRowCount(); i++) {
if(!data.verifySize(i))
{
dicoCorrect = false;
msg += "<b style=\"color: red;\"><br/>/!\\Attention</b><br>La taille de l'information "
+ (String) data.getValueAt(i, DictionnaireTable.NAME)
+ " est incorrecte.<br>";
}
}
if (dicoCorrect) {
msg += Utilities.getLangueMessage ("dictionnaire_correct") + "<br>";
} else {
msg += Utilities.getLangueMessage ("dictionnaire_erreur") + "<br>";
}
//-----------------------------
if (dicoCorrect) {
for (Iterator<ZElement> e = this.elementsZElements(); e.hasNext();) {
obj = (MCDObjet) e.next();
if (obj instanceof MCDAssociation) {
if (!correct)
associationCorrect((MCDAssociation) obj);
else
correct = associationCorrect((MCDAssociation) obj);
} else if (obj instanceof MCDEntite) {
if (((MCDEntite) obj).sizeInformation() < 1) {
correct = false;
msg += "<b style=\"color: red;\"><br/>/!\\</b> L'entité \""
+ obj.getName()
+ "\" n'a pas d'identifiant ...<br>";
}
}
}
} else {
correct = false;
}
if (correct && (showErrors == Constantes.SHOW_ALL)) {
GUIUtilities.messageHTML(msg
+ "<b style=\"color: blue;\">MCD correct ...</b>", true, 300, 250);
} else if ((!correct)
&& (showErrors == Constantes.SHOW_ERRORS || showErrors == Constantes.SHOW_ALL)) {
GUIUtilities.messageHTML(msg
+ "<b style=\"color: red;\">MCD INCORRECT ...</b>", false);
} else if (correct && showErrors == Constantes.CREATE_MCD) {
GUIUtilities.messageHTML(msg
+ "<b style=\"color: blue;\">" + Utilities.getLangueMessage ("mpd_ok") + "<br>"
+ Utilities.getLangueMessage ("mldr_ok") + "<br>"
+ Utilities.getLangueMessage ("sql_ok") + "<br>",
true, 300, 250);
} else if (!correct && showErrors == Constantes.CREATE_MCD) {
GUIUtilities
.messageHTML(msg
+ "<b style=\"color: red;\">" + Utilities.getLangueMessage ("mcd_incorrect")
+ "</b>", false);
}
return correct;
}
/**
* Vérifie les cardinalitées des associations.
*/
private boolean associationCorrect(MCDAssociation ass) {
// L'association à plus de 2 liens
// ou l'association est une association porteuse d'informations
if (ass.sizeLink() > 2 || ass.sizeInformation() > 0) {
// Vérifie que l'association a au moins deux liens dans
// le cas de la porteuse.
if (ass.sizeLink() < 2) {
msg += "<b style=\"color: red;\">/!\\</b> Le nombre de liens de l'association \""
+ ass.getName() + "\" est inférieur à deux.<br>";
return false;
}
} /* else if (ass.sizeLink() < 2) {
msg += "<b style=\"color: red;\">/!\\</b> Le nombre de liens de l'association \""
+ ass.getName() + "\" est inférieur à deux.<br>";
return false;
} */
return true;
}
/**
* Retourne vrai lorsque une nouvelle table va etre crée à partir de
* l'association.
*/
private boolean newTable(MCDAssociation ass) {
if (ass.sizeLink() > 2 || ass.sizeInformation() > 0)
return true;
boolean porteuse = true;
for (Iterator<MCDLien> e = ass.links(); e.hasNext();)
if (!((MCDLien) e.next()).getCardMax().equals("N"))
porteuse = false;
return porteuse;
}
/**
* Retourne le type de l'association
*/
private String typeAssociation(MCDAssociation ass) {
//@TODO private String typeAssociation(MCDAssociation ass) : ce bout de code laisse à désirer - le modifier rapidement
/*
* * -> la fonction donne plusieurs résultats possibles à analyser par la fonction appelante. C'est source à quelques ennuis
*/
if (ass.sizeLink() > 2 || ass.sizeInformation() > 0)
return Constantes.PORTEUSE;
boolean porteuse = true;
boolean un_un = true;
boolean zero_n = false ;
boolean zero_un = false ;
for (Iterator<MCDLien> e = ass.links(); e.hasNext();) {
MCDLien lien = (MCDLien) e.next();
if (!lien.getCardMax().equals("N"))
porteuse = false;
if (!lien.getCardMax().equals("1"))
un_un = false;
if ( lien.getCardMin().equals("0") ) {
if ( ! lien.getCardMax().equals("1") )
zero_n = true ;
else
zero_un = true ;
}
}
if (porteuse)
return Constantes.PORTEUSE; // a vérifier
if (zero_un)
return Constantes.ZERO_UN;
if (un_un)
return Constantes.UN_UN;
if ( zero_n )
return Constantes.ZERO_N;
return Constantes.UN_N;
}
/**
* Retourne l'objet <code>MCDEntite</code> lié à l'association
* @author bruno.dabo@lywoonsoftware.com
* @param ass association
*
*
*/
private MCDEntite getMCDEntite( MCDAssociation ass ) {
for (Iterator<ZLien> e = elementsZLiens(); e.hasNext();) {
MCDLien lien = (MCDLien) (e.next());
if (lien.getElement( Constantes.MCDENTITE1 ).equals(ass) )
return (MCDEntite) (lien.getElement( Constantes.MCDENTITE2 ));
}
return null;
}
/**
* Retourne l'objet <code>MCDEntite</code> lié à l'association
*
* @param ass
* association
* @param card
* Cardinalité
*/
private MCDEntite getMCDEntite(MCDAssociation ass, String card) {
for (Iterator<ZLien> e = elementsZLiens(); e.hasNext();) {
MCDLien lien = (MCDLien) (e.next());
if (lien.getElement( Constantes.MCDENTITE1 ).equals(ass)
&& lien.getCardMax().equals(card))
return (MCDEntite) (lien.getElement( Constantes.MCDENTITE2 ));
}
return null;
}
/**
* Retourne l'objet <code>MCDEntite</code> lié à l'association
*
* @param ass
* association
* @param num
* index
*/
private MCDEntite getMCDEntite(MCDAssociation ass, int num) {
int tmp = 0;
for (Iterator<ZLien> e = elementsZLiens(); e.hasNext();) {
MCDLien lien = (MCDLien) (e.next());
if (lien.getElement ( Constantes.MCDENTITE1 ).equals(ass) && tmp == num)
return (MCDEntite) (lien.getElement ( Constantes.MCDENTITE2 ));
else if (lien.getElement( Constantes.MCDENTITE1 ).equals(ass))
tmp++;
}
return null;
}
/**
* Créer le MPD correspondant au MCD.
*/
public boolean buildMPD(MPDComponent mpd, int showErrors) {
MPDEntite ent = null , ent2 = null ;
MCDObjet obj;
MPDLien mpdLien;
MCDLien mcdLienAssociation = null ;
if (!this.isCorrect(showErrors))
return false;
mpd.clearAll();
mpd.setWidth(this.getPreferredSize().getWidth());
/*
* Création des MPDEntite à partir des MCDEntite et des MCDAssociation
*/
for (Iterator<ZElement> e = this.elementsZElements(); e.hasNext();) {
obj = (MCDObjet) e.next();
if (obj instanceof MCDEntite) {
ent = new MPDEntite(mpd, Utilities.normaliseString(obj.getName(), Constantes.LOWER));
ent.setPosition(new Point(obj.getX(), obj.getY()));
ent.addIdentifiant(obj.getCodeInformation(0));
ent.addInformations(obj.getInformations());
mpd.addMPDEntite(ent);
}
}
for (Iterator<ZElement> e = this.elementsZElements(); e.hasNext();) {
obj = (MCDObjet) e.next();
if (obj instanceof MCDAssociation) {
String ws_typeAssociation = typeAssociation ((MCDAssociation) obj) ;
if ( ws_typeAssociation.equals ( Constantes.PORTEUSE) ) {
ent = new MPDEntite(mpd, Utilities.normaliseString(obj.getName(), Constantes.LOWER));
ent.setPosition(new Point(obj.getX(), obj.getY()));
List<MCDLien> vLinks = ( (MCDAssociation) obj ).links ; // Les liens de l'association sont dans un vecteur
for ( int k=0; k < vLinks.size() ; k++ ) {
// récupération des différents liens de l'association
mcdLienAssociation = ( MCDLien ) ( vLinks.get( k ) ) ;
MCDEntite mcdEntite = ( MCDEntite ) mcdLienAssociation.getElement ( Constantes.MCDENTITE2 ) ;
ent2 = mpd.getMPDEntite(Utilities.normaliseString (mcdEntite.getName() , Constantes.LOWER));
if ( ent2 == null )
ent2 = new MPDEntite(mpd, Utilities.normaliseString(mcdEntite.getName(), Constantes.LOWER));
mpdLien = new MPDLien();
//ent2 = mpd.getMPDEntite(Utilities.normaliseString(mcdLienAssociation.getMCDObjet ( Constantes.MCDENTITE2 ).getName(), Constantes.LOWER));
//ent.addForeignKey(ent2.getCodeInformation(0), Utilities.normaliseString( ent2.getName(), Constantes.LOWER) ) ;
mpdLien.setElement(ent, Constantes.MCDENTITE2);
//ent2.addForeignKey(ent.getCodeInformation(0), Utilities.normaliseString( ent.getName(), Constantes.LOWER) ) ;
mpdLien.setElement(ent2, Constantes.MCDENTITE1);
mpd.addLien(mpdLien);
ent.addIdentifiant(mcdLienAssociation.getMCDObjet ( Constantes.MCDENTITE2 ).getCodeInformation(0));
ent.addForeignKey(ent2.getCodeInformation(0), Utilities.normaliseString( ent2.getName(), Constantes.LOWER) ) ;
}
ent.addInformations(obj.getInformations()); // les propriétés de la relation
if ( vLinks.size() == 1 ) { //liaison reflexive
MCDAssociation mCDAssociation = ( MCDAssociation ) ( ( MCDLien ) vLinks.get(0) ).getElement ( Constantes.MCDENTITE1 ) ;
String str = Utilities.normaliseString(ent2.getCodeInformation(0), Constantes.LOWER) + "_" + Utilities.normaliseString(mCDAssociation.getName() , Constantes.LOWER) ;
if ( mcdLienAssociation.getCardMin().equals( "1" ) ) {
ent.addIdentifiant ( str ) ;
} else {
ent.addInformation ( str ) ;
}
}
mpd.addMPDEntite(ent);
}
if ( ws_typeAssociation.equals( Constantes.UN_UN ) || ws_typeAssociation.equals( Constantes.ZERO_UN ) ) {
mpdLien = new MPDLien();
int numEntite = -1;
List<MCDLien> vLinks = ( (MCDAssociation) obj ).links ; // Les liens de l'association sont dans un vecteur
boolean traitement = false ;
int k = 0 ;
MCDEntite mcdEntiteAssociee = null ;
for ( k=0; k < vLinks.size() ; k++ ) {
// récupération des différents liens de l'association
mcdLienAssociation = ( MCDLien ) ( vLinks.get( k ) ) ;
MCDEntite mcdEntite = ( MCDEntite ) mcdLienAssociation.getElement ( Constantes.MCDENTITE2 ) ;
ent = mpd.getMPDEntite(Utilities.normaliseString (mcdEntite.getName() , Constantes.LOWER));
ent.setForeignKeyCanBeNull ( true ) ;
// #693487 if ( mcdLienAssociation.getCardMin().equals( "1" ) && mcdLienAssociation.getCardMax().equals( "1" ) ) {
if ( mcdLienAssociation.getCardMax().equals( "1" ) ) { // #693487
traitement = true ;
// récupération de la primary key de l'entité associée pour la passer en foreign key dans l'entité courante
numEntite = ( k == 0 ) ? 1 : 0 ;
if ( vLinks.size () == 1 ) numEntite = 0 ; //liaison reflexive
MCDLien ws_lien = ( MCDLien ) vLinks.get( numEntite ) ;
mcdEntiteAssociee = ( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 ) ;
//String nameEntiteAssociee = mcdEntiteAssociee.getName() ;
if ( vLinks.size() == 1 ) { //liaison reflexive
MCDAssociation mCDAssociation = ( MCDAssociation ) ( ( MCDLien ) vLinks.get(0) ).getElement ( Constantes.MCDENTITE1 ) ;
ent.addIdentifiant ( mcdEntiteAssociee.getCodeInformation(0) + "_" + Utilities.normaliseString(mCDAssociation.getName() , Constantes.LOWER) ) ;
} else {
/*
* Traiter le cas des nom d'attributs utilisés plusieurs fois
*/
String nomTable = Utilities.normaliseString( mcdEntiteAssociee.getName(), Constantes.LOWER) ;
String ws_foreignkey = ( nomTable+"_"+ mcdEntiteAssociee.getCodeInformation(0) ).toLowerCase() ;
ent.addForeignKey(ws_foreignkey, nomTable) ; // Bug #520410
if ( ws_typeAssociation.equals( Constantes.ZERO_UN ) )
ent.setForeignKeyCanBeNull ( true ) ;
else
if ( ws_lien.getCardMin().equals("0")) {
ent.setForeignKeyCanBeNull ( true ) ;
} else
ent.setForeignKeyCanBeNull ( false ) ;
ent.addInformation(ws_foreignkey) ;
if (ws_typeAssociation.equals( Constantes.ZERO_N ) )
return true ;
}
}
if ( k < 1 )
mpdLien.setElement(ent, Constantes.MCDENTITE2);
else
mpdLien.setElement(ent, Constantes.MCDENTITE1);
}
if ( vLinks.size () == 1 ) { //liaison reflexive
if ( ws_typeAssociation.equals( Constantes.ZERO_UN ) ) {
MCDAssociation mCDAssociation = ( MCDAssociation ) ( ( MCDLien ) vLinks.get(0) ).getElement ( Constantes.MCDENTITE1 ) ;
MCDLien ws_lien = ( MCDLien ) vLinks.get( 0 ) ;
mcdEntiteAssociee = ( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 ) ;
ent.addInformation( mcdEntiteAssociee.getCodeInformation(0) + "_" + Utilities.normaliseString(mCDAssociation.getName() , Constantes.LOWER) ) ;
}
} else {
if ( ! traitement ) {
// cas des relations ( 0, 1 ) - ( 0 , 1 )
//traitement de la "1ere" entite
MCDLien ws_lien = ( MCDLien ) vLinks.get( 0 ) ;
MCDEntite mcdEntite = ( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 ) ;
String nameEntite = mcdEntite.getName() ;
MCDLien ws_lienAssocie = ( MCDLien ) vLinks.get( 1 ) ;
mcdEntiteAssociee = ( MCDEntite ) ws_lienAssocie.getElement( Constantes.MCDENTITE2 ) ;
ent = mpd.getMPDEntite(Utilities.normaliseString (nameEntite , Constantes.LOWER));
/*
* Bug #520410 - voir test-007.asi
ent.addForeignKey(mcdEntiteAssociee.getCodeInformation(0), Utilities.normaliseString( mcdEntiteAssociee.getName(), Constantes.LOWER) ) ;
ent.addInformation( mcdEntiteAssociee.getCodeInformation(0) ) ;
*/
mpdLien.setElement(ent, Constantes.MCDENTITE1);
//traitement de la "2eme" entite
numEntite = 1 ;
ws_lien = ( MCDLien ) vLinks.get( 1 ) ;
mcdEntite = ( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 ) ;
nameEntite = mcdEntite.getName() ;
ws_lienAssocie = ( MCDLien ) vLinks.get( 0 ) ;
mcdEntiteAssociee = ( MCDEntite ) ws_lienAssocie.getElement( Constantes.MCDENTITE2 ) ;
ent = mpd.getMPDEntite(Utilities.normaliseString (nameEntite , Constantes.LOWER));
ent.addForeignKey(mcdEntiteAssociee.getCodeInformation(0), Utilities.normaliseString( mcdEntiteAssociee.getName(), Constantes.LOWER) ) ;
ent.addInformation( mcdEntiteAssociee.getCodeInformation(0)) ;
mpdLien.setElement(ent, Constantes.MCDENTITE2 );
}
}
}
if ( ws_typeAssociation.equals ( Constantes.UN_N ) || ws_typeAssociation.equals ( Constantes.ZERO_N ) ) {
mpdLien = new MPDLien();
List<MCDLien> vLinks = ( (MCDAssociation) obj ).links ; // Les liens de l'association sont dans un vecteur
for ( int k=0; k < vLinks.size() ; k++ ) {
// récupération des différents liens de l'association
mcdLienAssociation = ( MCDLien ) ( vLinks.get( k ) ) ;
MCDEntite mcdEntite = ( MCDEntite ) mcdLienAssociation.getElement ( Constantes.MCDENTITE2 ) ;
ent = mpd.getMPDEntite(Utilities.normaliseString (mcdEntite.getName() , Constantes.LOWER));
if ( mcdLienAssociation.getCardMin().equals( "0" ) )
ent.setForeignKeyCanBeNull ( true ) ;
else
ent.setForeignKeyCanBeNull ( false ) ;
if ( ! mcdLienAssociation.getCardMax().equals( "N" ) ) {
// traitement des relations ternaires
if ( isPartOfTernaire ( mcdLienAssociation ) )
ent.addInformation(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0)+ "_" +
Utilities.normaliseString(((MCDAssociation) obj).getName() , Constantes.LOWER) );
else {
if ( ! ent.existInformation(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0) )) {
ent.addInformation(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0));
ent.addForeignKey(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0) ,
Utilities.normaliseString(getMCDEntite((MCDAssociation) obj, "N").getName(), Constantes.LOWER));
} else {
ent.addInformation(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0)+ "_" +
Utilities.normaliseString(((MCDAssociation) obj).getName() , Constantes.LOWER) );
ent.addForeignKey(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0) + "_" +
Utilities.normaliseString( ((MCDAssociation) obj).getName(), Constantes.LOWER) ,
Utilities.normaliseString(getMCDEntite((MCDAssociation) obj, "N").getName(), Constantes.LOWER));
}
}
if ( ! ws_typeAssociation.equals ( Constantes.ZERO_N ) ) {
if ( isPartOfTernaire ( mcdLienAssociation ) ) {
MCDAssociation mCDAssociation = null ;
if ( vLinks.size() == 1 ) { //liaison reflexive
mCDAssociation = ( MCDAssociation ) ( ( MCDLien ) vLinks.get(0) ).getElement ( Constantes.MCDENTITE2 ) ;
ent.addInformation( mcdEntite.getCodeInformation(0) + "_" + Utilities.normaliseString(mCDAssociation.getName() , Constantes.LOWER) ) ;
}
ent.addForeignKey(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0) + "_" +
Utilities.normaliseString( ((MCDAssociation) obj).getName(), Constantes.LOWER) ,
Utilities.normaliseString(getMCDEntite((MCDAssociation) obj, "N").getName(), Constantes.LOWER));
} else
ent.addForeignKey(getMCDEntite((MCDAssociation) obj, "N").getCodeInformation(0),
Utilities.normaliseString(getMCDEntite((MCDAssociation) obj, "N").getName(), Constantes.LOWER));
}
} else {
MCDAssociation mCDAssociation = null ;
if ( vLinks.size() == 1 ) { //liaison reflexive
mCDAssociation = ( MCDAssociation ) ( ( MCDLien ) vLinks.get(0) ).getElement ( Constantes.MCDENTITE2 ) ;
ent.addInformation( mcdEntite.getCodeInformation(0) + "_" + Utilities.normaliseString(mCDAssociation.getName() , Constantes.LOWER) ) ;
}
}
mpdLien.setElement(ent, Constantes.MCDENTITE2);
}
ent = mpd.getMPDEntite(Utilities.normaliseString(
getMCDEntite((MCDAssociation) obj, "N").getName(),
Constantes.LOWER));
mpdLien.setElement(ent, Constantes.MCDENTITE1 );
mpd.addLien(mpdLien);
}
}
}
/*
* Suppression des MPDEntite ne contenant qu'un identifiant
*/
/*
* Vector elementsToDel = new Vector(); for (Enumeration e =
* mpd.elementsZElements(); e.hasMoreElements();) { ent = (MPDEntite)
* e.nextElement(); if (ent.sizeInformation() == 1 &&
* ent.sizeIdentifiant() == 1) {
*
* for (Enumeration e2 = mpd.elementsZElements(); e .hasMoreElements();) {
* ent2 = (MPDEntite) e.nextElement();
* ent2.removeForeignKey(ent.getCodeInformation(0)); }
* elementsToDel.add(ent); } } for (Enumeration e =
* elementsToDel.elements(); e.hasMoreElements();) {
* mpd.removeElement((ZElement) e.nextElement()); }
*/
return true;
}
private Boolean isPartOfTernaire ( MCDLien mcdLien ) {
// la cardinalité est 1,1 sur ce lien
Boolean ternaire = false ;
MCDAssociation association = ( MCDAssociation ) mcdLien.getElement ( Constantes.MCDENTITE1 ) ;
MCDLien entiteLink = null, ws_lien = null ;
String v0_name, v1_name, entite0_name = null , entite1_name = null ;
MCDObjet obj ;
List<MCDLien> vLinks = null, vLinks_rech = null ;
// on récupère l'entité associée
vLinks = association.links ;
for ( int k=0; k < vLinks.size() ; k++ )
if ( ! ( ( MCDLien ) vLinks.get( k ) ).equals( mcdLien ) ) {
entiteLink = ( MCDLien ) vLinks.get( k ) ;
entite0_name = (( MCDEntite ) mcdLien.getElement( Constantes.MCDENTITE2 )).getName () ;
entite1_name = (( MCDEntite ) entiteLink.getElement( Constantes.MCDENTITE2 )).getName () ;
break ;
}
// on cherche une autre association reliant les 2 entités
for (Iterator<ZElement> e = this.elementsZElements(); e.hasNext();) {
obj = (MCDObjet) e.next();
if (obj instanceof MCDAssociation) {
vLinks_rech = ( (MCDAssociation) obj ).links ; // Les liens de l'association sont dans un vecteur
if ( ! obj.equals( association ) ) {
ws_lien = ( MCDLien ) vLinks_rech.get( 0 ) ;
v0_name = (( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 )).getName () ;
ws_lien = ( MCDLien ) vLinks.get( 1 ) ;
v1_name = (( MCDEntite ) ws_lien.getElement( Constantes.MCDENTITE2 )).getName () ;
if ( ( v0_name.equals ( entite0_name ) && v1_name.equals ( entite1_name ) ) ||
( v0_name.equals ( entite1_name ) && v1_name.equals ( entite0_name ) ) ) {
ternaire = true ;
break ;
}
}
}
}
ternaire = false ; // je sais ... un bug en suspens pour ceux qui ont suivi le pb des relations ternaires
return ternaire ;
}
}