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
......@@ -19,18 +19,21 @@
*/
package parcoursup.ordreappel.donnees;
import static java.util.stream.Collectors.joining;
import parcoursup.ordreappel.algo.AlgoOrdreAppelEntree;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.pool.OracleDataSource;
import parcoursup.ordreappel.algo.AlgoOrdreAppelSortie;
......@@ -40,8 +43,10 @@ import parcoursup.ordreappel.algo.VoeuClasse;
public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
private static final Logger LOGGER = Logger.getLogger(ConnecteurDonneesAppelOracle.class.getName());
/* connexion à la base de données */
Connection conn = null;
private final Connection conn;
public ConnecteurDonneesAppelOracle(String url, String user, String password) throws SQLException {
if (url == null || url.isEmpty()) {
......@@ -67,7 +72,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
/* récupère la liste des groupes et les taux minimum de boursiers
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);
String sql
......@@ -99,7 +104,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
+ " AND ti.g_ti_eta_cla=2 "
+ " AND NVL(g.c_gp_flg_pas_cla, 0)!=1";
log(sql);
LOGGER.info(sql);
try (ResultSet result = stmt.executeQuery(sql)) {
......@@ -140,7 +145,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
Set<Integer> groupesManquants = new HashSet<>();
/* 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);
String sql = "SELECT "
//id du groupe de classement
......@@ -176,7 +181,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
//seulement les formations qui classent
+ " AND NVL(gp.c_gp_flg_pas_cla, 0)!=1";
log(sql);
LOGGER.info(sql);
try (ResultSet result = stmt.executeQuery(sql)) {
......@@ -215,12 +220,11 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
stmt.close();
if (!groupesManquants.isEmpty()) {
log(groupesManquants.size() + " groupes manquants.");
System.out.print("(");
for (int c_gp_cod : groupesManquants) {
System.out.print(c_gp_cod + ",");
}
System.out.println(")");
LOGGER.log(Level.SEVERE, "{0} groupes manquants.", groupesManquants.size());
String list = groupesManquants.stream()
.map(String::valueOf)
.collect(joining(",", "(", ")"));
LOGGER.severe(list);
//throw new RuntimeException(groupesManquants.size() + " groupes manquants.");
}
......@@ -241,7 +245,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
try {
log("Début de l'exportation");
LOGGER.info("Début de l'exportation");
preparerExport();
......@@ -264,10 +268,10 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
ps.setInt(3, rang++);
ps.addBatch();
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.clearBatch();
log("Fait");
LOGGER.info("Fait");
}
}
......@@ -276,7 +280,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
}
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 "
+ "(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)"
......@@ -285,7 +289,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
/* exportation des statistiques mesurant l'écart entre l'ordre d'appel
et le classement initial.
*/
log("Exportation des coefficients de divergence");
LOGGER.info("Exportation des coefficients de divergence");
try (PreparedStatement ps = conn.prepareStatement(
"INSERT INTO C_CAN_ORD_APPEL_DIV (C_GP_COD,COEF_DIV) VALUES (?,?)")) {
for (Entry<Integer, OrdreAppel> paire
......@@ -298,13 +302,13 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
ps.executeBatch();
}
log("Application des changements");
LOGGER.info("Application des changements");
conn.commit();
log("Fin de l'exportation");
LOGGER.info("Fin de l'exportation");
} 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);
}
}
......@@ -321,7 +325,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
conn.createStatement().execute("DROP TABLE J_ORD_APPEL_TMP");
} catch (SQLException e) {
/* peut arriver si la table n'existait pas */
};
}
conn.createStatement().execute(
"CREATE GLOBAL TEMPORARY TABLE J_ORD_APPEL_TMP ("
......@@ -337,7 +341,7 @@ public class ConnecteurDonneesAppelOracle implements ConnecteurDonneesAppel {
conn.createStatement().execute("DROP TABLE C_CAN_ORD_APPEL_DIV");
} catch (SQLException e) {
/* peut arriver si la table n'existait pas */
};
}
conn.createStatement().execute(
"CREATE TABLE C_CAN_ORD_APPEL_DIV ("
......@@ -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 @@
*/
package parcoursup.propositions;
import java.time.LocalDateTime;
import java.util.logging.Logger;
import parcoursup.propositions.algo.AlgoPropositions;
import parcoursup.propositions.algo.AlgoPropositionsEntree;
......@@ -30,6 +30,8 @@ Ce code est exécuté de manière quotidienne.
*/
public class EnvoiPropositions {
private static final Logger LOGGER = Logger.getLogger(EnvoiPropositions.class.getName());
private final ConnecteurDonneesPropositions acces;
public EnvoiPropositions(ConnecteurDonneesPropositions acces) {
......@@ -38,24 +40,20 @@ public class EnvoiPropositions {
public void execute() throws Exception {
log("Récupération des données");
LOGGER.info("Récupération des données");
AlgoPropositionsEntree entree = acces.recupererDonnees();
log("Sauvegarde locale de l'entrée");
LOGGER.info("Sauvegarde locale de l'entrée");
entree.serialiser(null);
log("Calcul des propositions");
LOGGER.info("Calcul des propositions");
AlgoPropositionsSortie sortie = AlgoPropositions.calculePropositions(entree);
log("Sauvegarde locale de la sortie");
LOGGER.info("Sauvegarde locale de la sortie");
sortie.serialiser(null);
log("Export des données");
LOGGER.info("Export des données");
acces.exporterDonnees(sortie);
}
static void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
}
}
......@@ -19,21 +19,24 @@
*/
package parcoursup.propositions.algo;
import java.time.LocalDateTime;
import java.util.HashMap;
import parcoursup.propositions.test.VerificationsResultats;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AlgoPropositions {
private static final Logger LOGGER = Logger.getLogger(AlgoPropositions.class.getName());
/* la boucle principale du calcul des propositions à envoyer */
public static AlgoPropositionsSortie calculePropositions(AlgoPropositionsEntree entree) {
entree.verifierIntegrite();
log("Début calcul propositions");
LOGGER.info("Début calcul propositions");
/* groupes à mettre à jour */
Set<GroupeAffectation> groupesAMettreAJour
......@@ -95,11 +98,10 @@ public class AlgoPropositions {
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 "
+ entree.groupesAffectations.size()
+ " groupes d'affectation");
LOGGER.log(Level.INFO, "Vérification des propriétés attendues des propositions pour un des {0} groupes d''affectation",
entree.groupesAffectations.size());
int step = Integer.max(1, entree.groupesAffectations.size() / 100);
int count = 0;
......@@ -119,8 +121,8 @@ public class AlgoPropositions {
}
System.out.println();
log("Vérification des propriétés attendues des propositions d'un des "
+ entree.internats.size() + " internats");
LOGGER.log(Level.INFO, "Vérification des propriétés attendues des propositions d''un des {0} internats",
entree.internats.size());
step = Integer.max(1, entree.internats.size() / 100);
count = 0;
......@@ -153,9 +155,9 @@ public class AlgoPropositions {
}
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();
......@@ -175,10 +177,6 @@ public class AlgoPropositions {
}
private static void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
}
private static void afficherJauge() {
for (int i = 0; i < 100; i++) {
System.out.print("-");
......
......@@ -23,11 +23,12 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.pool.OracleDataSource;
import parcoursup.propositions.algo.AlgoPropositionsEntree;
......@@ -55,8 +56,10 @@ import parcoursup.propositions.algo.VoeuUID;
*/
public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPropositions {
private static final Logger LOGGER = Logger.getLogger(ConnecteurDonneesPropositionsOracle.class.getName());
/* connexion a la base de données */
Connection conn = null;
private final Connection conn;
public ConnecteurDonneesPropositionsOracle(String url, String user, String password) throws SQLException {
if (url == null || url.isEmpty()) {
......@@ -74,7 +77,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
@Override
public AlgoPropositionsEntree recupererDonnees() throws SQLException {
log("Vérification de l'interruption du flux de données entrantes.");
LOGGER.info("Vérification de l'interruption du flux de données entrantes.");
/*Si = 1 indique si le programme d'admission est en train de tourner
pour faire des propositions. Si c'est le cas, tout est bloqué*/
try (ResultSet result
......@@ -101,14 +104,14 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
recupererVoeuxSansInternatAClassementPropre();
if (!groupesManquants.isEmpty()) {
System.out.println(groupesManquants.size() + " groupes manquants.");
LOGGER.log(Level.SEVERE, "{0} groupes manquants.", groupesManquants.size());
}
if (!internatsManquants.isEmpty()) {
System.out.println(internatsManquants.size() + " internats manquants.");
LOGGER.log(Level.SEVERE, "{0} internats manquants.", internatsManquants.size());
}
log("Fin de la récupération des données depuis la base Oracle");
LOGGER.info("Fin de la récupération des données depuis la base Oracle");
AlgoPropositionsEntree entree = new AlgoPropositionsEntree();
......@@ -125,13 +128,13 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
conn.setAutoCommit(false);
log("Préparation des tables avant export");
LOGGER.info("Préparation des tables avant export");
conn.createStatement().executeQuery(
"DELETE FROM A_ADM_PROP WHERE NB_JRS=" + GroupeInternat.nbJoursCampagne);
conn.createStatement().executeQuery(
"DELETE FROM A_ADM_POSITIONS_INT WHERE NB_JRS=" + GroupeInternat.nbJoursCampagne);
log("Exportation des propositions d'admission");
LOGGER.info("Exportation des propositions d'admission");
try (PreparedStatement ps = conn.prepareStatement(
"INSERT INTO A_ADM_PROP "
......@@ -158,21 +161,21 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
ps.addBatch();
if (++count % 500000 == 0) {
log("Exportation des propositions " + (count - 499999) + " a " + count);
LOGGER.log(Level.INFO, "Exportation des propositions {0} a {1}", new Object[]{count - 499999, count});
ps.executeBatch();
ps.clearBatch();
log("Fait");
LOGGER.info("Fait");
}
}
ps.executeBatch();
log(count + " propositions exportées.");
LOGGER.log(Level.INFO, "{0} propositions exportées.", count);
}
conn.commit();
log("Exportation des positions d'admission aux internats");
LOGGER.info("Exportation des positions d'admission aux internats");
try (PreparedStatement ps = conn.prepareStatement(
"INSERT INTO A_ADM_POSITIONS_INT "
......@@ -206,14 +209,13 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
= new HashSet<>();
/* permet de comptabiliser les groupes manquants, avant le début de campagne */
Set<GroupeAffectationUID> groupesManquants
= new HashSet<>();
private final Set<GroupeAffectationUID> groupesManquants = new HashSet<>();
private void recupererGroupesEtInternats() throws SQLException {
internats.clear();
groupesAffectations.clear();
log("Récupération des groupes d'affectation");
LOGGER.info("Récupération des groupes d'affectation");
try (Statement stmt = conn.createStatement()) {
stmt.setFetchSize(1000000);
try (ResultSet result = stmt.executeQuery(
......@@ -243,7 +245,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
}
}
log("Récupération des internats");
LOGGER.info("Récupération des internats");
try (Statement stmt = conn.createStatement()) {
stmt.setFetchSize(1000000);
......@@ -274,7 +276,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
}
}
log("Récupération du nombre de jours écoulés depuis l'ouverture de la campagne");
LOGGER.info("Récupération du nombre de jours écoulés depuis l'ouverture de la campagne");
try (ResultSet result
= conn.createStatement().executeQuery(
"SELECT TRUNC(SYSDATE) - TRUNC(TO_DATE(g_pr_val, 'DD/MM/YYYY:HH24'))+1"
......@@ -293,7 +295,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
int compteur = 0;
log("Récupération des voeux avec demande internat dans un internat à classement propre");
LOGGER.info("Récupération des voeux avec demande internat dans un internat à classement propre");
try (Statement stmt = conn.createStatement()) {
stmt.setFetchSize(1000000);
String requete
......@@ -342,7 +344,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
+ "AND ti.g_ti_cla_int_uni IN (0,1)" //restriction aux internats à classement propre
;
log(requete);
LOGGER.info(requete);
try (ResultSet result = stmt.executeQuery(requete)) {
while (result.next()) {
......@@ -412,12 +414,12 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
}
}
}
log(compteur + " voeux en attente avec internat à classement propre");
LOGGER.log(Level.INFO, "{0} voeux en attente avec internat à classement propre", compteur);
}
private void recupererVoeuxSansInternatAClassementPropre() throws SQLException {
int compteur = 0;
log("Récupération des voeux sans internat, ou dans un internat sans classement propre");
LOGGER.info("Récupération des voeux sans internat, ou dans un internat sans classement propre");
try (Statement stmt = conn.createStatement()) {
stmt.setFetchSize(1000000);
String requete
......@@ -452,7 +454,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
//exclut les formations d'inscriptions avec internat à classement propre
+ " AND (v.i_rh_cod =0 or ti.g_ti_cla_int_uni NOT IN (0,1))";
log(requete);
LOGGER.info(requete);
try (ResultSet result = stmt.executeQuery(requete)) {
while (result.next()) {
......@@ -491,11 +493,7 @@ public class ConnecteurDonneesPropositionsOracle implements ConnecteurDonneesPro
}
}
}
log(compteur + " voeux en attente sans internat a classement propre");
}
private void log(String message) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + message);
LOGGER.log(Level.INFO, "{0} voeux en attente sans internat a classement propre", compteur);
}
}
......@@ -28,6 +28,8 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import parcoursup.propositions.algo.AlgoPropositionsEntree;
......@@ -39,6 +41,8 @@ import parcoursup.propositions.algo.VoeuEnAttente;
public class ExempleAleatoire extends ExemplePropositions {
private static final Logger LOGGER = Logger.getLogger(ExempleAleatoire.class.getName());
@Override
String nom() {
return "ExempleAleatoire";// + dateCreation;
......@@ -64,7 +68,7 @@ public class ExempleAleatoire extends ExemplePropositions {
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_TA_COD = 1;
......@@ -329,9 +333,7 @@ public class ExempleAleatoire extends ExemplePropositions {
public ExempleAleatoire(int nbEtudiants) {
if(nbEtudiants < 100)
nbEtudiants = 100;
this.nbEtudiants = nbEtudiants;
this.nbEtudiants = Math.max(100, nbEtudiants);
}
......@@ -341,16 +343,16 @@ public class ExempleAleatoire extends ExemplePropositions {
int capacite_totale = 0;
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) {
Etablissement e = new Etablissement();
etablissements.add(e);
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++) {
Candidat c = new Candidat();
int nbVoeux = (int) (Math.random() * maxNbVoeuxParCandidat);
......@@ -360,11 +362,11 @@ public class ExempleAleatoire extends ExemplePropositions {
nbVoeux -= e.ajouterVoeux(c);
}
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();
......@@ -390,8 +392,4 @@ public class ExempleAleatoire extends ExemplePropositions {
return entree;
}
void log(String msg) {
System.out.println(LocalDateTime.now().toLocalTime() + ": " + msg);
}
}
......@@ -22,6 +22,8 @@ package parcoursup.propositions.test;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import parcoursup.propositions.algo.GroupeAffectation;
import parcoursup.propositions.algo.GroupeInternat;
import parcoursup.propositions.algo.VoeuEnAttente;
......@@ -35,6 +37,8 @@ Des tests complémentaires sont effectués en base par des scripts PL/SQL.
*/
public class VerificationsResultats {
private static final Logger LOGGER = Logger.getLogger(VerificationsResultats.class.getName());
/*
P1 (respect ordre appel pour les voeux sans internat)
......@@ -245,7 +249,7 @@ public class VerificationsResultats {
private static void prevenirSi(boolean prop, String message) {
if (prop) {
System.out.println("Attention: " + message);
LOGGER.log(Level.WARNING, "Attention: {0}", message);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment