:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Java Avancé ::
[LOGO]

Examen de Java sur machine (2h)


Les sources sont à envoyer par mail à la fin (forax@univ-mlv.fr)

Exercice 1 - Query Builder (20)

Le but de cet exercice est d'implanter un builder permettant de filtrer et projeter des ensembles de valeurs un peu à la façon dont SQL fonctionne mais sur des données résidant en mémoire.
Cet exercice peut être assez simple si l'on prend bien le temps de réfléchir pour éviter trop de duplication de code. Sinon, cet exercice va vous sembler fastidieux.

On souhaite developper une classe (en fait, une hierarchie de classe) nommée QueryBuilder qui gère un groupe d'élement. Un objet QueryBuilder est créer à partir d'un Iterable ou d'un Set.
Voici les fonctionnalités d'un QueryBuilder:
  • frequency: obtenir le nombre d'occurence d'un élement du groupe ou zéro sinon.
  • count: compter le nombre d'élement du groupe.
  • toSet: obtenir les élements sous forme d'un Set.
  • toIterable: obtenir les élements sous forme d'un Iterable
  • select: filtrer des élements, on gardera les élements pour lesquels la fonction filter renvoie vrai.
  • apply: transforme les éléments en appliquant à chaque élement la fonction apply.

package fr.umlv.examsept2010;  
  
import java.util.Set;

public abstract class QueryBuilder<E> {
  public interface Filter<E> {
    public boolean filter(E element);
  }
  
  public interface Applier<R, E> {
    public R apply(E element);
  }
  
  public abstract Set<E> toSet();
  public abstract Iterable<E> toIterable();
  
  public abstract int frequency(E element);
  public abstract int count();
  
  public abstract QueryBuilder<E> select(Filter<E> filter);
  
  public abstract <R> QueryBuilder<R> apply(Applier<R, E> applier);
  
  public static <E> QueryBuilder<E> from(Set<E> set) {
    return null;  // insérer votre code ici
  }
  
  public static <E> QueryBuilder<E> from(Iterable<E> iterable) {
    return null;  // insérer votre code ici
  }
  
  // insérer votre code ici
}
Votre implantation ne devra en aucun cas copier les éléments à chaque fois que l'on effectue une opération comme select or apply sur le QueryBuilder. Si select ou apply effectue une copie des élements pour les stocker dans une structure de donnée, votre implantation sera considerée comme hors sujet.

Il vous est demandé de fournir une implantation répondant aux contraintessuivantes:
  • QueryBuilder.from(set).toSet() == set et QueryBuilder.from(iterable).toIterable() == iterable
  • Les Set renvoyé par toSet doivent respectés l'interface java.util.Set.
  • Vous n'avez le droit d'insérer du code qu'aux endroits marqués 'insérer votre code ici'.

Pour vous aidez, un ensemble de tests unitaires est disponible:

De plus, les signatures des méthodes select et apply sont fausses, certains tests unitaires ne compileront pas, à vous de modifier ces deux signatures.

Aide1: vous avez le droit de créer des sous-classes en Java !
Aide2: réfléchissez un peu avant de coder, SVP !