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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| package general;
import java.io.File;
import java.io.InputStream;
import java.net.*;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import lancement.Data;
public class MaClassLoader {
//les tableaux des différentes informations qui décrivent chaque plugin/jeu
private Class [] lesClasses;
private String [] lesNoms, lesRegles, lesAuteurs;
private int [] lesJoueursMin, lesJoueursMax;
private String [][] lesFichiersSons;
private Boolean [] lesTypesDeJeux;
private JarFile [] lesJars;
public MaClassLoader() {
//on récupère sous forme de tableau la liste des différents jeux/plugins disponibles
//dans le répertoires adéquats
File[] jarsDispos = new File(System.getProperty("user.dir")
+ File.separator + Data.dossierJeux).listFiles();
//on initialise l'ensemble des tableaux à la longueur du nombre de plugins/jeux installés
int nbJars = jarsDispos.length;
lesClasses = new Class[nbJars];
lesNoms = new String[nbJars];
lesRegles = new String[nbJars];
lesAuteurs = new String[nbJars];
lesTypesDeJeux = new Boolean[nbJars];
lesJoueursMax = new int[nbJars];
lesJoueursMin = new int[nbJars];
lesFichiersSons = new String[nbJars][];
lesJars = new JarFile[nbJars];
//pour chaque jar...
for (int index = 0; index < nbJars; index++) {
try {
String nomJar = jarsDispos[index].getName();
nomJar = nomJar.substring(0,nomJar.length() - 4);
nomJar = nomJar + ".class";
URL u = jarsDispos[index].toURI().toURL();
//On créer un nouveau URLClassLoader pour charger le jar qui se trouve ne dehors du CLASSPATH
URLClassLoader loader = new URLClassLoader(new URL[] { u });
//On charge le jar en mémoire
JarFile jar = new JarFile(jarsDispos[index].getAbsolutePath());
lesJars[index] = jar;
//On récupére le contenu du jar
Enumeration enumeration = jar.entries();
while (enumeration.hasMoreElements()) {
JarEntry fichiertemp = (JarEntry)enumeration.nextElement();
String tmp = fichiertemp.toString();
//Si le fichier courant est un .xml on l'analyse
if (tmp.length() > 4 && tmp.substring(tmp.length() - 4).compareTo(".xml") == 0) {
// on crée le document xml local
SAXBuilder sxb = new SAXBuilder();
Document XMLProprietes;
try
{
InputStream flotOctet= jar.getInputStream(fichiertemp);
XMLProprietes = sxb.build(flotOctet);
}
catch(Exception e){
e.printStackTrace();
System.out.println("Archive introuvable!");
XMLProprietes = null;
}
exploiteXML(XMLProprietes,index);
}
//On vérifie que le fichier courant est un .class
//et qu'il correspond au nom du .jar
if (tmp.length() > 6
&& tmp.substring(tmp.length() - nomJar.length()).compareTo(nomJar) == 0) {
// si tel est le cas, on enregistre ce .class comme une classe utilisable par le programme
tmp = tmp.substring(0, tmp.length() - 6);
tmp = tmp.replaceAll("/", ".");
Class tmpClass = Class.forName(tmp, true, loader);
lesClasses[index]=tmpClass;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void exploiteXML(Document proprietes, int index) {
if (proprietes != null)
{
//On récupère la racine
Element racine = proprietes.getRootElement();
//On récupère tous les Elements uniques
lesNoms[index] = racine.getChildText("Nom");
lesAuteurs[index] = racine.getChildText("Auteur");
//indique true si le type est égal à 1 (0 pour proto et donc false)
lesTypesDeJeux[index] = (Integer.parseInt(racine.getChildText("Type")) == 1);
lesJoueursMax[index] = Integer.parseInt(racine.getChildText("NbjMax"));
lesJoueursMin[index] = Integer.parseInt(racine.getChildText("NbjMin"));
lesRegles[index] = racine.getChildText("Regles");
//on liste tous les sons
List listSons = racine.getChildren("Sons");
Iterator iteratorSons = listSons.iterator();
lesFichiersSons[index] = new String [listSons.size()];
int i=0;
//On parcourt tous les sons
while(iteratorSons.hasNext()){
Element son = (Element)iteratorSons.next();
lesFichiersSons[index][i] = son.getChildText("Fichier");
}
}
}
public String getLesAuteurs(int intJeu) {
return lesAuteurs[intJeu];
}
public Class getLesClasses(int intJeu) {
return lesClasses[intJeu];
}
public String[] getLesFichiersSons(int intJeu) {
return lesFichiersSons[intJeu];
}
public int getLesJoueursMax(int intJeu) {
return lesJoueursMax[intJeu];
}
public int getLesJoueursMin(int intJeu) {
return lesJoueursMin[intJeu];
}
public String getLesNoms(int intJeu) {
return lesNoms[intJeu];
}
public String getLesRegles(int intJeu) {
return lesRegles[intJeu];
}
public Boolean getLesTypesDeJeux(int intJeu) {
return lesTypesDeJeux[intJeu];
}
public JarFile getLesJars (int intJeu){
return lesJars[intJeu];
}
public int getNbJeux () {
return lesClasses.length;
}
} |
Partager