import OclCollections.*;
import static OclCollections.Collections.*;

/** Mise en oeuvre du type abstrait InfoBalise.
 * 
 * Contraintes de mise en oeuvre: La mise en oeuvre ne doit utiliser
 * que des types primitifs (int, boolean) ou les objets de type
 * correspondant (Integer, Boolean), y compris String, ou des
 * collections style OCL (immuables) de tels types.  Il est donc
 * interdit d'utiliser des tableaux (array) ou des collections de la
 * bibliotheque standard.
 */

class InfoBaliseImpl implements InfoBalise {

    private String balise;
    private Bag<String> attributs; // Un sac suffit puisqu'on desire
				   // simplement connaitre les divers
				   // attributs, et leur nombre d'occurrences.

    public InfoBaliseImpl( String balise ) {
	this.balise = balise;
	attributs = emptyBag();
    }

    public String balise() {
	return balise;
    }

    public Set<String> attributs() {
	return attributs.asSet();
    }

    public Integer nbOccurrences( String attr ) {
	return attributs.count( attr );
    }

    public void ajouterAttribut( String attr ) {
	attributs = attributs.including( attr );
    }

    @Override
    public boolean equals( Object o ) {
	if (o != null && o instanceof InfoBalise) {
	    return balise.equals( ((InfoBalise) o).balise() ); // On ignore les attributs.
	} else {
	    return false;
	}
    }
}
