package model; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONObject; import Classes.ApiCall; import Classes.Category; import Classes.Event; import Classes.SortTypes; import Classes.api.fetchArticles; import Interfaces.Callback; import Interfaces.DelayedCallback; import Interfaces.EventObserver; import Interfaces.Observable; import javafx.util.Pair; public class NewsListModel implements Observable{ //instance du singleton private static NewsListModel instance; private String APIKey; // Clé d'API private Category cat = Category.all; // catégorie choise parl'utilisateur private Boolean isRetreivingSources = false; // est ce que le modele est en train de récupérer les sources private Boolean apiError = false; // est ce que l'api a rencontré une erreur private ArrayList sources; // liste des sources private HashMap observers; // liste des observers private ArrayList news; // liste des news finale private SortTypes sortType = SortTypes.relevancy; // critère de tri private String query = ""; // critère de recherche de l'utilisateur private NewsListModel(String APIKey) { this.APIKey = APIKey; //comme la liste des sources retournée par l'API est de 20 éléments max, pas la peine de déclarer une arraylist sans borne this.sources = new ArrayList(20); this.observers = new HashMap(); this.news = new ArrayList(); } public static NewsListModel getInstance() { if( NewsListModel.instance == null ) NewsListModel.instance = new NewsListModel("0e72f765c5c84313ae31a5a7e9e61735"); return NewsListModel.instance; } public void setCategory(Category cat) { if( cat == Category.all ){ this.sources = null; this.cat = cat; return; } //on vide la liste des sources this.sources.clear(); this.cat = cat; //on créé l'URL d'appel de l'API String lang = LangModel.getInstance().getToLang().name(); String URL = "http://beta.newsapi.org/v2/sources?language="+lang; //on rajoute la catégorie if( cat != Category.all ) URL += "&category="+cat.name(); //on rajoute la clé d'api URL += "&apiKey="+this.APIKey; // Création de l'appel ApiCall api = new ApiCall(URL, "GET", new Callback(){ @Override public void onSuccess(JSONObject response) { //on récupère toutes les sources (dans la limite de 20 sources) JSONArray arr = response.getJSONArray("sources"); for(int i = 0;i> call() { //si l'appel d'api précédent a échoué, on fait échouer l'appel actuel avec une URL vide if(NewsListModel.this.apiError) { //on reset la variable d'erreur pour que l'utilisateur puisse re-essayer plus tard NewsListModel.this.apiError = false; return new Pair>("",null); } String lang = LangModel.getInstance().getToLang().name(); String URL = "http://beta.newsapi.org/v2/everything?apiKey="+NewsListModel.this.APIKey+"&language="+lang +"&q="+q+"&sortBy="+NewsListModel.this.sortType.name(); //on ajoute la liste des sources a l'URL de la requete if(NewsListModel.this.sources != null && NewsListModel.this.sources.size() != 0) { String sources = "&sources="; for(String s : NewsListModel.this.sources) { sources += s+","; } //on enlève la dernière virgule sources = sources.replaceAll(",$", ""); URL += sources; } return new Pair>(URL,null); } }); this.addObserver("newsApiCall",api); } api.send(); } public void setSortType(SortTypes t) { this.sortType = t; this.query(this.query); } public void notifyObservers(Event e) { for(Object key : this.observers.keySet().toArray()) { this.observers.get(key).handleEvent(e); } } public void setQuery(String query){ this.query = query; } public void setNews(ArrayList news){ this.news = news; } public ArrayList getNews(){ return this.news; } @Override public void addObserver(String key, EventObserver o) { this.observers.put(key, o); } @Override public void removeObserver(String key) { this.observers.remove(key); } }