Index: lutinutil/src/java/org/codelutin/util/CategorisedListenerSet.java diff -u lutinutil/src/java/org/codelutin/util/CategorisedListenerSet.java:1.5 lutinutil/src/java/org/codelutin/util/CategorisedListenerSet.java:1.6 --- lutinutil/src/java/org/codelutin/util/CategorisedListenerSet.java:1.5 Thu Oct 14 19:39:03 2004 +++ lutinutil/src/java/org/codelutin/util/CategorisedListenerSet.java Fri Jun 3 13:54:23 2005 @@ -23,10 +23,10 @@ * * @author Benjamin Poussin * Copyright Code Lutin - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ * - * Mise a jour: $Date: 2004/10/14 19:39:03 $ - * par : $Author: pineau $ + * Mise a jour: $Date: 2005/06/03 13:54:23 $ + * par : $Author: bpoussin $ */ package org.codelutin.util; @@ -122,11 +122,15 @@ */ public void fire(Object category, String methodName, Object event) throws Exception { - for(Iterator i=iterator(category); i.hasNext();){ + Log.logDevFinest("org.codelutin.util.CategorisedListenerSet.fire", "fire category: " + category + " method: " + methodName); + getAllListeners(category).fire(methodName, event); +/* for(Iterator i=iterator(category); i.hasNext();){ Object o = i.next(); + Log.logDevFinest("org.codelutin.util.CategorisedListenerSet.fire", "fire on: " + o); Statement stm = new Statement(o, methodName, new Object[]{event}); stm.execute(); } +*/ } /** * Permet de lancer un event dans une categorie, l'event est aussi propagé @@ -162,11 +166,13 @@ result.addAll((ListenerSet)i.next()); } }else{ - while(category != null){ - result.addAll(getListeners(category)); - category = categoryParent.get(category); + Object parentCategory = category; + while(parentCategory != null){ + result.addAll(getListeners(parentCategory)); + parentCategory = categoryParent.get(parentCategory); } } + Log.logDevFinest("org.codelutin.util.CategorisedListenerSet.getListeners", "getAllListeners category: " + category + " result: " + result); return result; } @@ -179,7 +185,13 @@ if(result == null){ listeners.put(category, result = new ListenerSet(listenerClass)); } + Log.logDevFinest("org.codelutin.util.CategorisedListenerSet.getListeners", "getListeners category: " + category + " result: " + result); return result; } + + public String toString(){ + return "Listener class:" + listenerClass + "\nCategory: " + categoryParent + "\nListener: " + listeners; + } + } // CategorisedListenerSet Index: lutinutil/src/java/org/codelutin/util/FileUtil.java diff -u lutinutil/src/java/org/codelutin/util/FileUtil.java:1.1 lutinutil/src/java/org/codelutin/util/FileUtil.java:1.2 --- lutinutil/src/java/org/codelutin/util/FileUtil.java:1.1 Mon Nov 22 16:14:10 2004 +++ lutinutil/src/java/org/codelutin/util/FileUtil.java Fri Jun 3 13:54:23 2005 @@ -23,9 +23,9 @@ * Created: 22 nov. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * - * Mise a jour: $Date: 2004/11/22 16:14:10 $ + * Mise a jour: $Date: 2005/06/03 13:54:23 $ * par : $Author: bpoussin $ */ @@ -44,9 +44,6 @@ public boolean doAction(File f); } - - - /** * Retourne tous les sous répertoires du répertoire passé en argument. * @param directory un répertoire @@ -126,6 +123,15 @@ } } return result; + } + + /** + * Supprime recursivement tout le contenu d'un répertoire. + * @return vrai si tout se passe bien, false si la suppression d'un élement + * se passe mal + */ + public static boolean deleteRecursively(String directory) { + return deleteRecursively(new File(directory)); } /** Index: lutinutil/src/java/org/codelutin/util/ListenerSet.java diff -u lutinutil/src/java/org/codelutin/util/ListenerSet.java:1.4 lutinutil/src/java/org/codelutin/util/ListenerSet.java:1.5 --- lutinutil/src/java/org/codelutin/util/ListenerSet.java:1.4 Thu Oct 14 19:39:03 2004 +++ lutinutil/src/java/org/codelutin/util/ListenerSet.java Fri Jun 3 13:54:23 2005 @@ -15,7 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *##%*/ - /* * * ListenerSet.java * @@ -23,202 +22,272 @@ * * @author Benjamin Poussin * Copyright Code Lutin - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * - * Mise a jour: $Date: 2004/10/14 19:39:03 $ - * par : $Author: pineau $ + * Mise a jour: $Date: 2005/06/03 13:54:23 $ + * par : $Author: bpoussin $ */ - package org.codelutin.util; +import java.beans.Statement; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.HashSet; import java.util.Iterator; -import java.beans.Statement; -import java.lang.ref.WeakReference; -import java.lang.ref.Reference; /** -*

Cette classe permet de mettre en place facilement le support de listeners. -* Elle ne permet d'ajouter qu'une seul fois le meme listener. Si elle est -* la derniere à avoir une référence sur le listener, le listener est supprimé -* de la liste des listeners.

-*

Si on souhaite avoir une vérification sur le type de listener ajouté -* il faut utiliser le constructeur qui prend une classe en paramètre. Dans ce -* cas la méthode {@link #addListener} vérifie que l'object passé est bien -* du type ou un enfant du type donné en paramètre du constructeur -*

Il y a deux façon de prévenir les listeners d'un event soit par le -* mécanisme inclu dans cette classe en utilisant la méthode {@link #fire} soit -* en utilisant soit même l'Iterateur sur les listeners encore valide.

-*
-* ListenerSet listeners = new ListenerSet();
-* ...
-* listeners.fire("monEvent", MonObjetEvent);
-* 
-* ou bien -*
-* ListenerSet listeners = new ListenerSet();
-* ...
-* for(Iterator i=listeners.iterator(); i.hasNext();){
-*     MonListener l = (MonListener)i.next();
-*     l.monEvent(MonObjetEvent);
-* }
-* 
-* Cette deuxième façon de faire est plus sûr car elle n'utilise pas -* l'introspection et donc une vérification est faite sur le nom de la méthode -* à appeler à la compilation, mais elle est plus verbeuse à écrire. -* @see org.codelutin.util.CategorisedListenerSet -*/ + *

Cette classe permet de mettre en place facilement le support de listeners. + * Elle ne permet d'ajouter qu'une seul fois le meme listener. Si elle est + * la derniere à avoir une référence sur le listener, le listener est supprimé + * de la liste des listeners.

+ *

Si on souhaite avoir une vérification sur le type de listener ajouté + * il faut utiliser le constructeur qui prend une classe en paramètre. Dans ce + * cas la méthode {@link #addListener} vérifie que l'object passé est bien + * du type ou un enfant du type donné en paramètre du constructeur + *

Il y a deux façon de prévenir les listeners d'un event soit par le + * mécanisme inclu dans cette classe en utilisant la méthode {@link #fire} soit + * en utilisant soit même l'Iterateur sur les listeners encore valide.

+ *
+ * ListenerSet listeners = new ListenerSet();
+ * ...
+ * listeners.fire("monEvent", MonObjetEvent);
+ * 
+ * ou bien + *
+ * ListenerSet listeners = new ListenerSet();
+ * ...
+ * for(Iterator i=listeners.iterator(); i.hasNext();){
+ *     MonListener l = (MonListener)i.next();
+ *     l.monEvent(MonObjetEvent);
+ * }
+ * 
+ * Cette deuxième façon de faire est plus sûr car elle n'utilise pas + * l'introspection et donc une vérification est faite sur le nom de la méthode + * à appeler à la compilation, mais elle est plus verbeuse à écrire. + * + * @see org.codelutin.util.CategorisedListenerSet + */ public class ListenerSet { // ListenerSet - protected Class listenerClass = null; - protected HashSet listeners = new HashSet(); + /** DOCUMENTME Description of the Field */ + protected Class listenerClass = null; + /** DOCUMENTME Description of the Field */ + protected HashSet listeners = new HashSet(); - public ListenerSet(){} + /** DOCUMENTME Constructor for the ListenerSet object */ + public ListenerSet() { } /** - * Constructeur permettant de passer une classe que devra s'attisfaire les - * listener que l'on souhaite ajouter - */ - public ListenerSet(Class listenerClass){ + * Constructeur permettant de passer une classe que devra s'attisfaire les + * listener que l'on souhaite ajouter + * + * @param listenerClass DOCUMENTME Description of the Parameter + */ + public ListenerSet(Class listenerClass) { this.listenerClass = listenerClass; } /** - * ajoute tous les listeners d'un ListenerSet - */ - public void addAll(ListenerSet ls){ - if(listenerClass == null || (ls.listenerClass != null && - listenerClass.isAssignableFrom(ls.listenerClass))){ - listeners.addAll(ls.listeners); - }else{ - throw new IllegalArgumentException("Listener object (" - + ls.listenerClass + ") is not compatible with : " - + listenerClass); - } - } - - /** - * Ajoute un listener dans la liste des listeners. - * @param l le listener à ajouter. Si l'objet passé est null, rien n'est fait - * si l'objet n'est pas du type passé en argument du constructeur - * une IllegalArgumentException est levée. - */ - public void add(Object l){ - if(l == null){ + * Ajoute un listener dans la liste des listeners. + * + * @param l le listener à ajouter. Si l'objet passé est null, rien n'est fait + * si l'objet n'est pas du type passé en argument du constructeur + * une IllegalArgumentException est levée. + */ + public void add(Object l) { + if (l == null) { return; } - if(listenerClass == null || listenerClass.isInstance(l)){ - TransparenteWeakReference ref = new TransparenteWeakReference(l); + if (listenerClass == null || listenerClass.isInstance(l)) { + TransparenteWeakReference ref = new TransparenteWeakReference(l); listeners.add(ref); - }else{ + } else { throw new IllegalArgumentException("Listener object (" - + l.getClass().getName() + ") is not compatible with class: " - + listenerClass.getName()); + + l.getClass().getName() + ") is not compatible with class: " + + listenerClass.getName()); } } - public void remove(Object l){ - TransparenteWeakReference ref = new TransparenteWeakReference(l); - listeners.remove(ref); - } - - public Iterator iterator(){ - return new ReferenceIterator(listeners.iterator()); + /** + * ajoute tous les listeners d'un ListenerSet + * + * @param ls The feature to be added to the All attribute + */ + public void addAll(ListenerSet ls) { + if (listenerClass == null || (ls.listenerClass != null && + listenerClass.isAssignableFrom(ls.listenerClass))) { + listeners.addAll(ls.listeners); + } else { + throw new IllegalArgumentException("Listener object (" + + ls.listenerClass + ") is not compatible with : " + + listenerClass); + } } /** - * Appel la méthode du listener en passant l'objet event en paramètre - * Cette méthode echoue si la methode ou l'objet contenant la methode a - * appeler n'est pas public - * @param event l'event a passer en parametre de la methode a appeler - */ + * Appel la méthode du listener en passant l'objet event en paramètre + * Cette méthode echoue si la methode ou l'objet contenant la methode a + * appeler n'est pas public + * + * @param event l'event a passer en parametre de la methode a appeler + * @param methodName DOCUMENTME Description of the Parameter + * @exception Exception DOCUMENTME Description of the Exception + */ public void fire(String methodName, Object event) throws Exception { - for(Iterator i=iterator(); i.hasNext();){ - Object o = i.next(); + for (Iterator i = iterator(); i.hasNext(); ) { + Object o = i.next(); Statement stm = new Statement(o, methodName, new Object[]{event}); stm.execute(); } } /** - * Appel la méthode du listener sans argument - * Cette méthode echoue si la methode ou l'objet contenant la methode a - * appeler n'est pas public - */ + * Appel la méthode du listener sans argument + * Cette méthode echoue si la methode ou l'objet contenant la methode a + * appeler n'est pas public + * + * @param methodName DOCUMENTME Description of the Parameter + * @exception Exception DOCUMENTME Description of the Exception + */ public void fire(String methodName) throws Exception { - for(Iterator i=iterator(); i.hasNext();){ - Object o = i.next(); + for (Iterator i = iterator(); i.hasNext(); ) { + Object o = i.next(); Statement stm = new Statement(o, methodName, null); stm.execute(); } } /** - * Cette classe etant WeakReference et surcharge les méthodes equals et - * hashCode pour que ces méthodes retournes les mêmes résultat que les objets - * contenu. - */ - static class TransparenteWeakReference extends WeakReference { - public TransparenteWeakReference(Object o ){ - super(o); - } - public boolean equals(Object o){ - // on travail avec un variable local pour ne pas etre obligé de - // synchroniser la méthode - Object local = get(); - if(o instanceof Reference){ - o = ((Reference)o).get(); - } - - return (o == null && local == null) - || (o != null && o.equals(local)); - } + * DOCUMENTME Method + * + * @return DOCUMENTME Description of the Return Value + */ + public Iterator iterator() { + return new ReferenceIterator(listeners.iterator()); + } - public int hashCode(){ - // on travail avec une variable local pour ne pas etre obligé de - // synchroniser la méthode - Object local = get(); - if(local== null) return 0; - return local.hashCode(); - } + /** + * DOCUMENTME Method + * + * @param l DOCUMENTME Description of the Parameter + */ + public void remove(Object l) { + TransparenteWeakReference ref = new TransparenteWeakReference(l); + listeners.remove(ref); } /** - * Iterator qui supprime les references vides lors du parcours - */ + * DOCUMENTME Method + * + * @return DOCUMENTME Description of the Return Value + */ + public String toString() { + return "" + listeners; + } + + /** Iterator qui supprime les references vides lors du parcours */ static class ReferenceIterator implements Iterator { - protected Iterator iter = null; - protected Object nextObject = null; + /** DOCUMENTME Description of the Field */ + protected Iterator iter = null; + /** DOCUMENTME Description of the Field */ + protected Object nextObject = null; /** - * Un iterator contenant des References - */ - public ReferenceIterator(Iterator iter){ + * Un iterator contenant des References + * + * @param iter DOCUMENTME Description of the Parameter + */ + public ReferenceIterator(Iterator iter) { this.iter = iter; findNext(); } - public boolean hasNext(){ + + /** DOCUMENTME Method */ + protected void findNext() { + while (iter.hasNext() && nextObject == null) { + Reference ref = (Reference)iter.next(); + Object o = ref.get(); + if (o != null) { + nextObject = o; + } else { + iter.remove(); + } + } + } + + /** + * DOCUMENTME Method + * + * @return DOCUMENTME Description of the Return Value + */ + public boolean hasNext() { return nextObject != null; } - public Object next(){ - Object result = nextObject; + + /** + * DOCUMENTME Method + * + * @return DOCUMENTME Description of the Return Value + */ + public Object next() { + Object result = nextObject; nextObject = null; findNext(); return result; } - public void remove(){ + + /** DOCUMENTME Method */ + public void remove() { iter.remove(); } - protected void findNext(){ - while(iter.hasNext() && nextObject == null){ - Reference ref = (Reference)iter.next(); - Object o = ref.get(); - if (o != null){ - nextObject = o; - }else{ - iter.remove(); - } + } + + /** + * Cette classe etant WeakReference et surcharge les méthodes equals et + * hashCode pour que ces méthodes retournes les mêmes résultat que les objets + * contenu. + */ + static class TransparenteWeakReference extends WeakReference { + /** + *DOCUMENTME Constructor for the TransparenteWeakReference object + * + * @param o DOCUMENTME Description of the Parameter + */ + public TransparenteWeakReference(Object o) { + super(o); + } + + /** + * DOCUMENTME Method + * + * @param o DOCUMENTME Description of the Parameter + * @return DOCUMENTME Description of the Return Value + */ + public boolean equals(Object o) { + // on travail avec un variable local pour ne pas etre obligé de + // synchroniser la méthode + Object local = get(); + if (o instanceof Reference) { + o = ((Reference)o).get(); } + + return (o == null && local == null) + || (o != null && o.equals(local)); + } + + /** + * DOCUMENTME Method + * + * @return DOCUMENTME Description of the Return Value + */ + public int hashCode() { + // on travail avec une variable local pour ne pas etre obligé de + // synchroniser la méthode + Object local = get(); + if (local == null) { + return 0; + } + return local.hashCode(); } } Index: lutinutil/src/java/org/codelutin/util/Log.java diff -u lutinutil/src/java/org/codelutin/util/Log.java:1.4 lutinutil/src/java/org/codelutin/util/Log.java:1.5 --- lutinutil/src/java/org/codelutin/util/Log.java:1.4 Mon Aug 16 15:01:33 2004 +++ lutinutil/src/java/org/codelutin/util/Log.java Fri Jun 3 13:54:23 2005 @@ -23,9 +23,9 @@ * Created: 12 août 2004 * * @author Benjamin Poussin - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * - * Mise a jour: $Date: 2004/08/16 15:01:33 $ + * Mise a jour: $Date: 2005/06/03 13:54:23 $ * par : $Author: bpoussin $ */ @@ -174,6 +174,7 @@ static protected void fire(String category, Level level, String message, Throwable exception){ LogEvent e = new LogEvent(null, category, level, message, exception); try{ + logDevFinest("org.codelutin.util.Log.fire", "Category: " + category + " listeners enregistrés: " + listeners); listeners.fire(category, "logMessage", e); listeners.fire(LOG_INSTANCE, "logMessage", e); }catch(Exception eee){ @@ -184,6 +185,7 @@ static protected void fire(String category, String message, int max, int value){ LogEvent e = new LogEvent(null, category, message, max, value); try{ + log("org.codelutin.util.Log.fire", Level.FINEST, "Category: " + category + " listeners enregistrés: " + listeners, null); listeners.fire(category, "logTask", e); listeners.fire(LOG_INSTANCE, "logTask", e); }catch(Exception eee){ @@ -202,7 +204,7 @@ } static public void logUserInfo(String category, String message, Throwable e){ - Logger.getLogger(category).log(USER_INFO, message); + log(category, USER_INFO, message, e); fire(category, USER_INFO, message, e); } @@ -220,7 +222,7 @@ * @param current la valeur courante de la tache. */ static public void logTask(String category, String message, int max, int current){ - Logger.getLogger(category).log(USER_INFO, "task: " + message + "["+current+"/"+max+"]"); + log(category, USER_INFO, "task: " + message + "["+current+"/"+max+"]", null); fire(category, message, max, current); } Index: lutinutil/src/java/org/codelutin/util/Resource.java diff -u lutinutil/src/java/org/codelutin/util/Resource.java:1.20 lutinutil/src/java/org/codelutin/util/Resource.java:1.21 --- lutinutil/src/java/org/codelutin/util/Resource.java:1.20 Thu Dec 23 18:19:15 2004 +++ lutinutil/src/java/org/codelutin/util/Resource.java Fri Jun 3 13:54:23 2005 @@ -23,9 +23,9 @@ * * @author POUSSIN Benjamin * Copyright Code Lutin -* @version $Revision: 1.20 $ +* @version $Revision: 1.21 $ * -* Mise a jour: $Date: 2004/12/23 18:19:15 $ +* Mise a jour: $Date: 2005/06/03 13:54:23 $ * par : $Author: bpoussin $ */ @@ -44,10 +44,13 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.Properties; import java.util.StringTokenizer; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.swing.ImageIcon; +import java.util.logging.Level; +import java.util.logging.Logger; /** @@ -58,6 +61,9 @@ */ public class Resource { // Resource + /** to use log facility, just put in your code: log.info(\"...\"); */ + private static Logger log = Logger.getLogger("org.codelutin.util.Resource"); + protected Resource() { } @@ -131,44 +137,40 @@ } } -// /** -// * Method findResource -// * Recherche une ressource en structant la variable java.class.path -// * du systeme, elle correspond au CLASSPATH -// * @param name le nom de la ressource rechercher -// * @return URL retourne null si une erreur c produite ou que la ressource -// * n'a pas ete trouvee. -// */ -// static protected URL findResource(String name){ -// URL result = null; -// try{ -// on supprime le / devant le nom de la ressource, sinon elle -// n'est pas trouve (pas de recherche dans les differents -// element du classpath. -// if(name.length() > 1 && name.startsWith("/")){ -// name = name.substring(1); -// } -// String cp = System.getProperty("java.class.path", "."); -// StringTokenizer stok = new StringTokenizer(cp, File.pathSeparator); -// URL url[] = new URL[stok.countTokens()]; -// int i=0; -// while(stok.hasMoreTokens()){ -// url[i++] = new File(stok.nextToken()).toURI().toURL(); -// } -// URLClassLoader ucl = URLClassLoader.newInstance(url); -// result = ucl.findResource(name); -// }catch(MalformedURLException e){ -// Logger.getLogger("org.codelutin.util.Resource.findResource").fine("Erreur lors de la recherche de la ressource:"+name); -// } -// if (result==null) { -// ClassLoader cl = Resource.class.getClassLoader(); - ClassLoader cl = Thread.currentThread().getContextClassLoader(); -// result = cl.getResource(name); -// } -// -// return result; -// } + /** + * Recherche et retourne l'objet properties de configuration à utiliser. + * Les différents fichiers trouvé sont chainé. L'ordre de recherche est + * le classpath, le fichier dans /etc et enfin le chemin sur le filesystem + * @param le nom du fichier à rechercher + * @return l'objet Properties de configuration + */ + static public Properties getConfigProperties(String filename) throws IOException { + Properties result = new Properties(); + + URL inClasspath = Resource.class.getResource(filename); + if(inClasspath != null){ + log.info("Chargement du fichier de config: " + inClasspath); + result.load(inClasspath.openStream()); + result = new Properties(result); + } + + File etcConfig = new File("/etc/" + filename); + if(etcConfig.exists()){ + log.info("Chargement du fichier de config: " + etcConfig); + result.load(etcConfig.toURL().openStream()); + result = new Properties(result); + } + + File config = new File(filename); + if(config.exists()){ + log.info("Chargement du fichier de config: " + config); + result.load(config.toURL().openStream()); + result = new Properties(result); + } + + return result; + } /** * Retourner la liste des fichiers du classLoader. Ces fichiers doivent @@ -291,52 +293,6 @@ throw new ResourceException("Le fichier n'a pu être converti en URL", eee); } } - -// /** -// * Recherche tous les fichiers suivant un pattern dans un repertoire. Le répertoire peut-être dans un jar ou sur le système de fichier. -// * -// * @param directory le répertoire où il faut faire la recherche -// * @param pattern le pattern des fichiers a rechercher -// * @return la liste des url des fichiers souhaités -// */ -// static public URL [] getAllURL(String directory, String pattern){ -// try{ -// ArrayList resulttmp = new ArrayList(); -// -// URL url = getURL(directory); -// -// if(url.getProtocol().equals("file")){ -// File file = new File(url.getFile()); -// resulttmp = resulttmp.addAll(getURLs(file)); -// }else if(url.getProtocol().equals("jar")){ -// String prefixPath = directory; -// if(prefixPath.startsWith(File.separator)){ -// prefixPath = prefixPath.substring(1); -// } -// String path = url.getFile(); -// URL jarurl = new URL(path.substring(0, path.lastIndexOf("!"))); -// InputStream in = jarurl.openStream(); -// JarInputStream zis = new JarInputStream(in); -// while (zis.available() != 0) { -// JarEntry entry = zis.getNextJarEntry(); -// if (entry == null) { -// break; -// } -// String name = entry.getName(); -// if (pattern == null || name.matches(prefixPath + "/" + pattern)) { -// resulttmp.add(name.substring(prefixPath.length())); -// } -// } -// } -// URL [] result = new URL[resulttmp.size()]; -// for(int i=0; i