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 :
	
	| 12
 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