
Sources JavaConsultez toutes les sources
Nombre d'auteurs : 29, nombre de sources : 134, création le 13 avril 2013
Sommaire→Divers- Thread : Priority Inversion Safe Binary Semaphore
- JNI : vider la console (C)
- JNI : Récuperer le types des disques (Delphi)
- Exemple de pile LIFO utilisant LinkedList
- Pile/File pour les débutants
- Modification dynamique du classpath
- Mécanisme de plugins au sein d'une application Java
- Requêtes multiples avec JDBC et JSP
- Connexion à une base de données quelconque
- Ordonnanceur : mini-OS
- Analyser les capacités d'une classe
- IndexedMap
Synchroniser des threads de priorites différentes.
Le mot cle synchronized utilise un sémaphore binaire qui n'empêche pas l'inversion de priorités, celui ci si, en utilisant le mécanisme d'héritage des priorités.
De plus sa file d'attente est prioritaire : le thread de plus haute priorité passe en premier.
Et pour l'utiliser, voici le parallele avec l'utilisation de synchronized :
// créer le sémaphore
Object o = new Object();
// prendre le sémaphore et attendre si necessaire
synchronized(o){
// rendre le sémaphore
}
// créer le sémaphore
PISBSem sem = new PISBSem();
// prendre le sémaphore et attendre si necessaire
sem.take();
// rendre le sémaphore
sem.give();
Cet exemple met en évidence l'utilisation de JNI (Java Native Interface). Il permet de vider la console. Le code C utilisé est théoriquement "portable", il suffira de le recompiler selon la plateforme utilisée. Il suffit d'appeler :
ClearScreen.clear();
Cet exemple met en évidence l'utilisation de JNI (Java Native Interface) en combinaison avec du code Delphi.
Exemple d'utilisation :
String drive = "c:\\";
int type = DriveInfo.getDriveType(drive);
switch(type){
case DriveInfo.FIXED :
System.out.println("c:\\ est un disque dur");
break;
default:break;
}
boolean amovible = DriveInfo.isRemovable(drive);
System.out.println("c:\\ amovible : "+amovible);
File[] roots = File.listRoots();
for(int i = 0; i < roots.length; i++){
File root = roots[i];
String name = root.getPath();
System.out.println(name+" : "+DriveInfo.getDriveInfo(name));
}
Le but n'est pas de réinventer la roue, mais juste d'utiliser une classe qui porte le nom 'Stack' ou 'Pile' pour plus de clarté dans le code source sans plomber les performances avec la classe Stack de Java 1.
L'implémentation proposée ici est basée sur le modèle des collections de Java2, elle utilise une interface Stack et une classe concrète LinkedStack.
Voici un petit prog qui présente le principe de la pile et de la file avec une pointe de polymorphisme (naturel en java). Ce code est surtout destiné aux étudiants BAC+2 puisque c'est une architecture que l'on étudie en cours. Donc rien de bien extraordinaire mais au moins il marche très bien !
Bien qu'il ne soit pas possible de modifier dynamiquement le classpath, cette classe permet de contourner le problème en appelant directement la méthode protégée "addURL" du ClassLoader. Utilisant l'introspection, cette classe permet également d'appeler toutes les méthodes privées et protégées de n'importe quel objet.
Cet outil permet de lister une catègorie de plugins disponible.
Il permet l'abstraction de l'emplacement physiques des plugins.
Ceux-ci peuvent être dans plusieurs JAR, des repertoires etc.
La recherche des plugins se fait sur 3 critères :
- Accessiblent par le classpath de l'application
- Doivent se trouver dans un package determiné (sous-packages inclus)
- Doivent hériter d'une classe mère de plugin (definit par vos soin)
Cette classe à pour rôle de vous aider a réaliser un mécanisme de plugins au sein d'une application JAVA.
package org.XXXXXXXX;
import java.util.*;
import java.util.zip.*;
import java.io.*;
import java.net.*;
/**
* PluginInspector
* Ce module s'occupe de dresser une liste des "plugins" disponibles au sein d'une application JAVA
* Ce code n'est qu'a titre d'exemple sur comment faire un outils permettant d'ajouter des plugins.
*
* L'idée de cet inspecteur est d'imposer un package pour les plugins et d'utiliser le classLoader afin
* de determiner toutes les classes.
* Il est ainsi possible de rajouter par la suite un fichier JAR contenant de nouveaux plugins et qu'ils
* soient automatiquement pris en comptes par l'application (pour peu que le fichier JAR soit rajouté correctement au classpath)
*
* Un "PluginInspector" s'appuie sur deux elements pour identifier les plugins
* - Le package de recherche (ainsi que tous les sous-packages)
* - La classe mère des plugins afin de s'assurer qu'une classe est effectivement un plugin
*
* Il est possible d'avoir plusieurs "PluginInspector" pour gérer differentes natures de plugins
*
* Exemple :
* - les plugins sont installés dans le package org.myApplic.plugins
* - La classe mère des plugins est org.myApplic.util.Plugin
*
* Récuperation des plugins de l'application :
* Iterator plugins = new PluginInspector("org.myApplic.plugins",org.myApplic.util.Plugin.class).plugins();
* while( plugins.hasNext() )
* { Class plugin = (Class)plugins.next();
* System.out.println("Plugin Loaded : " + plugin);
* }
*
* Remarque : le PluginInspector charge les classes lors de l'examen, ce qui n'est pas un mauvais choix pour
* un mécanisme de plugins, mais ce mécanisme pourait être assez pénalisant pour un usage detourné
*
* @author André Sébastien
*/
public class PluginInspector {
/** Nom du package des plugins **/
private String pluginPackage = null;
/** Classe mere de tous les plugins **/
private Class pluginHomeClass = null;
/** Repertoire (en terme de resource) des plugins **/
private String pluginResourceName = null;
/** Repertoire (en terme de fileSystem) des plugins **/
private String pluginFileName = null;
/** Liste des plugins **/
private List plugins = new ArrayList();
/** Filtre utilisé lors d'un examen de repertoire physique **/
private static final FileFilter filter = new FileFilter()
{
public boolean accept(File pathname)
{ if(pathname.isDirectory() ) return true;
if(!pathname.isFile() ) return false;
String path = pathname.getAbsolutePath();
if( ! path.endsWith(".class") ) return false;
if( path.indexOf('$') >= 0 ) return false;
return true;
}
};
/** Constructeur
* @param packageName Package dont doivent faire partie les plugins (sous-packages compris)
* @param pluginHomeClass Class mére de tous les plugins, si null alors, il sera considéré Object.class comme class mère de tous les plugins
**/
public PluginInspector(String packageName , Class pluginHomeClass )
{
/** Initialisation **/
this.pluginPackage = packageName;
this.pluginHomeClass = pluginHomeClass;
if( this.pluginHomeClass == null ) this.pluginHomeClass = Object.class;
/** On calcul le repertoire d'acces aux repertoires **/
this.pluginResourceName = this.pluginPackage.replace('.','/');
this.pluginFileName = this.pluginPackage.replace('.', File.separatorChar );
/** Lance l'examen de l'application **/
this.examine();
}
/** Retourne la liste des plugins accessiblent (objets "Class") **/
public Iterator plugins()
{ return this.plugins.iterator(); }
/** Examine l'application pour determiner les plugins accessibles **/
private void examine()
{ try
{ Enumeration e = this.getClass().getClassLoader().getResources( this.pluginResourceName );
while( e.hasMoreElements() )
{ URL url = (URL)e.nextElement();
String protocol = url.getProtocol();
if( protocol.equals("file") ) this.examineFromDirectory( new File(url.getFile() ) );
else if( protocol.equals("jar")) this.examineFromJar(url);
}
}
catch(Exception e){ e.printStackTrace(); }
}
/** Examine les plugins à partir d'un repertoire physique **/
private void examineFromDirectory(File directory)
{ if( ! directory.isDirectory() ) return;
try
{
File[] files = directory.listFiles( this.filter );
for(int i = 0 ; i < files.length ; i++)
{ File file = files[i];
if( file.isDirectory() )
{ this.examineFromDirectory( file );
continue;
}
/** Transformer le chemin en package **/
String name = file.getAbsolutePath();
int pos = name.indexOf( this.pluginFileName );
if( pos == -1 ) continue;
name = name.substring( pos , name.length() - 6 ).replace( File.separatorChar , '.');
/** Charger le plugin **/
Class plugin = this.getClass().forName(name);
if( ! this.pluginHomeClass.isAssignableFrom( plugin ) ) continue;
if( this.plugins.contains( plugin ) ) continue;
this.plugins.add(plugin);
}
}
catch(Exception e){ e.printStackTrace(); }
}
/** Examine les plugins à partir d'un JAR **/
private void examineFromJar(URL url)
{ String jarName = url.getFile();
jarName = jarName.substring( jarName.indexOf(':') );
jarName = jarName.substring(0 , jarName.indexOf('!' ) );
jarName = jarName.replace('/', File.separatorChar );
try
{
ZipFile zipFile = new ZipFile(jarName);
Enumeration e = zipFile.entries();
while( e.hasMoreElements() )
{ ZipEntry entry = (ZipEntry)e.nextElement();
String name = entry.getName();
if( ! name.endsWith(".class") ) continue;
if( ! name.startsWith( this.pluginResourceName ) ) continue;
if( name.indexOf('$') >= 0 ) continue;
/** suppression du .class et remise sous forme de package **/
name = name.substring(0, name.length() - 6 );
name = name.replace('/','.');
/** Charger le plugin **/
Class plugin = this.getClass().forName(name);
if( ! this.pluginHomeClass.isAssignableFrom( plugin ) ) continue;
if( this.plugins.contains( plugin ) ) continue;
this.plugins.add(plugin);
}
zipFile.close();
}
catch(Exception e){ e.printStackTrace(); }
}
}
Voici un exemple qui va vous permettre d'envoyer un ensemble de requêtes simultanément à une base de données, les réponses de chaque requête s'afficheront dans des tableaux dans la page JSP ... un exemple du résultat (la capture d'écran quoi !) se trouve dans le fichier ZIP au format PDF. Attention : ce code n'est pas un exemple à prendre pour de la bonne prog, c'est un peu bourrin ... c'est un truc que j'avais fait rapidement en cours ...
La classe SQLService permet de se connecter à une base de donnée quelconque et d'effectuer des requêtes SQL transmises sous forme d'une chaîne de caractères. Les réponses sont également fournies sous forme de chaînes de caractères. Le programme SQLInterface est une interface graphique mettant en oeuvre la classe SQLService en proposant deux exemples: une connexion à une base MySQL et une connexion à un fichier Microsoft Access.
Voici le résultat d'un exercice d'un cours de temps réel : un ordonnanceur non temps réel !!!! Le programme suivant présente la structure d'un mini système d'exploitation (ordonnanceur principalement !), la structure du programme n'est pas celle réellement d'un vrai système d'exploitation notamment à du passage d'objet en paramètres et le manque d'interruptions et de boîtes aux lettres mais au moins cela montre les ordonnanceurs (priorité, aléatoire, réparti)!!!
J'y ai joint un petit document (mon compte rendu de TP) afin que vous compreniez ce qu'est un ordonnanceur pour ceux qui ne savent pas ... et c'est à l'intérieur que vous aurez l'ensemble des commandes ainsi que les paramètres !!!!
Un petit fichier d'aide vous montre comment procéder !!! LISEZ LE !!!!
@+
Ce code vous demande de saisir un nom d'objet et il affiche tous les constructeur, méthodes, champs et parent de cet objet.
Implémentation d'une Map gérant en interne une "List" afin de pouvoir ordonner et récuperer les éléments de la Map a travers des "index". cf la javadoc de la classe pour plus de details.


