|
From: <had...@us...> - 2009-05-15 14:12:43
|
Revision: 4780
http://fudaa.svn.sourceforge.net/fudaa/?rev=4780&view=rev
Author: hadouxad
Date: 2009-05-15 14:12:41 +0000 (Fri, 15 May 2009)
Log Message:
-----------
* Algo de validation du graphe: package org.fudaa.dodico.crue.validation
o mise en code de l'algo de parcours en profondeur pour les noeuds, puis pour les branches
* Correction crue 9 DC
o ajout de l'algo de gestion des profils interpoles (cf ci dessous).
* gestion des erreurs pour la carte strirefH
* probl?\195?\169matique pour la deuxi?\195?\168me mod?\195?\169lisation:
foutre des profils interpol?\195?\169s entre les profils classiques pour les branches,comme les distances inter-profils ne sont pas indiqu?\195?\169es pour les profils interpol?\195?\169s, on ne peut pas savoir au niveau de la lecture des branches si
le profil est interpol?\195?\169 ou non, il faudra attendre d'avoir lu les profils pour savoir lesquels le sont.
* pour la deuxieme mod?\195?\169lisation, les distmax, il faut ajouter les profils interpol?\195?\169s entre chaque profils toutes les distmax distances. cela est moins probl?\195?\169matique.
Algorithmiquement, voila comment je m'en sors:
pour la deuxieme mod?\195?\169lisation: je cr?\195?\169e des section profils, et je rectifis lorsque je tomberais sur les cartes PROFINT dans la partie profil, je saurais que ces profils doivent etres modifies en section interpoles
(j'avais fait pareil pour idem)
pourla premiere modelisation:
apres remplissage des sections de la branche st venant:
pour chaque relationEmh contenant une section I
si la distmax<|section(I).xpos - section(I+1).xpos|
alors:
nbSectionToAdd= (partie inferieur)|section(I).xpos - section(I+1).xpos|/distmax
pour k de 0 a nbSectionToAdd-1
creer section interpolee de nom: S+NomBranche+_+(k *distmax +section(I).xpos )
et de xpos =(k *distmax +section(I).xpos )
ajouter relation avec sectionInterpol?\195?\169?\195?\169 a la position (I+k+1)
Modified Paths:
--------------
trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileReader.java
trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileWriter.java
trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/metier/emh/EMH.java
trunk/soft/fudaa-crue/dodico/src/main/resources/org/fudaa/dodico/crue/io/adrienMessages.properties
trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/common/CrueCommomImplementation.java
trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/projet/CrueProjet.java
Added Paths:
-----------
trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/validation/
trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/validation/EMHValidatorModele.java
trunk/soft/fudaa-crue/dodico/src/test/java/org/fudaa/dodico/crue/io/TestCrueValidationModele.java
Modified: trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileReader.java
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileReader.java 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileReader.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -12,7 +12,56 @@
import org.fudaa.dodico.crue.io.dao.DonPrtCIniCasierProfil;
import org.fudaa.dodico.crue.metier.CrueData;
import org.fudaa.dodico.crue.metier.CrueDataImpl;
-import org.fudaa.dodico.crue.metier.emh.*;
+import org.fudaa.dodico.crue.metier.emh.CatEMHBranche;
+import org.fudaa.dodico.crue.metier.emh.CatEMHCasier;
+import org.fudaa.dodico.crue.metier.emh.CatEMHNoeud;
+import org.fudaa.dodico.crue.metier.emh.CatEMHSection;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrt;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheBarrageFilEau;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheBarrageGenerique;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheNiveauxAssocies;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheOrifice;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBranchePDC;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSeuilLateral;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSeuilTransversal;
+import org.fudaa.dodico.crue.metier.emh.DonFrt;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoProfilCasier;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoProfilSection;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoSectionIdem;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheBarrageFilEau;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheBarrageGenerique;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheNiveauxAssocies;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheOrifice;
+import org.fudaa.dodico.crue.metier.emh.EMHBranchePdc;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSeuilLateral;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSeuilTransversal;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheStrickler;
+import org.fudaa.dodico.crue.metier.emh.EMHCasierProfil;
+import org.fudaa.dodico.crue.metier.emh.EMHNoeudNiveauContinu;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionIdem;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionInterpolee;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionProfil;
+import org.fudaa.dodico.crue.metier.emh.ElemOrifice;
+import org.fudaa.dodico.crue.metier.emh.ElemSeuil;
+import org.fudaa.dodico.crue.metier.emh.ElemSeuilAvecPdc;
+import org.fudaa.dodico.crue.metier.emh.EvolutionFF;
+import org.fudaa.dodico.crue.metier.emh.LitNomme;
+import org.fudaa.dodico.crue.metier.emh.LitNumerote;
+import org.fudaa.dodico.crue.metier.emh.LitUtile;
+import org.fudaa.dodico.crue.metier.emh.LoiFF;
+import org.fudaa.dodico.crue.metier.emh.OrdPrtGeoModeleBase;
+import org.fudaa.dodico.crue.metier.emh.ParamNumModeleBase;
+import org.fudaa.dodico.crue.metier.emh.PtEvolutionFF;
+import org.fudaa.dodico.crue.metier.emh.PtProfil;
+import org.fudaa.dodico.crue.metier.emh.PtZK;
+import org.fudaa.dodico.crue.metier.emh.Regle;
+import org.fudaa.dodico.crue.metier.emh.RelationEMH;
+import org.fudaa.dodico.crue.metier.emh.StriRefC;
+import org.fudaa.dodico.crue.metier.emh.StriRefZ;
+import org.fudaa.dodico.crue.metier.emh.VariableOrdonnee;
import org.fudaa.dodico.crue.metier.helper.EMHBrancheHelper;
import org.fudaa.dodico.crue.metier.helper.EMHHelper;
import org.fudaa.dodico.crue.metier.helper.EMHNoeudHelper;
@@ -325,9 +374,29 @@
lireSuite();
} else if (element.toUpperCase().equals(CrueIODico.PROFINT)) {
- // TODO A FAIRE APRES RETOURS CNR
+
final String nomProfil = in_.stringField(1);
sectionCree = createSectionProfilClassique(metier, nomProfil);
+
+ // -- il faut transformer cette section en interpole: on le fait maintenant car dans la methode cela ne change
+ // rien
+ // car c'est au niveau de la branche que l'on cree les sections.
+
+ final EMHSectionInterpolee newSection = new EMHSectionInterpolee(sectionCree.getNom());
+
+ EMHBrancheHelper.replaceSectioninAllConnectedBranche(sectionCree, newSection, metier.getBranches());
+ metier.getSections().remove(sectionCree);
+
+ // -- on remplace les relations et les infos emh --//
+ if (sectionCree.getListeInfosEMH() != null) {
+ newSection.setListeInfosEMH(sectionCree.getListeInfosEMH());
+ }
+ if (sectionCree.getRelationsAvecEMH() != null) {
+ newSection.setRelationsAvecEMH(sectionCree.getRelationsAvecEMH());
+ }
+
+ metier.add(newSection);
+
} else if (element.toUpperCase().equals(CrueIODico.PROFRECT)) {
// TODO pour FICHIER DEXP non présent dans V0
// final String nomProfil = in_.stringField(1);
@@ -437,6 +506,7 @@
final String nomProfil = id;
sectionProfil = EMHSectionHelper.findByReference(nomProfil, metier);
if (sectionProfil == null) {
+
sectionProfil = new EMHSectionProfil(nomProfil);
metier.add(sectionProfil);
}
@@ -674,7 +744,7 @@
* @param metier
* @throws IOException
*/
- public void readFrottements(final CrueData metier) throws IOException {
+ public void readFrottements(final CrueData metier) throws CrueNotSupportedException, IOException {
metier.setFrottements(new ArrayList<DonFrt>());
while (CrueIODico.appartientFrottementsCarte(in_.getLine())) {
@@ -692,16 +762,18 @@
} else if (element.toUpperCase().equals(CrueIODico.STRIREFH)) {
// STRIREFH(o) "nom_strickler" h1 k1 h2 k2... (nom du strickler, et couples h/k, h étant la hauteur par rapport
// au point le plus bas du profil)
- final String nomFrot = in_.stringField(1);
- final StrRefY frt = new StrRefY(nomFrot);
- frt.setPtZY(new ArrayList<PtZY>());
- for (int i = 2; i < in_.getNumberOfFields(); i++) {
- final double valX = in_.doubleField(i++);
- final double valY = in_.doubleField(i);
- frt.addPtZY(new PtZY(valX, valY));
+ // final String nomFrot = in_.stringField(1);
+ // final StrRefY frt = new StrRefY(nomFrot);
+ // frt.setPtZY(new ArrayList<PtZY>());
+ // for (int i = 2; i < in_.getNumberOfFields(); i++) {
+ // final double valX = in_.doubleField(i++);
+ // final double valY = in_.doubleField(i);
+ // frt.addPtZY(new PtZY(valX, valY));
+ //
+ // }
+ // metier.getFrottements().add(frt);
- }
- metier.getFrottements().add(frt);
+ throw new CrueNotSupportedException(CrueIODico.STRIREFH, in_.getLineNumber());
} else if (element.toUpperCase().equals(CrueIODico.STRIREFZ)) {
// STRIREFH(o) "nom_strickler" h1 k1 h2 k2... (nom du strickler, et couples h/k, h étant la hauteur par rapport
@@ -1031,6 +1103,7 @@
// -- la donnée DPTG de st venant --//
DonPrtGeoBrancheSaintVenant dataDPTG = null;
String nomSectionPilote = null;
+ double distMAX = 0;
// -- la liste des sections branches --//
final List<List<CatEMHSection>> listeSectionBranche = new ArrayList<List<CatEMHSection>>();
// -- tant qu'on est pas arrivé à une autre branche ou une autre definition, on lit les infos de la branche --//
@@ -1069,6 +1142,8 @@
if (typeLigne.toUpperCase().equals(CrueIODico.BRANCHE_DISTMAX)) {
// TODO: DISTMAX a gerer , demander CNR, le dico dit abandonné dans crue 10...--//
+ distMAX = in_.doubleField(1);
+
} else
// -- coefficients cconv --//
if (typeLigne.toUpperCase().equals(CrueIODico.BRANCHE_CCONV)) {
@@ -1131,8 +1206,6 @@
errorCarteNotRecognized(typeLigne);
}
- // TODO Carole gérer les parametres suivants ....
-
// -- on lit la suite en passant les commentaires sans mot clef --//
lireSuite();
lineRead = in_.getLine();
@@ -1142,6 +1215,10 @@
completeBrancheWithInfosRead(metier, branche, dataDCSP, listeDistance, listeCconv, listeCpond, listeCdiv,
listeSectionBranche);
+ if (distMAX != 0) {
+ completeSaintVenantWithDistMAx(branche, distMAX, metier);
+ }
+
if (nomSectionPilote != null) {
CatEMHSection pilote = EMHSectionHelper.findByReference(nomSectionPilote, metier);
if (pilote == null) {
@@ -1155,6 +1232,81 @@
}
/**
+ * Cas particulier de Branche st venant: pour la valeur DISTMAX: DISTMAX(f, u) distmax (Distance max entre 2 profils.
+ * Crée les profils interpolés nécessaires) Cette valeur distmax indique la distance max entre chaque profil, donc si
+ * cette distance n'est pas respectee, il faut ajouter des profil interpoles avec pour nom:
+ * S+NomBranche+_+distanceParcourue.
+ *
+ * @param branche
+ */
+ public void completeSaintVenantWithDistMAx(EMHBrancheSaintVenant branche, double distmax, CrueData data) {
+
+ for (int i = 0; i < branche.getRelationsAvecEMH().size(); i++) {
+
+ RelationEMH relation1 = branche.getRelationsAvecEMH().get(i);
+
+ // -- si la relation concerne les sections --//
+ if (relation1.getEmh() instanceof CatEMHSection) {
+ RelationEMH relation2 = null;
+ // -- on recherche la prochaine relation --//
+ for (int j = i + 1; j < branche.getRelationsAvecEMH().size() && relation2 == null; j++) {
+ if (branche.getRelationsAvecEMH().get(j).getEmh() instanceof CatEMHSection) {
+ relation2 = branche.getRelationsAvecEMH().get(j);
+ }
+ }
+
+ if (relation2 == null) { return; }
+
+ double xpos1 = EMHHelper.getXpSection(relation1);
+ double xpos2 = EMHHelper.getXpSection(relation2);
+
+ if (distmax < Math.abs(xpos1 - xpos2)) {
+
+ // -- il faut ajouter des profils interpolées --//
+
+ // -- etape 1: on compte combien on en ajoute --//
+ int nbProfilsToAdd = (int) Math.floor(Math.abs(xpos1 - xpos2) / distmax) - 1;
+
+ // -- on creer une section interpolee pour chaque besoin et on l'ajoute dans cruedata puis dans les relations
+ // branche --//.
+ for (int k = 0; k < nbProfilsToAdd; k++) {
+ double xpos = xpos1 + (k + 1) * distmax;
+ String nom = "S" + branche.getNom() + "_" + xpos;
+ EMHSectionInterpolee interpol = new EMHSectionInterpolee(nom);
+
+ interpol.setNom(nom);
+
+ double coefPond = 1;
+ double coefConv = 1;
+ double coefDiv = 1;
+ final HashMap<String, Object> map = new HashMap<String, Object>();
+ map.put(EMHHelper.Pos_section, "Interne");
+ map.put(EMHHelper.Xp_section, xpos);
+ map.put(EMHHelper.Coeff_Pond, coefPond);
+ map.put(EMHHelper.Coeff_Div, coefDiv);
+ map.put(EMHHelper.Coeff_Conv, coefConv);
+
+ RelationEMH relation = new RelationEMH(interpol, map);
+ // -- ajout dans metier --//
+ data.add(interpol);
+
+ // -- ajout de la relation a l'emplacement k+1 a partir de i--//
+ branche.getRelationsAvecEMH().add((i + k + 1), relation);
+
+ }
+
+ // -- on translate i de k+1 itérations pour revenir a l'indice de la relation2 --//
+ i += nbProfilsToAdd;
+ // ATTENTION, le k+1 ici est indirect, car le +1 sera ajouté par la boucle for.
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
* Creer une branche seuil transversal. 2
*
* @param metier
@@ -1941,11 +2093,15 @@
// -- en fonction des parametres lus, ajoute les bonnes relations EMH --//
// -- DISTANCE --//
- if (listeTotaleDistance.size() == 1) {
+ if (indiceSection == 0) {
+ // on laisse le xpos a 0: donc sumDistanceTotaleXP ne doit pas etre additionne.
+ } else if (listeTotaleDistance.size() == 1) {
sumDistanceTotaleXP += listeTotaleDistance.get(0);
- } else if (listeTotaleDistance.size() > indiceSection) {
- sumDistanceTotaleXP += listeTotaleDistance.get(indiceSection);
+ } else if (listeTotaleDistance.size() > indiceSection - 1) {
+ // -- la liste des distantce est inter-profil avec le premier profil a distance=0.
+ // donc on commence a positionner la deuxieme section a la position indiceSection-1.
+ sumDistanceTotaleXP += listeTotaleDistance.get(indiceSection - 1);
}
// -- cconv --//
Modified: trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileWriter.java
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileWriter.java 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/io/neuf/DCFileWriter.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -10,7 +10,50 @@
import org.fudaa.dodico.crue.io.dao.CrueHelper;
import org.fudaa.dodico.crue.io.dao.DonPrtCIniCasierProfil;
import org.fudaa.dodico.crue.metier.CrueData;
-import org.fudaa.dodico.crue.metier.emh.*;
+import org.fudaa.dodico.crue.metier.emh.CatEMHBranche;
+import org.fudaa.dodico.crue.metier.emh.CatEMHCasier;
+import org.fudaa.dodico.crue.metier.emh.CatEMHNoeud;
+import org.fudaa.dodico.crue.metier.emh.CatEMHSection;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrt;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheBarrageFilEau;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheBarrageGenerique;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheNiveauxAssocies;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheOrifice;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBranchePDC;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSeuilLateral;
+import org.fudaa.dodico.crue.metier.emh.DonCalcSansPrtBrancheSeuilTransversal;
+import org.fudaa.dodico.crue.metier.emh.DonFrt;
+import org.fudaa.dodico.crue.metier.emh.DonFrtList;
+import org.fudaa.dodico.crue.metier.emh.DonPrtCIni;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeo;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoProfilCasier;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoProfilSection;
+import org.fudaa.dodico.crue.metier.emh.DonPrtGeoSectionIdem;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheBarrageFilEau;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheBarrageGenerique;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheNiveauxAssocies;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheOrifice;
+import org.fudaa.dodico.crue.metier.emh.EMHBranchePdc;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSaintVenant;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSeuilLateral;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheSeuilTransversal;
+import org.fudaa.dodico.crue.metier.emh.EMHBrancheStrickler;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionIdem;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionInterpolee;
+import org.fudaa.dodico.crue.metier.emh.EMHSectionProfil;
+import org.fudaa.dodico.crue.metier.emh.ElemOrifice;
+import org.fudaa.dodico.crue.metier.emh.ElemSeuilAvecPdc;
+import org.fudaa.dodico.crue.metier.emh.LitNumerote;
+import org.fudaa.dodico.crue.metier.emh.LitUtile;
+import org.fudaa.dodico.crue.metier.emh.PtEvolutionFF;
+import org.fudaa.dodico.crue.metier.emh.PtProfil;
+import org.fudaa.dodico.crue.metier.emh.Regle;
+import org.fudaa.dodico.crue.metier.emh.RelationEMH;
+import org.fudaa.dodico.crue.metier.emh.StrRefY;
+import org.fudaa.dodico.crue.metier.emh.StriRefC;
+import org.fudaa.dodico.crue.metier.emh.StriRefZ;
import org.fudaa.dodico.crue.metier.helper.EMHHelper;
import org.fudaa.dodico.crue.metier.helper.RegleHelper;
@@ -350,8 +393,8 @@
for (final CatEMHSection section : metier.getSections()) {
- if (section instanceof EMHSectionProfil) {
- final EMHSectionProfil profil = (EMHSectionProfil) section;
+ if (section instanceof EMHSectionProfil || section instanceof EMHSectionInterpolee) {
+ final CatEMHSection profil = section;
fortranWriter_.stringField(0, CrueIODico.PROFIL);
fortranWriter_.stringField(1, profil.getNom());
Modified: trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/metier/emh/EMH.java
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/metier/emh/EMH.java 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/metier/emh/EMH.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -91,7 +91,7 @@
}
/**
- * Ajoute une infos (DSCP)
+ * Ajoute une infos (DCSP)
*
* @param dataCalcul
*/
Added: trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/validation/EMHValidatorModele.java
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/validation/EMHValidatorModele.java (rev 0)
+++ trunk/soft/fudaa-crue/dodico/src/main/java/org/fudaa/dodico/crue/validation/EMHValidatorModele.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -0,0 +1,264 @@
+package org.fudaa.dodico.crue.validation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.fudaa.ctulu.CtuluAnalyze;
+import org.fudaa.dodico.crue.metier.CrueData;
+import org.fudaa.dodico.crue.metier.emh.CatEMHBranche;
+import org.fudaa.dodico.crue.metier.emh.CatEMHNoeud;
+
+/**
+ * Algorithmes de validations du modele.
+ *
+ * @author Adrien Hadoux
+ */
+public class EMHValidatorModele {
+
+ /**
+ * Methode qui teste la connexité du modele et retourne true ou false,
+ *
+ * @param data
+ * @param analyzer analyzer
+ * @return
+ */
+ public static boolean validateConnexite(CrueData data, CtuluAnalyze analyzer) {
+ boolean validate = false;
+
+ // -- premeire verification: tous les noeuds sont affectées --//
+ validate = IsNoeudsTousAffectes(data, analyzer);
+
+ if (validate) {
+
+ // -- on verifie que toutes les branches ont un noeud --//.
+ validate = IsBranchesConnexes(data, analyzer);
+ }
+
+ return validate;
+ }
+
+ /**
+ * Verifie que toutes les branches soient affectees.
+ *
+ * @param data
+ * @param analyzer
+ * @return true si le graphe est connexe.
+ */
+ public static boolean IsBranchesConnexes(CrueData data, CtuluAnalyze analyzer) {
+
+ List<CatEMHNoeud> lstNoeudsATester = new ArrayList<CatEMHNoeud>(1);
+
+ List<CatEMHBranche> lstBranchesRestantes = remplirBranchesRestantesActives(data.getBranches());
+
+ // 1) Choisir un nœud de départ connecté à au moins une branche active. Il est stocké dans lstNoeudsATester.
+ CatEMHNoeud findNoeudDep = findNoeudDepart(data);
+
+ if (findNoeudDep == null) { return false; }
+ lstNoeudsATester.add(findNoeudDep);
+
+ // 2) Tant qu’il existe au moins un élément dans lstNoeudsATester :
+ while (lstNoeudsATester.size() > 0) {
+ // 2.1) Dépiler un élément de lstNoeudsATester (le supprimer de la liste) et le stocker dans NoeudCourant.
+ CatEMHNoeud noeudCourant = lstNoeudsATester.remove(0);
+
+ // 2.2) Tant qu’il existe une branche connectée à NoeudCourant et qui figure dans lstBranchesRestantes :
+ List<CatEMHBranche> lstBranchesContenantNoeud = findAllBranchesConnectedToNode(lstBranchesRestantes, noeudCourant);
+
+ while (lstBranchesContenantNoeud.size() > 0) {
+ // 2.2.1) Récupérer une telle branche et la stocker dans BrancheCourante.
+ CatEMHBranche brancheCourante = lstBranchesContenantNoeud.remove(0);
+
+ // 2.2.2) Récupérer le nœud situé à l’autre extrémité de BrancheCourante (par rapport à NoeudCourant) et le
+ // stocker
+ // dans lstNoeudsATester (s’il n’y figure pas déjà).
+ CatEMHNoeud nouveauNoeud = brancheCourante.getNoeudAmont();
+ if (nouveauNoeud != noeudCourant) {
+ lstNoeudsATester.add(nouveauNoeud);
+ } else {
+ nouveauNoeud = brancheCourante.getNoeudAval();
+ lstNoeudsATester.add(nouveauNoeud);
+ }
+
+ // 2.2.3) Supprimer BrancheCourante de lstBranchesRestantes.
+ lstBranchesRestantes.remove(brancheCourante);
+
+ }
+
+ }
+
+ if (lstBranchesRestantes.size() > 0) {
+ analyzer.addError("error.validationModele.branchesNonAffectes",
+ createMapBranchesNonAffectes(lstBranchesRestantes));
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Cree la liste de branches Active a partir de la liste de branches totales.
+ *
+ * @param lstBranchesTotales
+ * @return
+ */
+ public static List<CatEMHBranche> remplirBranchesRestantesActives(List<CatEMHBranche> lstBranchesTotales) {
+ List<CatEMHBranche> listeBranches = new ArrayList<CatEMHBranche>();
+
+ for (CatEMHBranche branche : lstBranchesTotales) {
+ if (branche.isActive()) {
+ listeBranches.add(branche);
+ }
+ }
+ return listeBranches;
+
+ }
+
+ /**
+ * Retrouve toutes les branches connectees au noeud.
+ *
+ * @param lstBranchesRestantes
+ * @param noeud
+ * @return
+ */
+ public static List<CatEMHBranche> findAllBranchesConnectedToNode(List<CatEMHBranche> lstBranchesRestantes,
+ CatEMHNoeud noeud) {
+ List<CatEMHBranche> listeConnected = new ArrayList<CatEMHBranche>();
+
+ for (CatEMHBranche branche : lstBranchesRestantes) {
+ if (branche.isActive()) {
+ CatEMHNoeud noeudAmont = branche.getNoeudAmont();
+ if (noeudAmont == noeud) {
+
+ listeConnected.add(branche);
+
+ } else {
+ CatEMHNoeud noeudAval = branche.getNoeudAval();
+ if (noeudAval == noeud) {
+
+ listeConnected.add(branche);
+
+ }
+ }
+ }
+ }
+
+ return listeConnected;
+ }
+
+ /**
+ * Methode qui recherche dans la liste des branches le premier noeud d'une branche active.
+ *
+ * @param data
+ * @return
+ */
+ public static CatEMHNoeud findNoeudDepart(CrueData data) {
+
+ for (int i = 0; i < data.getBranches().size(); i++) {
+ if (data.getBranches().get(i).isActive()) {
+
+ CatEMHNoeud findNoeudDep = data.getBranches().get(i).getNoeudAmont();
+ if (findNoeudDep != null) { return findNoeudDep; }
+ findNoeudDep = data.getBranches().get(i).getNoeudAval();
+ if (findNoeudDep != null) { return findNoeudDep; }
+
+ }
+
+ }
+ return null;
+ }
+
+ /**
+ * Verifie que tous les noeuds soient affectés a au moins une branche.
+ *
+ * @param data
+ * @param analyzer
+ * @return
+ */
+ public static boolean IsNoeudsTousAffectes(CrueData data, CtuluAnalyze analyzer) {
+
+ List<CatEMHNoeud> listeNoeudsNonAffectes = new ArrayList<CatEMHNoeud>(data.getNoeuds().size());
+
+ // pourri collections...
+ // Collections.copy(listeNoeudsNonAffectes, data.getNoeuds());
+
+ for (CatEMHNoeud node : data.getNoeuds()) {
+ listeNoeudsNonAffectes.add(node);
+ }
+
+ for (CatEMHBranche branche : data.getBranches()) {
+ if (branche.isActive()) {
+ CatEMHNoeud noeudAmont = branche.getNoeudAmont();
+ if (noeudAmont != null) {
+
+ listeNoeudsNonAffectes.remove(noeudAmont);
+
+ } else {
+ HashMap<String, Object> map = new HashMap<String, Object>();
+ map.put("branche", branche.getNom());
+ analyzer.addError("error.validationModele.noeudAmontManquant", map);
+ return false;
+ }
+ CatEMHNoeud noeudAval = branche.getNoeudAval();
+ if (noeudAval != null) {
+
+ listeNoeudsNonAffectes.remove(noeudAval);
+
+ } else {
+ HashMap<String, Object> map = new HashMap<String, Object>();
+ map.put("branche", branche.getNom());
+ analyzer.addError("error.validationModele.noeudAvalManquant", map);
+ return false;
+ }
+ }
+ }
+ if (listeNoeudsNonAffectes.size() != 0) {
+ analyzer.addError("error.validationModele.noeudNonAffectes", createMapNoeudsNonAffectes(listeNoeudsNonAffectes));
+ }
+
+ return listeNoeudsNonAffectes.size() == 0;
+ }
+
+ /**
+ * Creer la map avec la liste des noeuds non affectes.
+ *
+ * @param listeNoeudsNonAffectes
+ * @return
+ */
+ public static Map<String, Object> createMapNoeudsNonAffectes(List<CatEMHNoeud> listeNoeudsNonAffectes) {
+ String key = "noeuds";
+
+ String liste = "";
+
+ for (CatEMHNoeud noeud : listeNoeudsNonAffectes) {
+ liste += " " + noeud.getNom();
+ }
+
+ HashMap<String, Object> map = new HashMap<String, Object>();
+ map.put(key, liste);
+ return map;
+
+ }
+
+ /**
+ * Creer la map avec la liste des branches non affectes.
+ *
+ * @param listeBranchesNonAffectes
+ * @return
+ */
+ public static Map<String, Object> createMapBranchesNonAffectes(List<CatEMHBranche> listeBranchesNonAffectes) {
+ String key = "branches";
+
+ String liste = "";
+
+ for (CatEMHBranche branche : listeBranchesNonAffectes) {
+ liste += " " + branche.getNom();
+ }
+
+ HashMap<String, Object> map = new HashMap<String, Object>();
+ map.put(key, liste);
+ return map;
+
+ }
+}
Modified: trunk/soft/fudaa-crue/dodico/src/main/resources/org/fudaa/dodico/crue/io/adrienMessages.properties
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/main/resources/org/fudaa/dodico/crue/io/adrienMessages.properties 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/dodico/src/main/resources/org/fudaa/dodico/crue/io/adrienMessages.properties 2009-05-15 14:12:41 UTC (rev 4780)
@@ -1,3 +1,7 @@
#Mettre les traductions ici
#Ne pas faire attention aux accents les laisser mais ne pas les traduire en UTF-8
-Test=Test
\ No newline at end of file
+Test=Test
+error.validationModele.noeudNonAffectes = Erreur, il existe des noeuds isoles: {noeuds}
+error.validationModele.noeudAmontManquant= Erreur, il manque un noeud amont pour la branche {branche}
+error.validationModele.noeudAvalManquant= Erreur, il manque un noeud aval pour la branche {branche}
+
Added: trunk/soft/fudaa-crue/dodico/src/test/java/org/fudaa/dodico/crue/io/TestCrueValidationModele.java
===================================================================
--- trunk/soft/fudaa-crue/dodico/src/test/java/org/fudaa/dodico/crue/io/TestCrueValidationModele.java (rev 0)
+++ trunk/soft/fudaa-crue/dodico/src/test/java/org/fudaa/dodico/crue/io/TestCrueValidationModele.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -0,0 +1,73 @@
+package org.fudaa.dodico.crue.io;
+
+import junit.framework.TestCase;
+
+import org.fudaa.ctulu.CtuluAnalyze;
+import org.fudaa.dodico.crue.metier.CrueData;
+import org.fudaa.dodico.crue.validation.EMHValidatorModele;
+
+/**
+ * Classe test de validation du modele.
+ *
+ * @author Adrien Hadoux
+ */
+public class TestCrueValidationModele extends TestCase {
+ /**
+ * constructeur lambda.
+ */
+ public TestCrueValidationModele() {
+
+ }
+
+ /**
+ * @param path
+ */
+ public void testCrueValidationModeleGENERIQUE(String path) {
+ CtuluAnalyze analyzer = new CtuluAnalyze();
+ final CrueData data = Crue10FileFormatFactory.getDRSOFileFormat().read(path, analyzer, null);
+ // analyzer.printResume();
+
+ analyzer = new CtuluAnalyze();
+ boolean res = EMHValidatorModele.validateConnexite(data, analyzer);
+ analyzer.printResume();
+
+ assertEquals(true, res);
+ }
+
+ /**
+ *
+ */
+ public void testCrueValidationModele3() {
+ testCrueValidationModeleGENERIQUE(TestCrueDRSOFile.FICHIER_TEST_MODELE3_DRSO_XML);
+
+ }
+
+ /**
+ *
+ */
+ public void testCrueValidationModele3_1() {
+ testCrueValidationModeleGENERIQUE(TestCrueDRSOFile.FICHIER_TEST_MODELE3_1_DRSO_XML);
+ }
+
+ /**
+ *
+ */
+ public void testCrueValidationModele3_2() {
+ testCrueValidationModeleGENERIQUE(TestCrueDRSOFile.FICHIER_TEST_MODELE3_2_DRSO_XML);
+ }
+
+ /**
+ *
+ */
+ public void testCrueValidationModele4() {
+ testCrueValidationModeleGENERIQUE(TestCrueDRSOFile.FICHIER_TEST_MODELE4_DRSO_XML);
+ }
+
+ /**
+ *
+ */
+ public void testCrueValidationModele4_1() {
+ testCrueValidationModeleGENERIQUE(TestCrueDRSOFile.FICHIER_TEST_MODELE4_1_DRSO_XML);
+ }
+
+}
Modified: trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/common/CrueCommomImplementation.java
===================================================================
--- trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/common/CrueCommomImplementation.java 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/common/CrueCommomImplementation.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -99,9 +99,7 @@
}
if (project.getListeScenarios() != null) {
-
listeScenarios_ = CrueScenarioBuilder.buildListScenario(project.getListeScenarios());
-
}
// -- initialisation des encarts des listes de modeles --//
@@ -164,9 +162,6 @@
menu.addMenuItem(FCrueResource.getS("Enregistrer scenario"), "ENREGISTRERSCENARIOS", FCrueResource.CRUE
.getIcon("crystal_enregistrer.png"), this);
- menu.addMenuItem(FCrueResource.getS("Gestion modèles"), "GESTIONMODELES", FCrueResource.CRUE
- .getIcon("crystal_document.png"), this);
-
menu.addSeparator(FCrueResource.getS("Operations"));
menu.addMenuItem(FCrueResource.getS("Comparaison"), "GESTIONCOMPARAISON", FCrueResource.CRUE
.getIcon("crystal_controler.png"), this);
@@ -183,7 +178,7 @@
* @return
*/
private BuMenu buildModeleMenu() {
- BuMenu menu = new BuMenu(BuResource.BU.getString("Scénario"), "MENUMODELE");
+ BuMenu menu = new BuMenu(BuResource.BU.getString("Modèles"), "MENUMODELE");
menu.addMenuItem(FCrueResource.getS("Gestion modèles"), "GESTIONMODELES", FCrueResource.CRUE
.getIcon("crystal_document.png"), this);
return menu;
Modified: trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/projet/CrueProjet.java
===================================================================
--- trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/projet/CrueProjet.java 2009-05-14 17:44:06 UTC (rev 4779)
+++ trunk/soft/fudaa-crue/fudaa/src/main/java/org/fudaa/fudaa/crue/projet/CrueProjet.java 2009-05-15 14:12:41 UTC (rev 4780)
@@ -30,7 +30,7 @@
final CrueErrorManager managerError;
/**
- * Les donnees crueData chargees.
+ * Les donnees crueData chargees du scenario courant.
*/
CrueData dataSources;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|