Commit 001550ae authored by Parcoursup's avatar Parcoursup

Merge branch 'java-util-logging' into 'master'

Fix #10 : System.out -> JUL

Closes #10

See merge request !18
parents 7febb178 1fbf5356
/* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr) /* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr)
This file is part of Algorithmes-de-parcoursup. This file is part of Algorithmes-de-parcoursup.
...@@ -19,18 +19,21 @@ ...@@ -19,18 +19,21 @@
*/ */
package parcoursup.ordreappel.donnees; package parcoursup.ordreappel.donnees;
import static java.util.stream.Collectors.joining;
import parcoursup.ordreappel.algo.AlgoOrdreAppelEntree; import parcoursup.ordreappel.algo.AlgoOrdreAppelEntree;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleDriver; import oracle.jdbc.OracleDriver;
import oracle.jdbc.pool.OracleDataSource; import oracle.jdbc.pool.OracleDataSource;
import parcoursup.ordreappel.algo.AlgoOrdreAppelSortie; import parcoursup.ordreappel.algo.AlgoOrdreAppelSortie;
...@@ -40,8 +43,10 @@ import parcoursup.ordreappel.algo.VoeuClasse; ...@@ -40,8 +43,10 @@ import parcoursup.ordreappel.algo.VoeuClasse;
public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
private static final Logger LOGGER = Logger.getLogger(ConnecteurDonneesAppelOracle.class.getName());
/* connexion à la base de données */ /* connexion à la base de données */
Connection conn = null; private final Connection conn;
public ConnecteurDonneesAppelOracle(String url, String user, String password) throws SQLException { public ConnecteurDonneesAppelOracle(String url, String user, String password) throws SQLException {
if (url == null || url.isEmpty()) { if (url == null || url.isEmpty()) {
...@@ -65,9 +70,9 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -65,9 +70,9 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
try (Statement stmt = conn.createStatement()) { try (Statement stmt = conn.createStatement()) {
/* récupère la liste des groupes et les taux minimum de boursiers /* récupère la liste des groupes et les taux minimum de boursiers
et de résidents depuis la base de données */ et de résidents depuis la base de données */
log("Récupération des groupes"); LOGGER.info("Récupération des groupes");
stmt.setFetchSize(1000000); stmt.setFetchSize(1000000);
String sql String sql
...@@ -99,7 +104,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -99,7 +104,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
+ " AND ti.g_ti_eta_cla=2 " + " AND ti.g_ti_eta_cla=2 "
+ " AND NVL(g.c_gp_flg_pas_cla, 0)!=1"; + " AND NVL(g.c_gp_flg_pas_cla, 0)!=1";
log(sql); LOGGER.info(sql);
try (ResultSet result = stmt.executeQuery(sql)) { try (ResultSet result = stmt.executeQuery(sql)) {
...@@ -140,7 +145,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -140,7 +145,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
Set<Integer> groupesManquants = new HashSet<>(); Set<Integer> groupesManquants = new HashSet<>();
/* récupère la liste des voeux depuis la base de données */ /* récupère la liste des voeux depuis la base de données */
log("Récupération des voeux"); LOGGER.info("Récupération des voeux");
stmt.setFetchSize(1000000); stmt.setFetchSize(1000000);
String sql = "SELECT " String sql = "SELECT "
//id du groupe de classement //id du groupe de classement
...@@ -151,7 +156,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -151,7 +156,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
+ "NVL(C_CG_RAN,0), " + "NVL(C_CG_RAN,0), "
//le candidat a-t'il déclaré être boursier? non 0 lycée 1 dusup 2 //le candidat a-t'il déclaré être boursier? non 0 lycée 1 dusup 2
+ "g_cn_brs, " + "g_cn_brs, "
//cette déclaration a-t'elle été confirmée //cette déclaration a-t'elle été confirmée
//via les remontées de base SIECLE (1) //via les remontées de base SIECLE (1)
//ou directement par le chef d'établissement (2) //ou directement par le chef d'établissement (2)
+ "g_cn_flg_brs_cer," + "g_cn_flg_brs_cer,"
...@@ -176,11 +181,11 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -176,11 +181,11 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
//seulement les formations qui classent //seulement les formations qui classent
+ " AND NVL(gp.c_gp_flg_pas_cla, 0)!=1"; + " AND NVL(gp.c_gp_flg_pas_cla, 0)!=1";
log(sql); LOGGER.info(sql);
try (ResultSet result = stmt.executeQuery(sql)) { try (ResultSet result = stmt.executeQuery(sql)) {
/* Remarque: le rang est à null / 0 pour celles des formations /* Remarque: le rang est à null / 0 pour celles des formations
non-sélectives qui ne réalisent pas de classement. */ non-sélectives qui ne réalisent pas de classement. */
while (result.next()) { while (result.next()) {
...@@ -215,12 +220,11 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -215,12 +220,11 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
stmt.close(); stmt.close();
if (!groupesManquants.isEmpty()) { if (!groupesManquants.isEmpty()) {
log(groupesManquants.size() + " groupes manquants."); LOGGER.log(Level.SEVERE, "{0} groupes manquants.", groupesManquants.size());
System.out.print("("); String list = groupesManquants.stream()
for (int c_gp_cod : groupesManquants) { .map(String::valueOf)
System.out.print(c_gp_cod + ","); .collect(joining(",", "(", ")"));
} LOGGER.severe(list);
System.out.println(")");
//throw new RuntimeException(groupesManquants.size() + " groupes manquants."); //throw new RuntimeException(groupesManquants.size() + " groupes manquants.");
} }
...@@ -241,7 +245,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -241,7 +245,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
try { try {
log("Début de l'exportation"); LOGGER.info("Début de l'exportation");
preparerExport(); preparerExport();
...@@ -264,10 +268,10 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -264,10 +268,10 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
ps.setInt(3, rang++); ps.setInt(3, rang++);
ps.addBatch(); ps.addBatch();
if (++count % 500000 == 0) { if (++count % 500000 == 0) {
log("Exportation des ordres d'appel des voeux " + (count - 499999) + " a " + count); LOGGER.log(Level.INFO, "Exportation des ordres d''appel des voeux {0} a {1}", new Object[]{count - 499999, count});
ps.executeBatch(); ps.executeBatch();
ps.clearBatch(); ps.clearBatch();
log("Fait"); LOGGER.info("Fait");
} }
} }
...@@ -276,16 +280,16 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -276,16 +280,16 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
} }
conn.commit(); conn.commit();
log("Mise à jour de la table C_CAN_GRP"); LOGGER.info("Mise à jour de la table C_CAN_GRP");
conn.createStatement().execute("UPDATE " conn.createStatement().execute("UPDATE "
+ "(SELECT a.C_CG_ORD_APP cible, b.C_CG_ORD_APP source FROM C_CAN_GRP a," + "(SELECT a.C_CG_ORD_APP cible, b.C_CG_ORD_APP source FROM C_CAN_GRP a,"
+ "J_ORD_APPEL_TMP b WHERE a.G_CN_COD=b.G_CN_COD AND a.C_GP_COD=b.C_GP_COD)" + "J_ORD_APPEL_TMP b WHERE a.G_CN_COD=b.G_CN_COD AND a.C_GP_COD=b.C_GP_COD)"
+ "SET cible=source"); + "SET cible=source");
/* exportation des statistiques mesurant l'écart entre l'ordre d'appel /* exportation des statistiques mesurant l'écart entre l'ordre d'appel
et le classement initial. et le classement initial.
*/ */
log("Exportation des coefficients de divergence"); LOGGER.info("Exportation des coefficients de divergence");
try (PreparedStatement ps = conn.prepareStatement( try (PreparedStatement ps = conn.prepareStatement(
"INSERT INTO C_CAN_ORD_APPEL_DIV (C_GP_COD,COEF_DIV) VALUES (?,?)")) { "INSERT INTO C_CAN_ORD_APPEL_DIV (C_GP_COD,COEF_DIV) VALUES (?,?)")) {
for (Entry<Integer, OrdreAppel> paire for (Entry<Integer, OrdreAppel> paire
...@@ -298,13 +302,13 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -298,13 +302,13 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
ps.executeBatch(); ps.executeBatch();
} }
log("Application des changements"); LOGGER.info("Application des changements");
conn.commit(); conn.commit();
log("Fin de l'exportation"); LOGGER.info("Fin de l'exportation");
} catch (SQLException ex) { } catch (SQLException ex) {
log("Erreur d'exportation des données"); LOGGER.severe("Erreur d'exportation des données");
throw new RuntimeException("Erreur d'exportation des données", ex); throw new RuntimeException("Erreur d'exportation des données", ex);
} }
} }
...@@ -321,7 +325,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -321,7 +325,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
conn.createStatement().execute("DROP TABLE J_ORD_APPEL_TMP"); conn.createStatement().execute("DROP TABLE J_ORD_APPEL_TMP");
} catch (SQLException e) { } catch (SQLException e) {
/* peut arriver si la table n'existait pas */ /* peut arriver si la table n'existait pas */
}; }
conn.createStatement().execute( conn.createStatement().execute(
"CREATE GLOBAL TEMPORARY TABLE J_ORD_APPEL_TMP (" "CREATE GLOBAL TEMPORARY TABLE J_ORD_APPEL_TMP ("
...@@ -337,7 +341,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -337,7 +341,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
conn.createStatement().execute("DROP TABLE C_CAN_ORD_APPEL_DIV"); conn.createStatement().execute("DROP TABLE C_CAN_ORD_APPEL_DIV");
} catch (SQLException e) { } catch (SQLException e) {
/* peut arriver si la table n'existait pas */ /* peut arriver si la table n'existait pas */
}; }
conn.createStatement().execute( conn.createStatement().execute(
"CREATE TABLE C_CAN_ORD_APPEL_DIV (" "CREATE TABLE C_CAN_ORD_APPEL_DIV ("
...@@ -349,8 +353,4 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel { ...@@ -349,8 +353,4 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
} }
private void log(String message) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + message);
}
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
*/ */
package parcoursup.propositions; package parcoursup.propositions;
import java.time.LocalDateTime; import java.util.logging.Logger;
import parcoursup.propositions.algo.AlgoPropositions; import parcoursup.propositions.algo.AlgoPropositions;
import parcoursup.propositions.algo.AlgoPropositionsEntree; import parcoursup.propositions.algo.AlgoPropositionsEntree;
...@@ -30,6 +30,8 @@ Ce code est exécuté de manière quotidienne. ...@@ -30,6 +30,8 @@ Ce code est exécuté de manière quotidienne.
*/ */
public class EnvoiPropositions { public class EnvoiPropositions {
private static final Logger LOGGER = Logger.getLogger(EnvoiPropositions.class.getName());
private final ConnecteurDonneesPropositions acces; private final ConnecteurDonneesPropositions acces;
public EnvoiPropositions(ConnecteurDonneesPropositions acces) { public EnvoiPropositions(ConnecteurDonneesPropositions acces) {
...@@ -38,24 +40,20 @@ public class EnvoiPropositions { ...@@ -38,24 +40,20 @@ public class EnvoiPropositions {
public void execute() throws Exception { public void execute() throws Exception {
log("Récupération des données"); LOGGER.info("Récupération des données");
AlgoPropositionsEntree entree = acces.recupererDonnees(); AlgoPropositionsEntree entree = acces.recupererDonnees();
log("Sauvegarde locale de l'entrée"); LOGGER.info("Sauvegarde locale de l'entrée");
entree.serialiser(null); entree.serialiser(null);
log("Calcul des propositions"); LOGGER.info("Calcul des propositions");
AlgoPropositionsSortie sortie = AlgoPropositions.calculePropositions(entree); AlgoPropositionsSortie sortie = AlgoPropositions.calculePropositions(entree);
log("Sauvegarde locale de la sortie"); LOGGER.info("Sauvegarde locale de la sortie");
sortie.serialiser(null); sortie.serialiser(null);
log("Export des données"); LOGGER.info("Export des données");
acces.exporterDonnees(sortie); acces.exporterDonnees(sortie);
} }
static void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
}
} }
/* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr) /* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr)
This file is part of Algorithmes-de-parcoursup. This file is part of Algorithmes-de-parcoursup.
...@@ -19,21 +19,24 @@ ...@@ -19,21 +19,24 @@
*/ */
package parcoursup.propositions.algo; package parcoursup.propositions.algo;
import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import parcoursup.propositions.test.VerificationsResultats; import parcoursup.propositions.test.VerificationsResultats;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AlgoPropositions { public class AlgoPropositions {
private static final Logger LOGGER = Logger.getLogger(AlgoPropositions.class.getName());
/* la boucle principale du calcul des propositions à envoyer */ /* la boucle principale du calcul des propositions à envoyer */
public static AlgoPropositionsSortie calculePropositions(AlgoPropositionsEntree entree) { public static AlgoPropositionsSortie calculePropositions(AlgoPropositionsEntree entree) {
entree.verifierIntegrite(); entree.verifierIntegrite();
log("Début calcul propositions"); LOGGER.info("Début calcul propositions");
/* groupes à mettre à jour */ /* groupes à mettre à jour */
Set<GroupeAffectation> groupesAMettreAJour Set<GroupeAffectation> groupesAMettreAJour
...@@ -48,42 +51,42 @@ public class AlgoPropositions { ...@@ -48,42 +51,42 @@ public class AlgoPropositions {
int compteurBoucle = 0; int compteurBoucle = 0;
while (groupesAMettreAJour.size() > 0) { while (groupesAMettreAJour.size() > 0) {
/* calcul des propositions à effectuer, /* calcul des propositions à effectuer,
étant données les positions actuelles d'admissions aux internats */ étant données les positions actuelles d'admissions aux internats */
for (GroupeAffectation gc : groupesAMettreAJour) { for (GroupeAffectation gc : groupesAMettreAJour) {
gc.mettreAJourPropositions(); gc.mettreAJourPropositions();
} }
/* Test de surcapacité des internats, avec /* Test de surcapacité des internats, avec
mise à jour de la position d'admission si nécessaire. mise à jour de la position d'admission si nécessaire.
Baisser la position d'admission d'un internat ne diminue Baisser la position d'admission d'un internat ne diminue
pas le nombre de candidats dans les autres internats, voire augmente ces nombres, pas le nombre de candidats dans les autres internats, voire augmente ces nombres,
car les formations devront potentiellement descendre plus bas dans l'ordre d'appel. car les formations devront potentiellement descendre plus bas dans l'ordre d'appel.
Par conséquent, on peut mettre à jour toutes les positions d'admission Par conséquent, on peut mettre à jour toutes les positions d'admission
de tous les internats sans mettre à jour systématiquement les propositions: de tous les internats sans mettre à jour systématiquement les propositions:
si un internat est détecté en surcapacité avant la mise si un internat est détecté en surcapacité avant la mise
à jour des propositions, il l'aurait été également après la mise à jour des propositions. à jour des propositions, il l'aurait été également après la mise à jour des propositions.
(Mais la réciproque est fausse en général). (Mais la réciproque est fausse en général).
De cette manière, on reste bien dans l'ensemble E des vecteurs de positions De cette manière, on reste bien dans l'ensemble E des vecteurs de positions
d'admission supérieurs sur chaque composante au vecteur de positions d'admission d'admission supérieurs sur chaque composante au vecteur de positions d'admission
le plus permissif possible parmi tous ceux respectant les contraintes le plus permissif possible parmi tous ceux respectant les contraintes
de capacité des internats et situés en deçà des positions maximales de capacité des internats et situés en deçà des positions maximales
d'admission. d'admission.
Ce vecteur est égal, sur chaque composante, à la valeur minimum de cette Ce vecteur est égal, sur chaque composante, à la valeur minimum de cette
composante parmi les éléments de E. composante parmi les éléments de E.
La boucle termine quand les contraintes de capacité des internats La boucle termine quand les contraintes de capacité des internats
sont satisfaites, c'est-à-dire quand ce minimum global est atteint. sont satisfaites, c'est-à-dire quand ce minimum global est atteint.
Une propriété de symétrie i.e. d'équité intéressante: Une propriété de symétrie i.e. d'équité intéressante:
le résultat ne dépend pas de l'ordre dans lequel on itère sur les internats et le résultat ne dépend pas de l'ordre dans lequel on itère sur les internats et
les formations. les formations.
*/ */
groupesAMettreAJour.clear(); groupesAMettreAJour.clear();
for (GroupeInternat internat : entree.internats) { for (GroupeInternat internat : entree.internats) {
...@@ -95,11 +98,10 @@ public class AlgoPropositions { ...@@ -95,11 +98,10 @@ public class AlgoPropositions {
compteurBoucle++; compteurBoucle++;
} }
log("Calcul terminé après " + compteurBoucle + " itération(s)."); LOGGER.log(Level.INFO, "Calcul terminé après {0} itération(s).", compteurBoucle);
log("Vérification des propriétés attendues des propositions pour un des " LOGGER.log(Level.INFO, "Vérification des propriétés attendues des propositions pour un des {0} groupes d''affectation",
+ entree.groupesAffectations.size() entree.groupesAffectations.size());
+ " groupes d'affectation");
int step = Integer.max(1, entree.groupesAffectations.size() / 100); int step = Integer.max(1, entree.groupesAffectations.size() / 100);
int count = 0; int count = 0;
...@@ -119,8 +121,8 @@ public class AlgoPropositions { ...@@ -119,8 +121,8 @@ public class AlgoPropositions {
} }
System.out.println(); System.out.println();
log("Vérification des propriétés attendues des propositions d'un des " LOGGER.log(Level.INFO, "Vérification des propriétés attendues des propositions d''un des {0} internats",
+ entree.internats.size() + " internats"); entree.internats.size());
step = Integer.max(1, entree.internats.size() / 100); step = Integer.max(1, entree.internats.size() / 100);
count = 0; count = 0;
...@@ -153,9 +155,9 @@ public class AlgoPropositions { ...@@ -153,9 +155,9 @@ public class AlgoPropositions {
} }
System.out.println(); System.out.println();
log("Vérification ok"); LOGGER.info("Vérification ok");
log("Préparation données de sortie"); LOGGER.info("Préparation données de sortie");
AlgoPropositionsSortie sortie = new AlgoPropositionsSortie(); AlgoPropositionsSortie sortie = new AlgoPropositionsSortie();
...@@ -175,10 +177,6 @@ public class AlgoPropositions { ...@@ -175,10 +177,6 @@ public class AlgoPropositions {
} }
private static void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
}
private static void afficherJauge() { private static void afficherJauge() {
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
System.out.print("-"); System.out.print("-");
......
/* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr) /* Copyright 2018, 2018 Hugo Gimbert (hugo.gimbert@enseignementsup.gouv.fr)
This file is part of Algorithmes-de-parcoursup. This file is part of Algorithmes-de-parcoursup.
...@@ -28,6 +28,8 @@ import java.util.List; ...@@ -28,6 +28,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller; import javax.xml.bind.Marshaller;
import parcoursup.propositions.algo.AlgoPropositionsEntree; import parcoursup.propositions.algo.AlgoPropositionsEntree;
...@@ -39,6 +41,8 @@ import parcoursup.propositions.algo.VoeuEnAttente; ...@@ -39,6 +41,8 @@ import parcoursup.propositions.algo.VoeuEnAttente;
public class ExempleAleatoire extends ExemplePropositions { public class ExempleAleatoire extends ExemplePropositions {
private static final Logger LOGGER = Logger.getLogger(ExempleAleatoire.class.getName());
@Override @Override
String nom() { String nom() {
return "ExempleAleatoire";// + dateCreation; return "ExempleAleatoire";// + dateCreation;
...@@ -64,7 +68,7 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -64,7 +68,7 @@ public class ExempleAleatoire extends ExemplePropositions {
final int maxNbGroupesParFormation = 5; final int maxNbGroupesParFormation = 5;
List<Etablissement> etablissements = new LinkedList<>(); private final List<Etablissement> etablissements = new LinkedList<>();
int last_G_TI_COD = 1; int last_G_TI_COD = 1;
int last_G_TA_COD = 1; int last_G_TA_COD = 1;
...@@ -248,7 +252,7 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -248,7 +252,7 @@ public class ExempleAleatoire extends ExemplePropositions {
} }
} else { } else {
int rangInternat = juryInternat.ajouterCandidat(candidat); int rangInternat = juryInternat.ajouterCandidat(candidat);
if ((rang <= cl.plusHautRangAffecte && rangInternat <= juryInternat.plusHautRangAffecte)) { if ((rang <= cl.plusHautRangAffecte && rangInternat <= juryInternat.plusHautRangAffecte)) {
ga.ajouterCandidatAffecte(candidat.G_CN_COD); ga.ajouterCandidatAffecte(candidat.G_CN_COD);
internat.ajouterCandidatAffecte(candidat.G_CN_COD); internat.ajouterCandidatAffecte(candidat.G_CN_COD);
...@@ -289,7 +293,7 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -289,7 +293,7 @@ public class ExempleAleatoire extends ExemplePropositions {
/* le rang le plus haut dans l'ordre d'appel d'un candidat recruté */ /* le rang le plus haut dans l'ordre d'appel d'un candidat recruté */
int plusHautRangAffecte = random.nextInt(nbEtudiants / 4); int plusHautRangAffecte = random.nextInt(nbEtudiants / 4);
GroupeClassement() { GroupeClassement() {
this.C_G_COD = last_C_GP_COD++; this.C_G_COD = last_C_GP_COD++;
} }
...@@ -329,9 +333,7 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -329,9 +333,7 @@ public class ExempleAleatoire extends ExemplePropositions {
public ExempleAleatoire(int nbEtudiants) { public ExempleAleatoire(int nbEtudiants) {
if(nbEtudiants < 100) this.nbEtudiants = Math.max(100, nbEtudiants);
nbEtudiants = 100;
this.nbEtudiants = nbEtudiants;
} }
...@@ -341,16 +343,16 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -341,16 +343,16 @@ public class ExempleAleatoire extends ExemplePropositions {
int capacite_totale = 0; int capacite_totale = 0;
GroupeInternat.nbJoursCampagne = 1 + random.nextInt(70); GroupeInternat.nbJoursCampagne = 1 + random.nextInt(70);
log("Jours de campagne: " + GroupeInternat.nbJoursCampagne); LOGGER.log(Level.INFO, "Jours de campagne: {0}", GroupeInternat.nbJoursCampagne);
log("Génération aléatoire des établissements et formations"); LOGGER.info("Génération aléatoire des établissements et formations");
while (capacite_totale < nbEtudiants) { while (capacite_totale < nbEtudiants) {
Etablissement e = new Etablissement(); Etablissement e = new Etablissement();
etablissements.add(e); etablissements.add(e);
capacite_totale += e.capacite(); capacite_totale += e.capacite();
} }
log("Génération aléatoire des voeux et classements"); LOGGER.info("Génération aléatoire des voeux et classements");
for (int i = 0; i < nbEtudiants; i++) { for (int i = 0; i < nbEtudiants; i++) {
Candidat c = new Candidat(); Candidat c = new Candidat();
int nbVoeux = (int) (Math.random() * maxNbVoeuxParCandidat); int nbVoeux = (int) (Math.random() * maxNbVoeuxParCandidat);
...@@ -360,11 +362,11 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -360,11 +362,11 @@ public class ExempleAleatoire extends ExemplePropositions {
nbVoeux -= e.ajouterVoeux(c); nbVoeux -= e.ajouterVoeux(c);
} }
if ((i + 1) % 100000 == 0) { if ((i + 1) % 100000 == 0) {
log((1 + i) + " étudiants générés ..."); LOGGER.log(Level.INFO, "{0}{1} étudiants générés ...", new Object[]{1, i});
} }
} }
log("Génération données entrée algorithme"); LOGGER.info("Génération données entrée algorithme");
AlgoPropositionsEntree entree = new AlgoPropositionsEntree(); AlgoPropositionsEntree entree = new AlgoPropositionsEntree();
...@@ -386,12 +388,8 @@ public class ExempleAleatoire extends ExemplePropositions { ...@@ -386,12 +388,8 @@ public class ExempleAleatoire extends ExemplePropositions {
Marshaller m = jc.createMarshaller(); Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(entree, new File(nom() + "_entree.xml")); m.marshal(entree, new File(nom() + "_entree.xml"));
return entree;
} return entree;
void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
} }
} }