Index: /applications/editors/josm/plugins/opendata/README
===================================================================
--- /applications/editors/josm/plugins/opendata/README	(revision 31941)
+++ /applications/editors/josm/plugins/opendata/README	(revision 31942)
@@ -18,6 +18,5 @@
 
 - includes: several COTS, heavily truncated to fit only the plugin needs and reduce the JAR size:
-    - org/apache: two Apache COTS (Apache License 2.0, see LICENSE-2.0.txt)
-        - commons/collections: Apache Commons Collections 3.2.1 (used by jOpenDocument)
+    - org/apache: one Apache COTS (Apache License 2.0, see LICENSE-2.0.txt)
         - poi: Apache POI 3.7 (Excel format support without styles, formulas and writing capabilities, used by the plugin itself)
     - org/j7zip: J7zip 4.43alpha2 (7z archive read support, LGPL v2.1, see LGPL-2.1.txt)
Index: /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionMap.java
===================================================================
--- /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionMap.java	(revision 31941)
+++ /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionMap.java	(revision 31942)
@@ -18,17 +18,8 @@
 import static java.util.Arrays.asList;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.collections.MultiHashMap;
-import org.apache.commons.collections.MultiMap;
-import org.apache.commons.collections.map.MultiValueMap;
+import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
 
 /**
- * Une MultiMap qui permet de ne pas renvoyer <code>null</code>. De plus elle permet de choisir le
- * type de Collection utilisé.
+ * Une MultiMap.
  * 
  * @author ILM Informatique 8 sept. 2004
@@ -37,123 +28,23 @@
  */
 @SuppressWarnings({ "unchecked", "serial" })
-public class CollectionMap<K, V> extends MultiHashMap {
-
-    private static final int DEFAULT_CAPACITY = 16;
-
-    private final Class<? extends Collection<V>> collectionClass;
-    private final Collection<V> collectionSpecimen;
+public class CollectionMap<K, V> extends HashSetValuedHashMap<K,V> {
 
     /**
-     * Une nouvelle map avec ArrayList comme collection.
+     * Une nouvelle map
      */
     public CollectionMap() {
-        this(ArrayList.class);
     }
 
     /**
-     * Une nouvelle map. <code>collectionClass</code> doit descendre de Collection, et posséder un
-     * constructeur prenant une Collection (c'est le cas de la majorité des classes de java.util).
-     * 
-     * @param aCollectionClass le type de collection utilisé.
-     */
-    public CollectionMap(Class aCollectionClass) {
-        this(aCollectionClass, DEFAULT_CAPACITY);
-    }
-
-    /**
-     * Une nouvelle map sans préciser le type de collection. Dans ce cas si vous voulez spécifier
-     * une collection surchargez {@link #createCollection(Collection)}. Ce constructeur est donc
-     * utile pour des raisons de performances (évite la réflexion nécessaire avec les autres).
+     * Une nouvelle map
      * 
      * @param initialCapacity the initial capacity.
      */
     public CollectionMap(final int initialCapacity) {
-        this((Class) null, initialCapacity);
-    }
-
-    public CollectionMap(Class aCollectionClass, final int initialCapacity) {
         super(initialCapacity);
-        this.collectionClass = aCollectionClass;
-        this.collectionSpecimen = null;
-        new MultiValueMap(); // TODO: use this class instead of deprecated MultiHashMap
-    }
-
-    public Collection<V> createCollection(Collection coll) {
-        if (this.collectionClass != null)
-            try {
-                if (coll == null) {
-                    return this.collectionClass.newInstance();
-                } else {
-                    return this.collectionClass.getConstructor(new Class[] { Collection.class }).newInstance(new Object[] { coll });
-                }
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        else if (this.collectionSpecimen != null) {
-            try {
-                final Collection<V> res = CopyUtils.copy(this.collectionSpecimen);
-                if (coll != null)
-                    res.addAll(coll);
-                return res;
-            } catch (Exception e) {
-                throw ExceptionUtils.createExn(IllegalStateException.class, "clone() failed", e);
-            }
-        } else
-            return super.createCollection(coll);
-    }
-
-    /**
-     * Fusionne la MultiMap avec celle-ci. C'est à dire rajoute les valeurs de mm à la suite des
-     * valeurs de cette map (contrairement à putAll(Map) qui ajoute les valeurs de mm en tant que
-     * valeur scalaire et non en tant que collection).
-     * 
-     * @param mm la MultiMap à fusionner.
-     */
-    public void merge(MultiMap mm) {
-        // copied from super ctor
-        for (Iterator it = mm.entrySet().iterator(); it.hasNext();) {
-            final Map.Entry entry = (Map.Entry) it.next();
-            Collection<V> coll = (Collection<V>) entry.getValue();
-            Collection newColl = createCollection(coll);
-            this.putAll(entry.getKey(), newColl);
-        }
-    }
-
-    /**
-     * Copies all of the mappings from the specified map to this map. This method is equivalent to
-     * {@link MultiHashMap#MultiHashMap(Map)}. NOTE: cannot use Map<? extends K, ? extends V> since
-     * java complains (MultiHashMap not being generic).
-     * 
-     * @param m mappings to be stored in this map
-     */
-    @Override
-    public void putAll(Map mapToCopy) {
-        if (mapToCopy instanceof MultiMap) {
-            this.merge((MultiMap) mapToCopy);
-        } else {
-            super.putAll(mapToCopy);
-        }
-    }
+    } 
 
     public boolean putAll(K key, V... values) {
         return this.putAll(key, asList(values));
     }
-
-    // generics : MultiHashMap is not generic but it extends HashMap who does
-    // so just override
-
-    @Override
-    public Set<Map.Entry<K, Collection<V>>> entrySet() {
-        return super.entrySet();
-    }
-
-    @Override
-    public Set<K> keySet() {
-        return super.keySet();
-    }
-
-    @Override
-    public Collection<V> values() {
-        return super.values();
-    }
 }
Index: /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionUtils.java
===================================================================
--- /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionUtils.java	(revision 31941)
+++ /applications/editors/josm/plugins/opendata/includes/org/jopendocument/util/CollectionUtils.java	(revision 31942)
@@ -21,5 +21,6 @@
 import java.util.RandomAccess;
 
-import org.jopendocument.util.cc.ITransformer;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.collections4.TransformerUtils;
 
 /**
@@ -28,5 +29,5 @@
  * @author ILM Informatique 30 sept. 2004
  */
-public class CollectionUtils extends org.apache.commons.collections.CollectionUtils {
+public class CollectionUtils {
 
     /**
@@ -40,5 +41,5 @@
      * @return la chaine composée de chacun des éléments séparés par <code>sep</code>.
      */
-    static public final <E> String join(final Collection<E> c, final String sep, final ITransformer<? super E, ?> tf) {
+    static public final <E> String join(final Collection<E> c, final String sep, final Transformer<? super E, ?> tf) {
         if (c.size() == 0)
             return "";
@@ -49,14 +50,14 @@
             final int stop = c.size() - 1;
             for (int i = 0; i < stop; i++) {
-                res.append(tf.transformChecked(list.get(i)));
+                res.append(tf.transform(list.get(i)));
                 res.append(sep);
 
             }
-            res.append(tf.transformChecked(list.get(stop)));
+            res.append(tf.transform(list.get(stop)));
         } else {
             final Iterator<E> iter = c.iterator();
             while (iter.hasNext()) {
                 final E elem = iter.next();
-                res.append(tf.transformChecked(elem));
+                res.append(tf.transform(elem));
                 if (iter.hasNext())
                     res.append(sep);
@@ -76,5 +77,5 @@
      */
     static public <T> String join(Collection<T> c, String sep) {
-        return join(c, sep, org.jopendocument.util.cc.Transformer.<T> nopTransformer());
+        return join(c, sep, TransformerUtils.<T>nopTransformer());
     }
 }
