Index: lutinutil/src/java/org/codelutin/util/HashMapMultiKey.java diff -u lutinutil/src/java/org/codelutin/util/HashMapMultiKey.java:1.8 lutinutil/src/java/org/codelutin/util/HashMapMultiKey.java:1.9 --- lutinutil/src/java/org/codelutin/util/HashMapMultiKey.java:1.8 Wed Jan 4 13:26:32 2006 +++ lutinutil/src/java/org/codelutin/util/HashMapMultiKey.java Mon May 22 12:40:50 2006 @@ -23,9 +23,9 @@ * Created: 2 nov. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.8 $ + * @version $Revision: 1.9 $ * - * Mise a jour: $Date: 2006/01/04 13:26:32 $ + * Mise a jour: $Date: 2006/05/22 12:40:50 $ * par : $Author: bpoussin $ */ @@ -61,7 +61,7 @@ public static final Object HARD = null; public static final Object SOFT = new Object(); public static final Object WEAK = new Object(); - + /** key: un objet, value une list de key pour la vrai hashmap */ protected HashMap keys = new HashMap(); /** key: la valeur, valeur: la cle. Permet de supprimer rapidement une @@ -112,7 +112,7 @@ super.remove(key); // suppression dans l'association des objets de la cle for(Iterator i=((Key)key).iterator(); i.hasNext();){ - Set list = getKeys(i.next()); + Set list = _getKeys(i.next()); if (list != null) { list.remove(key); } @@ -129,9 +129,9 @@ protected Object refValue(Object o) { Object result = o; if (valueType == SOFT) { - result = new TransparenteSoftReference(o, refQueueValue); + result = new TransparenteSoftReference(o, refQueueValue, false); } else if (valueType == WEAK) { - result = new TransparenteWeakReference(o, refQueueValue); + result = new TransparenteWeakReference(o, refQueueValue, false); } return result; } @@ -153,9 +153,9 @@ protected Object refKey(Object o){ Object result = o; if (keyType == SOFT) { - result = new TransparenteSoftReference(o, refQueueKey); + result = new TransparenteSoftReference(o, refQueueKey, false); } else if (keyType == WEAK) { - result = new TransparenteWeakReference(o, refQueueKey); + result = new TransparenteWeakReference(o, refQueueKey, false); } return result; } @@ -178,26 +178,37 @@ * alors la liste retourné est vide. */ public Set getKeys(Object e){ - cleanQueue(); - Set list = (Set)keys.get(e); - if( list == null){ - list = new HashSet(); - } else { - // on nettoie un peu la liste en supprimant les cles liberees - for (Iterator i=list.iterator(); i.hasNext();) { - if (derefKey(i.next()) == null) { - i.remove(); - } - } - if (list.size() == 0) { - keys.remove(e); + Set list = _getKeys(e); + + for (Iterator i=list.iterator(); i.hasNext();) { + if (derefKey(i.next()) == null) { + i.remove(); } } + if (list.size() == 0) { + keys.remove(e); + } return list; } + /** + * Retourne toutes les cles qui contiennent au moins une fois l'élément + * e. + * @param e l'element que doivent contenir les cles + * @return la liste des cles. Si aucune cle ne contient l'element e, + * alors la liste retourné est vide. + */ + protected Set _getKeys(Object e){ + cleanQueue(); + Set list = (Set)keys.get(e); + if( list == null){ + list = new HashSet(); + } + return list; + } + protected Set getKeysAndAdd(Object e){ - Set list = getKeys(e); + Set list = _getKeys(e); // il ne faut pas encapsuler e dans une ref, sinon on ne retrouve // plus les cles si l'objet etait seulement dans la cle keys.put(e, list); @@ -247,6 +258,15 @@ return derefValue(super.get(key)); } + /* (non-Javadoc) + * @see java.util.HashMap#size() + */ + @Override + public int size() { + cleanQueue(); + return super.size(); + } + /** * Method remove permet de supprimer un element suivant une cle * qui a permit d'ajouter l'element, on bien une composant d'une @@ -269,7 +289,7 @@ // de devoir le supprimer dans les lists de keys, le // GC le ferait pour nous. for(Iterator i=((Key)key).iterator(); i.hasNext();){ - Set list = getKeys(i.next()); + Set list = _getKeys(i.next()); if (list != null) { list.remove(key); } @@ -280,14 +300,16 @@ return derefValue(result); }else{ ArrayList result = new ArrayList(); - Set list = getKeys(key); + Set list = _getKeys(key); if ( list != null ){ for(Iterator i=list.iterator(); i.hasNext();){ Key keyObject = (Key)derefKey(i.next()); - result.add(keyObject); i.remove(); - Object value = super.remove(keyObject); - valueToKey.remove(value); + if (keyObject != null) { // si la cle existe encore + result.add(keyObject); + Object value = super.remove(keyObject); + valueToKey.remove(value); + } } if (list.size() == 0) { keys.remove(key); @@ -305,11 +327,14 @@ public ArrayList getValues(Object keyElement){ cleanQueue(); ArrayList result = new ArrayList(); - Set list = getKeys(keyElement); + Set list = _getKeys(keyElement); if (list != null) { for(Iterator i=list.iterator(); i.hasNext();){ Key keyObject = (Key)derefKey(i.next()); - result.add(derefValue(super.get(keyObject))); + if (keyObject != null) { // si la cle existe encore + Object val = super.get(keyObject); + result.add(derefValue(val)); + } } } return result; Index: lutinutil/src/java/org/codelutin/util/TransparenteSoftReference.java diff -u lutinutil/src/java/org/codelutin/util/TransparenteSoftReference.java:1.4 lutinutil/src/java/org/codelutin/util/TransparenteSoftReference.java:1.5 --- lutinutil/src/java/org/codelutin/util/TransparenteSoftReference.java:1.4 Wed Jan 4 13:26:32 2006 +++ lutinutil/src/java/org/codelutin/util/TransparenteSoftReference.java Mon May 22 12:40:50 2006 @@ -22,9 +22,9 @@ * * @author Benjamin Poussin * Copyright Code Lutin -* @version $Revision: 1.4 $ +* @version $Revision: 1.5 $ * -* Mise a jour: $Date: 2006/01/04 13:26:32 $ +* Mise a jour: $Date: 2006/05/22 12:40:50 $ * par : $Author: bpoussin $ */ package org.codelutin.util; @@ -48,25 +48,38 @@ * @param o DOCUMENTME Description of the Parameter */ public TransparenteSoftReference(T o) { - super(o); - init(o); + this(o, true); } public TransparenteSoftReference(T o, ReferenceQueue queue) { + this(o, queue, true); + } + + public TransparenteSoftReference(T o, boolean objectToStringUsed) { + super(o); + init(o, objectToStringUsed); + } + + public TransparenteSoftReference(T o, ReferenceQueue queue, boolean objectToStringUsed) { super(o, queue); - init(o); + init(o, objectToStringUsed); } /** * On conserve le hash pour que la Reference puisse encore se faire * passer pour l'objet alors que celui-ci a disparu de la memoire */ - protected void init(T o){ + protected void init(T o, boolean objectToStringUsed){ hash = o.hashCode(); - toString = o.toString(); + if (objectToStringUsed) { + toString = o.toString(); + } if(toString == null) { toString = o.getClass().getName() + '@' + Integer.toHexString(hash); } + if(toString.length() > 100) { + toString = toString.substring(0, 100) + "..."; + } } /** Index: lutinutil/src/java/org/codelutin/util/TransparenteWeakReference.java diff -u lutinutil/src/java/org/codelutin/util/TransparenteWeakReference.java:1.5 lutinutil/src/java/org/codelutin/util/TransparenteWeakReference.java:1.6 --- lutinutil/src/java/org/codelutin/util/TransparenteWeakReference.java:1.5 Wed Jan 4 13:26:32 2006 +++ lutinutil/src/java/org/codelutin/util/TransparenteWeakReference.java Mon May 22 12:40:50 2006 @@ -22,9 +22,9 @@ * * @author Benjamin Poussin * Copyright Code Lutin -* @version $Revision: 1.5 $ +* @version $Revision: 1.6 $ * -* Mise a jour: $Date: 2006/01/04 13:26:32 $ +* Mise a jour: $Date: 2006/05/22 12:40:50 $ * par : $Author: bpoussin $ */ package org.codelutin.util; @@ -41,29 +41,39 @@ protected int hash = 0; protected String toString = null; + protected boolean objectToStringUsed = true; + + public TransparenteWeakReference(T o) { + this(o, true); + } + + public TransparenteWeakReference(T o, ReferenceQueue queue) { + this(o, queue, true); + } /** - *DOCUMENTME Constructor for the TransparenteWeakReference object - * - * @param o DOCUMENTME Description of the Parameter + * @param objectToStringUsed if true, this ref used toString method of + * encapsulated object otherwize used default Object toString */ - public TransparenteWeakReference(T o) { + public TransparenteWeakReference(T o, boolean objectToStringUsed) { super(o); - init(o); + init(o, objectToStringUsed); } - public TransparenteWeakReference(T o, ReferenceQueue queue) { + public TransparenteWeakReference(T o, ReferenceQueue queue, boolean objectToStringUsed) { super(o, queue); - init(o); + init(o, objectToStringUsed); } /** * On conserve le hash pour que la Reference puisse encore se faire * passer pour l'objet alors que celui-ci a disparu de la memoire */ - protected void init(T o){ + protected void init(T o, boolean objectToStringUsed){ hash = o.hashCode(); - toString = o.toString(); + if (objectToStringUsed) { + toString = o.toString(); + } if(toString == null) { toString = o.getClass().getName() + '@' + Integer.toHexString(hash); }