Package org.analyse.merise.mcd.composant

Source Code of org.analyse.merise.mcd.composant.MCDComponent

/*
* 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.getElementConstantes.MCDENTITE1 ).equals(ass) )
        return (MCDEntite) (lien.getElementConstantes.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.getElementConstantes.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  ;
  }
}
TOP

Related Classes of org.analyse.merise.mcd.composant.MCDComponent

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.