Bon ben bon courage...
Concrètement, je veux initialiser un objet de type Table à partir des données en base.
Voici la méthode init :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| public static Table init(Class cl, Integer primaryKeyValue) {
Table table = null;
String primaryKeyName;
//Recherche du nom de la cle primaire
ResultReq rrPk = Gestion.baseTest.requete("SELECT column_name " +
"FROM information_schema.key_column_usage " +
"WHERE CONSTRAINT_SCHEMA = '" + Gestion.nomBase + "' AND " +
"constraint_name='primary' AND table_name='" + cl.getSimpleName().toLowerCase() + "'");
if (rrPk.getRowCount() > 0) {
primaryKeyName = rrPk.getString(1);
} else {
Log.doLog(Level.SEVERE, OneLog.PERROR, "Pas de clé primaire trouvée pour la table :" + cl.getSimpleName());
return null;
}
rrPk.closeStatement();
// Recherche des param du constructeur
// Je permet l'acces au tableau [0] car un seul constructeur pour les
// types Table
Constructor<?> constructor[] = cl.getDeclaredConstructors();
Class classParamConstructeur[] = constructor[0].getParameterTypes();
Object paramConstructeur[] = new Object[classParamConstructeur.length];
// Recup du nom des champs pour la requete SQL
Field champs[] = cl.getDeclaredFields();
String listeChamps = "";
// Si notre Table contient des soustables je les stocke la dedans..
Map sousTables = new HashMap();
for (int i = 0; i < champs.length; i++) {
//On verifie si un parametre est de type SousTable
Class sousTable = null;
if (classParamConstructeur[i].getComponentType() != null) {
for (int j = 0; j < classParamConstructeur[i].getComponentType().getInterfaces().length && sousTable == null; j++) {
if (classParamConstructeur[i].getComponentType().getInterfaces()[j] == SousTable.class) {
sousTable = classParamConstructeur[i].getComponentType();
}
}
}
//Si un parametre de type SousTable est trouvé :
if (sousTable != null) {
ResultReq rr = Gestion.baseTest.requete("SELECT * from " +
sousTable.getSimpleName().toLowerCase() + " where " +
primaryKeyName + " = " + primaryKeyValue, true);
Object sousClasse[] = new Object[rr.getRowCount()];
for (int j = 0; j < sousClasse.length; j++) {
String primaryKeyNameSousTable = "";
ResultReq rrPkSousTable = Gestion.baseTest.requete("SELECT column_name " +
"FROM information_schema.key_column_usage " +
"WHERE CONSTRAINT_SCHEMA = '" + Gestion.nomBase + "' AND " +
"constraint_name='primary' AND table_name='" + sousTable.getSimpleName().toLowerCase() + "'");
if (rrPkSousTable.getRowCount() > 0) {
primaryKeyNameSousTable = rrPkSousTable.getString(1);
} else {
Log.doLog(Level.SEVERE, OneLog.PERROR, "Pas de clé primaire trouvée pour la table :" + cl.getSimpleName());
return null;
}
sousClasse[j] = init(sousTable, rr.getInt(primaryKeyNameSousTable));
rr.next();
}
sousTables.put(i, sousClasse);
} else {
//On continue d'inserer nos champs car l'objet soustable
//n'a pas sa place dans la requete sql..
if (listeChamps.isEmpty()) {
listeChamps = champs[i].getName();
} else {
listeChamps = listeChamps + "," + champs[i].getName();
}
}
}
String requete = "SELECT " + listeChamps + " FROM " + cl.getSimpleName() +
" WHERE " + primaryKeyName + " = '" + primaryKeyValue + "'";
ResultReq rr = Gestion.baseTest.requete(requete.toLowerCase(), true);
int j = 1;
for (int i = 0; i < paramConstructeur.length; i++) {
if (sousTables.containsKey(i)) {
// CEST ICI QUE JE DOIS FAIRE UN CAST AVEC LE TYPE DE LA CLASSE
// DONNé EN PARAMETRE
paramConstructeur[i] = sousTables.get(i);
} else {
paramConstructeur[i] = rr.getObject(j);
j++;
}
}
try {
table = (Table) constructor[0].newInstance(paramConstructeur);
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
}
return table;
} |
C'est à ce niveau que je dois faire un cast (ligne81):
paramConstructeur[i] = sousTables.get(i);
Voici l'appel à la méthode :
Voici le constructeur de Cmr (qui est une classe qui implémente Table ) :
public Cmr(Integer idCmr, Date date, Integer idClient, Integer idTransporteur, Integer qtePaletteEuro, Integer qtePaletteGrande, Integer qtePalettePetite, Integer temperature, String heureLivraison, CmrLigne[] cmrLigne)
Et le constructeur de CmrLigne (qui est une classe qui implémente Table et SousTable )
public Cmr(Integer idCmr, Date date, Integer idClient, Integer idTransporteur, Integer qtePaletteEuro, Integer qtePaletteGrande, Integer qtePalettePetite, Integer temperature, String heureLivraison, CmrLigne[] cmrLigne)
En cherchant dans le forum je me suis rendu compte que ma recherche porte un nom c'est du cast dynamique. A priori impossible avec un tableau, comme tu dis ...
Partager