All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nuiton.util.AliasMap Maven / Gradle / Ivy

There is a newer version: 3.1
Show newest version
package org.nuiton.util;

/*
 * #%L
 * Nuiton Utils
 * %%
 * Copyright (C) 2004 - 2013 CodeLutin
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * .
 * #L%
 */


import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.map.MultiValueMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.UUID;

/**
 * Une map base sur une HashMap qui permet pour une valeur d'ajouter d'autres
 * cles. Cette nouvelle cle est un alias, un alias peut-etre utilise pour
 * plusieurs valeurs. Si l'on demande la valeur associe a un Alias, cela
 * retourne une liste contenant toutes les valeurs pour lequel cette Alias est
 * utilise.
 * 
 * Cela permet de stocker des objets avec une cle principale et unique, puis
 * avec des alias.
 *
 * Et ainsi recherche les valeurs qui ont un ensemble d'alias via la methode
 * {@link #getValueAlias(Object[]) } ou supprimer les valeurs qui
 * ont un ensemble d'Alias en commun via la methode {@link #removeValue}
 *
 * Si la cle ne vous importe que peu, vous pouvez par exemple utiliser
 * {@link UUID#randomUUID()} pour generer une cle unique.
 *
 * @author Benjamin Poussin - [email protected]
 * @since 3.6.9
 */
public class AliasMap extends HashMap {

    /** Logger. */
    private static final Log log = LogFactory.getLog(AliasMap.class);
    private static final long serialVersionUID = 1L;

    /** key: alias, value: key */
    protected MultiValueMap aliases;
    /** key: key, value: alias */
    protected MultiValueMap keys;

    public AliasMap() {
        aliases = MultiValueMap.multiValueMap(new HashMap(), HashSet.class);
        keys = MultiValueMap.multiValueMap(new HashMap(), HashSet.class);
    }

    /**
     * Ajoute une valeur dans la map avec un ensemble d'alias associe
     *
     * @param key identifiant unique pour cette valeur
     * @param value la valeur
     * @param alias1 le premier alias à saisir
     * @param alias les alias de la valeur
     * @return FIXME
     */
    public V put(K key, V value, A alias1, A ... alias) {
        V result = put(key, value);
        putAlias(key, alias1, alias);
        
        return result;
    }

    /**
     * Ajoute des alias a une cle
     * @param key FIXME
     * @param alias1 FIXME
     * @param alias FIXME
     */
    protected void putAlias(K key, A alias1, A ... alias) {
        aliases.put(alias1, key);
        keys.put(key, alias1);
        for (Object a : alias) {
            aliases.put(a, key);
            keys.put(key, a);
        }
    }

    /**
     * Retoure les cles en commun de tous les alias. Les cles retournees sont
     * celle qui ont tous les alias.
     * 
     * K1: a, b, c
     * K2: b, c, d
     * K3: c, d, e
     *
     * getKeyAlias(a, b, c) retourne [K1]
     * getKeyAlias(b, c) retourne [K1, K2]
     * getKeyAlias(c) retourne [K1, K2, K3]
     * getKeyAlias(d) retourne [K2, K3]
     * getKeyAlias(z) retourne []
     * 
* * * @param alias FIXME * @return une liste vide si aucune valeur ne correspond au alias en argument */ public Collection getKeyAlias(A ... alias) { Collection result = null; for (Object a : alias) { Collection tmp = aliases.getCollection(a); if (tmp != null) { if (result == null) { result = new HashSet(tmp); } else { result.retainAll(tmp); } } } if (result == null) { result = Collections.emptySet(); } return result; } /** * Retoure les valeurs en commun de tous les alias. Les valeurs retournees sont * celle qui ont tous les alias. *
     * V1: a, b, c
     * V2: b, c, d
     * V3: c, d, e
     *
     * getKeyAlias(a, b, c) retourne [V1]
     * getKeyAlias(b, c) retourne [V1, V2]
     * getKeyAlias(c) retourne [V1, V2, V3]
     * getKeyAlias(d) retourne [V2, V3]
     * getKeyAlias(z) retourne []
     * 
* * * @param alias FIXME * @return une liste vide si aucune valeur ne correspond au alias en argument */ public Collection getValueAlias(A ... alias) { Collection keys = getKeyAlias(alias); Collection result = new HashSet(keys.size()); for (Object k : keys) { result.add(get(k)); } return result; } /** * Retourne la liste d'alias associee avec une cle * *
     * K1: a, b, c
     * K2: b, c, d
     * K3: c, d, e
     *
     * getAlias(K1) retourne [a, b, c]
     * getAlias(k3) retourne [c, d, e]
     * getKeyAlias(k9) retourne []
     * 
* * @param key FIXME * @return FIXME */ public Collection getAlias(K key) { Collection result = keys.getCollection(key); if (result == null) { result = Collections.emptySet(); } return result; } /** * Retire une cle ainsi que tous ses alias * *
     * K1: a, b, c
     * K2: b, c, d
     * K3: c, d, e
     *
     * remove(K1) il reste K2: [b, c, d], K3: [c, d, e]
     * 
* * @param key FIXME * @return FIXME */ @Override public V remove(Object key) { V result = super.remove(key); Collection alias = getAlias((K)key); keys.remove(key); if (alias != null) { for (Object a : alias) { aliases.removeMapping(a, key); if (CollectionUtils.isEmpty(aliases.getCollection(a))) { aliases.remove(a); } } } return result; } /** * Supprime toutes les valeurs et leur cle associe aux alias * *
     * K1: a, b, c
     * K2: b, c, d
     * K3: c, d, e
     *
     * removeValue(b, c) il reste K3: [c, d, e]
     * 
* * @param alias FIXME * @return la liste de valeur qui a ete supprime de la map */ public Collection removeValue(A ... alias) { Collection keys = getKeyAlias(alias); Collection result = new ArrayList(keys.size()); for (Object k : keys) { result.add(remove(k)); } return result; } /** * Supprime des alias quelque soit leur cle * *
     * K1: a, b, c
     * K2: b, c, d
     * K3: c, d, e
     *
     * removeAlias(a, b) alors K1: [c], k2: [c, d], k3: [c, d, e]
     * removeAlias(c) alors K1: [a, b], k2: [b, d], k3: [d, e]
     * getKeyAlias(z) alors rien ne change car cette alias n'existe pas
     * 
* * @param alias FIXME */ public void removeAlias(A ... alias) { for (Object a : alias) { Collection ks = aliases.getCollection(a); aliases.remove(a); if (ks != null) { for (Object k : ks) { keys.removeMapping(k, a); } } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy