LangTweetFilter.java

package tweetoscope.tweetsFilter;

import com.twitter.clientlib.model.Tweet;

/**
 * =====================================================
 * CLASSE LangTweetFilter - Filtre par langue
 * =====================================================
 * 
 * Ce filtre accepte UNIQUEMENT les tweets dans une langue spécifiée.
 * 
 * Objectif :
 * Filtrer les tweets pour ne garder que ceux dans une langue particulière.
 * 
 * Exemple d'utilisation :
 * - LangTweetFilter("en") accepte UNIQUEMENT les tweets en anglais
 * - LangTweetFilter("fr") accepte UNIQUEMENT les tweets en français
 * - LangTweetFilter("es") accepte UNIQUEMENT les tweets en espagnol
 * 
 * Logique du filtre :
 * - Chaque tweet a un champ "lang" contenant le code langue (ex: "en", "fr", "es")
 * - Le filtre compare ce code avec la langue cible
 * - Si tweet.lang == langue cible → tweet accepté ✓
 * - Si tweet.lang != langue cible → tweet rejeté ✗
 * 
 * Codes langue standards (ISO 639-1) :
 * - "en" : Anglais
 * - "fr" : Français
 * - "es" : Espagnol
 * - "de" : Allemand
 * - "it" : Italien
 * - "pt" : Portugais
 * - "ja" : Japonais
 * - "zh" : Chinois
 * - etc.
 */
public class LangTweetFilter implements TweetFilter.FilterCondition {

	/**
	 * VARIABLE MEMBRE : language
	 * 
	 * Stocke le code langue cible du filtre.
	 * Cette langue est celle que nous VOULONS conserver.
	 * 
	 * Type String :
	 * - Codes standards ISO 639-1
	 * - Exemples : "en", "fr", "es", "de", "it", "pt", "ja", "zh"
	 * 
	 * Exemple :
	 *   language = "en"
	 *   → Accepte les tweets anglais
	 *   → Rejette les tweets français, espagnols, etc.
	 * 
	 * Utilisation :
	 * - Initialisée dans le constructeur
	 * - Ne change jamais après la création du filtre (immutable)
	 */
	protected String language;

	/**
	 * =====================================================
	 * CONSTRUCTEUR : Crée un filtre par langue
	 * =====================================================
	 * 
	 * Initialise le filtre avec une langue cible.
	 * 
	 * Processus :
	 * 1. Stocke la langue fournie dans la variable member 'language'
	 * 2. Le filtre est maintenant prêt à être utilisé
	 * 
	 * Exemple :
	 *   LangTweetFilter("en")
	 *   → Crée un filtre qui accepte les tweets anglais
	 *   → Rejette tous les autres tweets
	 * 
	 * @param language Code langue cible (ex: "en", "fr", "es", "de")
	 *                  Ce code sera utilisé pour tester chaque tweet
	 */
	public LangTweetFilter(String language) {
		// Stocke la langue cible fournie en paramètre
		this.language = language;
	}

	/**
	 * =====================================================
	 * MÉTHODE match() - Teste si un tweet passe le filtre
	 * =====================================================
	 * 
	 * Implémentation de l'interface FilterCondition.
	 * Vérifie si la langue d'un tweet correspond à la langue cible.
	 * 
	 * Logique :
	 * - Récupère le code langue du tweet : tweet.getLang()
	 * - Compare avec la langue cible : .equals(this.language)
	 * - equals() retourne true si les strings sont EXACTEMENT identiques
	 * 
	 * Comparaison SENSIBLE À LA CASSE :
	 * - "en".equals("en") → true ✓
	 * - "en".equals("EN") → false ✗ (casse différente)
	 * - "en".equals("fr") → false ✗ (langue différente)
	 * 
	 * Risques potentiels :
	 * - Si tweet.getLang() retourne NULL → NullPointerException ✗
	 * - Solution : utiliser tweet.getLang() != null && tweet.getLang().equals(language)
	 * 
	 * Exemples :
	 *   this.language = "en"
	 *   tweet1.getLang() = "en" → equals() = true → ACCEPTÉ ✓
	 *   tweet2.getLang() = "fr" → equals() = false → REJETÉ ✗
	 *   tweet3.getLang() = "EN" → equals() = false → REJETÉ ✗ (différence de casse)
	 * 
	 * @param tweet Le tweet à tester
	 * @return true si la langue du tweet == langue cible, false sinon
	 */
	@Override
	public boolean match(Tweet tweet) {
		// Compare la langue du tweet avec la langue cible
		// .equals() fait une comparaison sensible à la casse
		return tweet.getLang().equals(language);
	}

}