Raw File
Commun.java
/*
 * Créé le 7 juin 04
 *
 */
package principal;

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Modifier;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import javax.swing.ImageIcon;

import fonction.magnitude.InterfaceFonctionFilsMagnitude;
import fonction.reel.InterfaceFonctionFilsReel;
import fonction.similitude.InterfaceFonctionFilsSimilitude;
import fonction.tpt.InterfaceFonctionFilsTPT;
import fonction.type.InterfaceFonctionFilsType;


/**
 * ensemble de données et de méthodes utilisées ŕ d'uatres endroits du programme.
 * 
 * @author	Vincent Labatut
 * @version	1
  */
public class Commun
{	
//	----------------------------------------	
//	Divers
//	----------------------------------------
    /**
	* version du programme
	 */
	public static Float VERSION = new Float(0.250); 

//	----------------------------------------	
//	codes pour identifier les fichiers
//	----------------------------------------
	/**
	* code des fichiers de stimulation
	 */
	public static final String FICHIER_CODE_ENTREE = "Stimulation"; 
	/**
	* code des fichiers d'observation
	 */
	public static final String FICHIER_CODE_OBSERVATION = "Observation"; 
	/**
	* code des fichiers de résultats
	 */
	public static final String FICHIER_CODE_RESULTAT = "Résultats"; 
	/**
	* code des fichiers de Projet
	 */
	public static final String FICHIER_CODE_PROJET = "Projet"; 
	/**
	* code des fichiers de Modele
	 */
	public static final String FICHIER_CODE_MODELE = "Modele"; 
	/**
	* code des fichiers de Noeud
	 */
	public static final String FICHIER_CODE_NOEUD = "Noeud"; 

//	----------------------------------------	
//	extensions associées aux fichiers
//	----------------------------------------
	/**
	* extensions des fichiers d'entrée
	 */
	public static final String EXT_ENTREE = ".entree"; 
	/**
	* extensions des fichiers d'observation
	 */
	public static final String EXT_OBSERVATION = ".obs"; 
	/**
	* extensions des fichiers de résultats
	 */
	public static final String EXT_RESULTAT = ".res"; 
	/**
	* extensions des fichiers de Projet
	 */
	public static final String EXT_PROJET = ".proj"; 
	/**
	* extensions des fichiers de Modele
	 */
	public static final String EXT_MODELE = ".modl"; 
	/**
	* extensions des fichiers de Noeud
	 */
	public static final String EXT_NOEUD = ".noeud"; 
	/**
	* extensions des fichiers de backup
	 */
	public static final String EXT_BACK = ".back"; 

//	----------------------------------------	
//	textes décrivant les différents types de fichiers
//	----------------------------------------
	/**
	* description des fichiers d'entrée
	 */
	public static final String FICHIER_DESCRIPTION_ENTREE = "Fichiers d'Entrées";
	/**
	* description des fichiers d'observation
	 */
	public static final String FICHIER_DESCRIPTION_OBSERVATION = "Fichiers d'Observations";
	/**
	* description des fichiers de résultats
	 */
	public static final String FICHIER_DESCRIPTION_RESULTAT = "Fichiers contenant des Résultats de simulation";
	/**
	* description des fichiers de Projet
	 */
	public static final String FICHIER_DESCRIPTION_PROJET = "Fichiers contenant un Projet";
	/**
	* description des fichiers de Modele
	 */
	public static final String FICHIER_DESCRIPTION_MODELE = "Fichiers contenant un Modele";
	/**
	* description des fichiers de Noeud
	 */
	public static final String FICHIER_DESCRIPTION_NOEUD = "Fichiers contenant un Noeud";

//	----------------------------------------	
//	description courte des fichiers
//	----------------------------------------
	/**
	* description courte des fichiers d'entrée
	 */
	public static final String FICHIER_TIP_ENTREE = "Fichier d'Entrée";
	/**
	* description courte des fichiers d'observation
	 */
	public static final String FICHIER_TIP_OBSERVATION = "Fichier d'Observation";
	/**
	* description courte des fichiers de résultat
	 */
	public static final String FICHIER_TIP_RESULTAT = "Fichier de Résultat";
	/**
	* description courte des fichiers de Projet
	 */
	public static final String FICHIER_TIP_PROJET = "Fichier Projet";
	/**
	* description courte des fichiers de Modele
	 */
	public static final String FICHIER_TIP_MODELE = "Fichier Modele";
	/**
	* description courte des fichiers de Noeud
	 */
	public static final String FICHIER_TIP_NOEUD = "Fichier Noeud";

//	----------------------------------------	
//	valeurs d'index
//	----------------------------------------
	/**
	* index dans un vecteur contenant un seul élément
	 */
	public static final int INDEX_UNIQUE = 0;
	/**
	* index dans un vecteur ŕ deux éléments : premier élément
	 */
	public static final int INDEX_PILE = 0;
	/**
	* index dans un vecteur ŕ deux éléments : second élément
	 */
	public static final int INDEX_FACE = 1;

//	----------------------------------------	
//	diverses chaines de caractčres
//	----------------------------------------
	/**
	* chaine représentant une absence de nom
	 */
	public static final String STRING_ACTIVATION = "Activation";
	public static final String STRING_AIDE = "Aide";
	public static final String STRING_ANONYME = "Anonyme";
	public static final String STRING_APPRENTISSAGE = "Apprentissage";
	public static final String STRING_APROPOS = "Ŕ propos";
	public static final String STRING_ARCHETYPE = "Archétype";
	public static final String STRING_CADRILLAGE = "Cadrillage";
	public static final String STRING_CHAMP_CATEGORIEL = "Champ Catégoriel";
	public static final String STRING_CHAMPS_CATEGORIELS = "Champs Catégoriels";
	public static final String STRING_COEUR = "Coeur";
	public static final String STRING_COLLE = "collé";
	public static final String STRING_COMPOSANTE_TPT = "Composante de TPT";
	public static final String STRING_COULEUR = "Couleur";
	public static final String STRING_DISTANCE = "Distance";
	public static final String STRING_DOMAINE = "Domaine";
	public static final String STRING_DOMAINE_SEPARATEUR = "x";
	public static final String STRING_DOMAINES = "Domaines";
	public static final String STRING_ECART_TYPE = "Ecart-type";
	public static final String STRING_EDITEUR = "Éditeur";
	public static final String STRING_EDITION = "Édition";
	public static final String STRING_EMISSION = "Émission";
	public static final String STRING_ENTREE = "Entrée";
	public static final String STRING_ENTREES = "Entrées";
	public static final String STRING_ET = "et";
	public static final String STRING_FAUX = "Faux";
	public static final String STRING_FICHIER = "Fichier";
	public static final String STRING_FICHIERS = "Fichiers";
	public static final String STRING_FONCTION = "Fonction";
	public static final String STRING_FONCTIONS = "Fonctions";
	public static final String STRING_GESTIONNAIRE = "Gestionnaire";
	public static final String STRING_GRAPHIQUE = "Graphique"; 
	public static final String STRING_GUI = "GUI";
	public static final String STRING_IMPORTE = "importé";
	public static final String STRING_INITIAL = "initial";
	public static final String STRING_INITIAUX = "initiaux";
	public static final String STRING_INITIALES = "initiales";
	public static final String STRING_INITIALE = "initiale";
	public static final String STRING_INSTANT = "Instant";
	public static final String STRING_MAGNITUDE = "Magnitude";
	public static final String STRING_MODELE = "Modčle";
	public static final String STRING_MODELES = "Modčles";
	public static final String STRING_MOTEUR = "Moteur";
	public static final String STRING_MOTEUR_DET = "Déterministe";
	public static final String STRING_MOTEUR_DD2 = "DD2";
	public static final String STRING_MOYENNE = "Moyenne";
	public static final String STRING_NOEUD = "Noeud";
	public static final String STRING_NOEUD_ENDOGENE = "Noeud Endogčne";
	public static final String STRING_NOEUD_EXOGENE = "Noeud Exogčne";
	public static final String STRING_NOEUD_STRUCTUREL = "Noeud Structurel";
	public static final String STRING_NOEUDS = "Noeuds";
	public static final String STRING_NONSIMULABLE = "Non-simulable";
	public static final String STRING_NOUVEAU = "Nouveau";
	public static final String STRING_NUMERIQUE = "Numérique"; 
	public static final String STRING_OBSERVATION = "Observation";
	public static final String STRING_OBSERVATIONS = "Observations";
	public static final String STRING_OPTION = "Option";
	public static final String STRING_OPTIONS = "Options";
	public static final String STRING_PARTIE_TYPE = "Partie de Type";
	public static final String STRING_PATH_SEPARATEUR = "/";
	public static final String STRING_POIDS = "Poids";
	public static final String STRING_PREFERENCE = "Préférence";
	public static final String STRING_PREFERENCES = "Préférences";
	public static final String STRING_PROJET = "Projet";
	public static final String STRING_RAGE = "Rage";
	public static final String STRING_REEL = "Réel";
	public static final String STRING_REFERENCE = "Référence";
	public static final String STRING_REPERTOIRE = "Répertoire";
	public static final String STRING_RESULTAT = "Résultat";
	public static final String STRING_RESULTATS = "Résultats";
	public static final String STRING_RESULTAT_SEPARATEUR = "@";
	public static final String STRING_SEPARATEUR = " - ";
	public static final String STRING_SESSION = "Session";
	public static final String STRING_SIMILITUDE = "Similitude";
	public static final String STRING_SIMULABLE = "Simulable";
	public static final String STRING_SIMULATION = "Simulation";
	public static final String STRING_SLOT = "Slot";
	public static final String STRING_SOMMAIRE = "Sommaire";
	public static final String STRING_SORTIE = "Sortie";
	public static final String STRING_SORTIES = "Sorties";
	public static final String STRING_SYMBOLE = "Symbole";
	public static final String STRING_SYMBOLES = "Symboles";
	public static final String STRING_TPT = "TPT";
	public static final String STRING_TYPE= "Type";
	public static final String STRING_TYPES= "Types";
	public static final String STRING_VALEUR = "Valeur";
	public static final String STRING_VALEURS = "Valeurs";
	public static final String STRING_VIDE = "<vide>";
	public static final String STRING_VRAI = "Vrai";
	public static final String STRING_VUE = "Vue"; 
	public static final String STRING_X = "X";
	public static final String STRING_Y = "Y";

//	----------------------------------------	
//	choix proposés dans les boites de dialogues
//	----------------------------------------
	/**
	* écraser l'existant lors d'un collage ou d'une importation
	 */
	public static final String OPTION_ECRASER_SI_PRESENT = "Écraser si présent";
	/**
	* créer les noeuds inexistants lors d'un collage ou d'une importation
	 */
	public static final String OPTION_CREER_NOEUD_SI_ABSENT= "Créer Noeud si absent";
	/**
	* créer les références (champCategoriels, Symboles) inexistants lors d'un collage ou d'une importation
	 */
	public static final String OPTION_CREER_REFERENCE_SI_ABSENTE = "Créer Référence si absente";

//	----------------------------------------	
//	noms abrégés
//	----------------------------------------
	/**
	* ChampCategoriel
	 */
	public static final String ABREV_CHAMP_CATEGORIEL = "CC";

//	----------------------------------------	
//	titres de fenętres
//	----------------------------------------
	// divers
	/**
	* dialogue d'information
	 */
	public static final String TITRE_INFORMATION = "Information";
	/**
	* dialogue message d'erreur
	 */
	public static final String TITRE_ERREUR = "Erreur";
	/**
	* dialogue d'ŕ propos
	 */
	public static final String TITRE_APROPOS = "Ŕ propos de Rage";
	/**
	* menu principal
	 */
	public static final String TITRE_PRINCIPAL = "Rage v."+Commun.VERSION; 
	// directives
	/**
	* demande d'entrer une chaine de caractčres
	 */
	public static final String TITRE_ENTRER_STRING = "Entrez une chaîne de caractčres";
	/**
	* demande d'entrer un réel
	 */
	public static final String TITRE_ENTRER_REEL = "Entrez un réel";
	/**
	* demande d'entrer un caractčre
	 */
	public static final String TITRE_ENTRER_CHAR = "Entrez un caractčre";
	/**
	* demande d'entrer un entier
	 */
	public static final String TITRE_ENTRER_ENTIER = "Entrez un entier";
	/**
	* demande d'entrer un booléen
	 */
	public static final String TITRE_ENTRER_BOOL = "Choisissez Vrai ou Faux";
	// fichiers
	/**
	* ouvrir un fichier
	 */
	public static final String TITRE_FICHIER_OUVRIR = "Sélectionnez le fichier ŕ ouvrir";
	/**
	* créer un fichier
	 */
	public static final String TITRE_FICHIER_CREER = "Entrez le nom du fichier ŕ créer";
	/**
	* créer un projet
	 */
	public static final String TITRE_PROJET_CREER = "Entrez le nom du projet ŕ créer";
	/**
	* ouvrir un répertoire (projet)
	 */
	public static final String TITRE_REPERTOIRE_OUVRIR = "Sélectionnez un répertoire";

//	----------------------------------------	
//	États des éléments constituant le projet
//	----------------------------------------
	/**
	* objet complet
	 */
	public static final String ETAT_COMPLET = "(0)";
	/**
	* objet incomplet
	 */
	public static final String ETAT_INCOMPLET = "(X)";
	/**
	* ouvrir modifié, pas encore enregistré
	 */
	public static final String ETAT_MODIFIE = "*";

//	----------------------------------------	
//	chemins de fichiers
//	----------------------------------------
	/**
	* chemin des images
	 */
	public static final String PATH_IMAGE = "/image";
	/**
	* chemin des images de fond
	 */
	public static final String PATH_FOND = PATH_IMAGE+"/fond";
	/**
	* chemin des icones
	 */
	public static final String PATH_ICONE = PATH_IMAGE+"/icone";
	/**
	* chemin de l'illustration affichée au démarrage
	 */
	public static final String PATH_SPLASH = PATH_FOND+"/splash.jpg";
	/**
	* chemin de l'illustration de l'ŕ propos
	 */
	public static final String PATH_APROPOS = PATH_FOND+"/aPropos.jpg";
	/**
	* chemin du fond d'écran du bureau
	 */
	public static final String PATH_WALLPAP = PATH_FOND+"/wallpap.jpg";
	/**
	* chemin de l'icone de l'application
	 */
	public static final String PATH_ICONE_RAGE = PATH_ICONE+"/rage.gif";
//	public static final String PATH_ICONE_PROJET_PT = PATH_ICONE+"/projetPt.gif";
	/**
	* chemin de l'icone de Projet
	 */
	public static final String PATH_ICONE_PROJET = PATH_ICONE+"/projet.gif";
//	public static final String PATH_ICONE_MODELE_PT = PATH_ICONE+"/modelePt.gif";
	/**
	* chemin de l'icone de Modele
	 */
	public static final String PATH_ICONE_MODELE = PATH_ICONE+"/modele.gif";
//	public static final String PATH_ICONE_NOEUD_PT = PATH_ICONE+"/noeudPt.gif";
	/**
	* chemin de l'icone de Noeud
	 */
	public static final String PATH_ICONE_NOEUD = PATH_ICONE+"/noeud.gif";
//	public static final String PATH_ICONE_ENTREE_PT = PATH_ICONE+"/entreePt.gif";
	/**
	* chemin de l'icone des entrées
	 */
	public static final String PATH_ICONE_ENTREE = PATH_ICONE+"/entree.gif";
//	public static final String PATH_ICONE_OBSERVATION_PT = PATH_ICONE+"/observationPt.gif";
	/**
	* chemin de l'icone des observations
	 */
	public static final String PATH_ICONE_OBSERVATION = PATH_ICONE+"/observation.gif";
//	public static final String PATH_ICONE_RESULTAT_PT = PATH_ICONE+"/resultatPt.gif";
	/**
	* chemin de l'icone des résultats
	 */
	public static final String PATH_ICONE_RESULTAT = PATH_ICONE+"/resultat.gif";

//	----------------------------------------	
//	actions proposées dans les menus/boutons
//	----------------------------------------
	// boutons
	public static final String ACTION_FERMER = "Fermer";
	public static final String ACTION_CONFIRMER = "Confirmer";
	public static final String ACTION_ANNULER= "Annuler";
	public static final String ACTION_RECOMMENCER = "Recommencer";
	public static final String ACTION_QUITTER = "Quitter";
	//
	public static final String ACTION_ACTIVER = "Activer";
	public static final String ACTION_DESACTIVER = "Désactiver";
	// simulation
	public static final String ACTION_DEMARRER = "Démarrer";
	public static final String ACTION_ARRETER = "Arręter";
	// undo/redo
	public static final String ACTION_UNDO = "Défaire";
	public static final String ACTION_REDO = "Refaire";
	// manipulation constituants
	public static final String ACTION_CREER = "Créer";
	public static final String ACTION_AJOUTER = "Ajouter";
	public static final String ACTION_SUPPRIMER = "Supprimer";
	public static final String ACTION_RETIRER = "Retirer";
	// copier/coller
	public static final String ACTION_COPIER = "Copier";
	public static final String ACTION_COUPER = "Couper";
	public static final String ACTION_COLLER = "Coller";
	// accčs fichier
	public static final String ACTION_IMPORTER = "Importer";
	public static final String ACTION_EXPORTER = "Exporter";
	public static final String ACTION_OUVRIR = "Ouvrir";
	public static final String ACTION_ENREGISTRER = "Enregistrer";
	public static final String ACTION_ENREGISTRER_SOUS = "Enregistrer sous...";
	// edition
	public static final String ACTION_EDITER = "Éditer";
	public static final String ACTION_SELECTIONNER = "Sélectionner";
	public static final String ACTION_NORMALISER = "Normaliser";
	// zoom
	public static final String ACTION_ZOOM_IN = "Zoom In";
	public static final String ACTION_ZOOM_OUT = "Zoom Out";	

//	----------------------------------------	
//	Messages d'information/erreur (boites de dialogue)
//	----------------------------------------
	// information
	public static final String MESSAGE_SIMULATION_TERMINEE = "La Simulation est terminée";
	public static final String MESSAGE_SIMULATION_INTERROMPUE = "La Simulation a été interrompue";
	// directives
	public static final String MESSAGE_ENTRER_VALEUR = "Entrez la valeur";		
	public static final String MESSAGE_ENTRER_VALEUR_VALIDE = "Entrez une valeur valide";
	public static final String MESSAGE_CHOISIR_COULEUR = "Choisissez une couleur.";
	// condition
	public static final String MESSAGE_CONDITION_PREFERENCE = "La préférence doit ętre comprise entre";
	public static final String MESSAGE_CONDITION_VALEUR = "La valeur doit ętre comprise entre";
	public static final String MESSAGE_CONDITION_INSTANT = "L'instant doit ętre positif et unique";
	public static final String MESSAGE_CONDITION_POIDS = "Le poids doit ętre compris entre ";
	// Erreur fichier
	public static final String MESSAGE_ERREUR_FICHIER_ACCES = "Erreur lors de l'accčs au fichier";
	public static final String MESSAGE_ERREUR_FICHIER_CONTENU = "Contenu invalide dans le fichier";
	public static final String MESSAGE_ERREUR_FICHIER_INTROUVABLE = "Impossible de trouver le fichier";
	public static final String MESSAGE_ERREUR_FICHIER_VERSION = "Version incompatible pour le fichier";
	public static final String MESSAGE_ERREUR_FICHIER_TYPE = "Le fichier n'est pas du bon type";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_PROJET = "Le fichier n'est pas un fichier Projet";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_MODELE = "Le fichier n'est pas un fichier Modčle";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_NOEUD = "Le fichier n'est pas un fichier Noeud";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_ENTREE = "Le fichier n'est pas un fichier d'Entrée";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_OBSERVATION = "Le fichier n'est pas un fichier d'Observation";
	public static final String MESSAGE_ERREUR_FICHIER_PAS_RESULTAT = "Le fichier n'est pas un fichier de Résultat";
	// erreur existant
	public static final String MESSAGE_ERREUR_EXISTANT_SYMBOLE = "Un Symbole de ce nom existe déjŕ dans ce Champ Categoriel";
	public static final String MESSAGE_ERREUR_EXISTANT_CHAMP_CATEGORIEL = "Un Champ Catégoriel de ce nom existe déjŕ dans ce Gestionnaire";
	public static final String MESSAGE_ERREUR_EXISTANT_NOEUD_MODELE = "Un Noeud ou un Slot de ce nom existe déjŕ dans ce Modčle";
	public static final String MESSAGE_ERREUR_EXISTANT_NOEUD_NOEUDSTRUCTUREL = "Un Noeud ou un Slot de ce nom existe déjŕ dans ce Modčle";
	public static final String MESSAGE_ERREUR_EXISTANT_MODELE = "Un Modčle de ce nom existe déjŕ dans ce Projet";
	public static final String MESSAGE_ERREUR_EXISTANT_TYPE = "Un Type de ce nom existe déjŕ dans ce Répertoire";
	public static final String MESSAGE_ERREUR_EXISTANT_ARCHETYPE = "Un Archétype de ce nom existe déjŕ dans cette TPT";
	public static final String MESSAGE_ERREUR_EXISTANT_RESULTAT = "Ce résultat est actuellement déjŕ ouvert.";
	// erreur divers
	public static final String MESSAGE_ERREUR_INCOMPLETUDE = "Problčme d'incomplétude";
	// a propos
	public static final String MESSAGE_APROPOS = "Rage : Réseaux Artificiels ŕ Grande Échelle.\n"
		+"version "+Commun.VERSION+"\n"
		+"© 2001-2004 INSERM unité 455\n";

//	----------------------------------------	
//	Icones utilisées dans l'application
//	----------------------------------------
	/**
	* icone de Projet
	 */
	public static final ImageIcon ICONE_P_PROJET = getImageIconPetit(Commun.PATH_ICONE_PROJET);
	/**
	* icone de Modele
	 */
	public static final ImageIcon ICONE_P_MODELE = getImageIconPetit(Commun.PATH_ICONE_MODELE);
	/**
	* icone de Noeud
	 */
	public static final ImageIcon ICONE_P_NOEUD = getImageIconPetit(Commun.PATH_ICONE_NOEUD);
	/**
	* icone d'entrée
	 */
	public static final ImageIcon ICONE_P_ENTREE = getImageIconPetit(Commun.PATH_ICONE_ENTREE);
	/**
	* icone d'observation
	 */
	public static final ImageIcon ICONE_P_OBSERVATION = getImageIconPetit(Commun.PATH_ICONE_OBSERVATION);
	/**
	* icone de résultat
	 */
	public static final ImageIcon ICONE_P_RESULTAT = getImageIconPetit(Commun.PATH_ICONE_RESULTAT);

//	----------------------------------------	
//	liste des fonctions existantes permettabt de définir le comportement des noeuds
//	----------------------------------------
	/**
	* liste des fonctions renvoyant une Magnitude
	 */
	public static final Vector VECTOR_IFF_MAGNITUDE = initVectorIFF(InterfaceFonctionFilsMagnitude.class); 
	/**
	* liste des fonctions renvoyant un réel
	 */
	public static final Vector VECTOR_IFF_REEL = initVectorIFF(InterfaceFonctionFilsReel.class); 
	/**
	* liste des fonctions renvoyant une Similitude
	 */
	public static final Vector VECTOR_IFF_SIMILITUDE = initVectorIFF(InterfaceFonctionFilsSimilitude.class); 
	/**
	* liste des fonctions renvoyant une TPT
	 */
	public static final Vector VECTOR_IFF_TPT = initVectorIFF(InterfaceFonctionFilsTPT.class); 
	/**
	* liste des fonctions renvoyant un Type
	 */
	public static final Vector VECTOR_IFF_TYPE = initVectorIFF(InterfaceFonctionFilsType.class); 
	
//	----------------------------------------	
//	Constructeurs
//	----------------------------------------
	/**
	 * crée cette boite ŕ outil commune.
	 * Méthode susceptible de réaliser certaines initialisations.
	 * 
	  */
	public Commun()
	{
	}
	
//	----------------------------------------	
//	Méthodes communes
//	----------------------------------------
	/**
	 * détermine et renvoie toutes les classes fonctions existantes, pour une interface passée en paramčtre.
	 *
	 * @param	inter	 interface dont on veut toutes les classes fonctions l'implémentant. Par exemple InterfaceFonctionFilsMagnitude permettra d'obtenir la liste de toutes les fonctions renvoyant une Magnitude.
	 * @return	un vecteur de Classes implémentant cette interfaces.
	  */
	public static Vector initVectorIFF(Class inter)
	{	Vector resultat = new Vector();

		try
		{	
			// init du nom du répertoire
			String packageName = inter.getPackage().getName();
			String interName = inter.getName();
			String filename = "/"+interName.replace('.','/')+".class";

			// on tente de localiser le package
			URL url = Commun.class.getResource(filename);
//System.out.println(url);
			File repertoire;
			URI uri = null;
			try
			{	uri = new URI(url.toString());
			}
			catch (URISyntaxException e2)
			{	e2.printStackTrace();
			} 

			// pas compressé ? on peut travailler dans le répertoire
			if (!uri.isOpaque())
			{	File[] list;
				int k;
				Class c;
		
				repertoire = new File(uri).getParentFile();
				// on liste les fichiers du dossier package
				list = repertoire.listFiles();
				// on regarde si le nom de fichier finit par .class
				for(k = 0; k<list.length; k++)
				{	String name = list[k].getName();
					if (name.endsWith(".class"))
					{	//on récupčre la classe
						try
						{	c = Class.forName(packageName+"."+name.substring(0, name.length()-6));
							//on teste si :
							// 1) elle implemente l'interface
							// 2) elle n'est pas elle-męme une interface
							// 3) elle n'est pas abstraite
							if (inter.isAssignableFrom(c) 
								&& !c.isInterface() 
								&& !Modifier.isAbstract(c.getModifiers()))
							{	// on l'ajoute aux résultats
								resultat.add(c);
							}
						}
						catch (ClassNotFoundException e)
						{	 e.printStackTrace();
						}
					}
				}
			}

			// compressé ? il faut parcourir l'archive
			else
			{	filename = packageName.replace('.','/');
				ZipFile zf;
				// d'abord on localise l'archive
				url = Commun.class.getProtectionDomain().getCodeSource().getLocation();
				try
				{	uri = new URI(url.toString());
				}
				catch (URISyntaxException e3)
				{	e3.printStackTrace();
				}
				
				// pui on l'ouvre
				File fZip = new File(uri);	
				zf = new ZipFile(fZip, ZipFile.OPEN_READ);
	
				// on cherche tout ce qui commence pareil que le répertoire/package
				ZipEntry entry;
				FileOutputStream fos;
				Enumeration entries = zf.entries();
				String entryName;
				Class c;
	
				while(entries.hasMoreElements())
				{	entry = (ZipEntry)entries.nextElement();
					entryName = entry.getName();
	        
					if(entryName.startsWith(filename))
					{	if (entryName.endsWith(".class"))
						{	//tu loades la classe
							try
							{	String className = entryName.replace('/','.');
								className = className.substring(0, className.length()-6);
								c = Class.forName(className);
								// męme traitement que plus haut
								if (inter.isAssignableFrom(c) && !c.isInterface() && !Modifier.isAbstract(c.getModifiers()))
								{	// et voila
									resultat.add(c);
								}
							}
							catch (ClassNotFoundException e)
							{	e.printStackTrace();
							}
						}
					}
				}
				zf.close();
				zf=null;
			}
		}
		catch (IOException e1)
		{	e1.printStackTrace();
		}
		
		// on renvoie le résultat
	  	return resultat;
	}
	/**
	 * duplique un fichier 'src' vers un emplacement 'dst'.
	 *
	 * @param	src	 le fichier source.
	 * @param	dst	 le path/fichier destination.
	 * @throws	IOException	si une erreur de fichier survient lors de la copie.
	  */
	public static void copierFichier(File src, File dst) throws IOException
	{	
		InputStream in = null;
		OutputStream out = null;
		try
		{	in = new FileInputStream(src);
			out = new FileOutputStream(dst);
		
			// Transfer bytes from in to out
			byte[] buf = new byte[1024];
			int len;
			while ((len = in.read(buf)) > 0) {
				out.write(buf, 0, len);
			}
			in.close();
			out.close();
		}
		catch (IOException e)
		{	if (in != null)
				in.close();
			if (out != null)
				out.close();
			throw e;			
		}
	}
	/**
	 * normalise un nom de fichier, c'est ŕ dire qu'on remplace tout caractčre
	 * interdit (ou susceptible de l'ętre) dans un nom de fichier par le 
	 * caractčre '_', et qu'on renvoie le résultat.
	 *
	 * @param	ancien	nom ŕ traiter.
	 * @return	le nom débarassé des caractčres interdits.
	  */
	public static String normaliserNom(String ancien)
	{	String nouveau = ancien;

		// d'abord on vire les éventuels espaces au début
		while (nouveau.startsWith(" "))
			nouveau = nouveau.substring(1);

		// et ŕ la fin
		while (nouveau.endsWith(" "))
			nouveau = nouveau.substring(0,nouveau.length()-1);
		
		// puis les caractčres spéciaux
		nouveau = nouveau.replace(':','_'); 
		nouveau = nouveau.replace('/','_'); 
		nouveau = nouveau.replace('\\','_'); 
		nouveau = nouveau.replace('~','_'); 
		nouveau = nouveau.replace('*','_'); 
		nouveau = nouveau.replace('?','_'); 
		
		return nouveau;
	}
	/**
	 * renvoie la partie 'extension' d'un nom de fichier.
	 *
	 * @param	fichier	fichier ŕ traiter.
	 * @return	l'extension du fichier.
	  */
	public static String getExtensionFichier(File fichier)
	{	String resultat = null;
		String s = fichier.getName();
		
		int i = s.lastIndexOf('.');

		if (i > 0 &&  i < s.length() - 1)
			resultat = s.substring(i).toLowerCase();
		
		return resultat;
	}
	/**
	 * renvoie une ImageIcon construite grâce ŕ l'image trouvée ŕ l'emplacement spécifié en paramčtre.
	 *
	 * @param	path	chemin du fichier contenant l'image.
	 * @return	un ImageIcon construit sur ce fichier.
	  */
	public static ImageIcon getImageIcon(String path)
	{	java.net.URL imgURL = Commun.class.getResource(path);
		return new ImageIcon(imgURL);
	}
	/**
	 * renvoie une ImageIcon construite grâce ŕ l'image trouvée ŕ l'emplacement spécifié en paramčtre.
	 * L'image est automatiquement redimensionnée ŕ une taille de 16x16 pixels si elle est trop grande.
	 *
	 * @param	path	chemin du fichier contenant l'image.
	 * @return	un ImageIcon de taille 16x16 pixels, construit sur ce fichier.
	  */
	public static ImageIcon getImageIconPetit(String path)
	{	java.net.URL imgURL = Commun.class.getResource(path);
		ImageIcon resultat = new ImageIcon(imgURL);
		Image i = resultat.getImage().getScaledInstance(16,16,Image.SCALE_FAST);		
		resultat.setImage(i);
		return resultat;
	}
}
back to top