--- /dev/null
+package net.wpitchoune.pnews;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+
+public class Config {
+ private Feed[] feeds;
+ private Category[] categories;
+ private Language[] languages;
+ private final Set<String> blacklistedEntities = new HashSet<>();
+ private final HashMap<String, String> entityAliases = new HashMap<>();
+ private static final String CLASS_NAME = Config.class.getName();
+
+ /**
+ * The key is the language, the value is the default category for this language.
+ */
+ private Map<String, Category> defaultCategories = new HashMap<>();
+ private static final Logger LOG = Logger.getLogger(CLASS_NAME);
+
+ private void loadCategories(JsonArray jcats) {
+ List<Category> cats;
+ JsonObject jcat;
+ Category cat;
+ String id, label, title, language;
+
+ cats = new ArrayList<>(jcats.size());
+
+ for (JsonValue v: jcats) {
+ jcat = (JsonObject)v;
+ id = jcat.getString("id");
+ label = jcat.getString("label");
+ title = jcat.getString("title");
+ language = jcat.getString("language");
+ cat = new Category(id, label, title, language);
+ cats.add(cat);
+ if (defaultCategories.get(language) == null)
+ defaultCategories.put(language, cat);
+ }
+
+ categories = cats.toArray(new Category[0]);
+ }
+
+ private void loadLanguages(JsonArray jlangs) {
+ List<Language> langs;
+ JsonObject jlang;
+ String id;
+
+ langs = new ArrayList<>(jlangs.size());
+
+ for (JsonValue v: jlangs) {
+ jlang = (JsonObject)v;
+ id = jlang.getString("id");
+ langs.add(new Language(id));
+ }
+
+ languages = langs.toArray(new Language[0]);
+ }
+
+ private Category getCategory(String id) {
+ for (Category c: categories)
+ if (c.getId().equals(id))
+ return c;
+ return null;
+ }
+
+ private void loadEntities(JsonObject jroot) {
+ JsonObject jentities, jaliases;
+ JsonArray jblacklist;
+ final String METHOD_NAME = "loadEntities";
+
+ jentities = jroot.getJsonObject("entities");
+
+ jblacklist = jentities.getJsonArray("blacklist");
+ jblacklist.forEach((jv)-> {
+ JsonString js;
+
+ js = (JsonString)jv;
+ blacklistedEntities.add(js.getString());
+ });
+
+ jaliases = jentities.getJsonObject("aliases");
+ jaliases.forEach((k, v)-> {
+ JsonArray jsources = (JsonArray)v;
+
+ jsources.forEach((jsource)-> {
+ entityAliases.put(((JsonString)jsource).getString(), k);
+ });
+ });
+
+ LOG.logp(Level.FINEST, CLASS_NAME, METHOD_NAME, " blacklistedEntities=" + blacklistedEntities);
+ LOG.logp(Level.FINEST, CLASS_NAME, METHOD_NAME, " entityAliases=" + entityAliases);
+ }
+
+ public String getEntityAlias(String entity) {
+ String result;
+
+ result = entityAliases.get(entity);
+
+ if (result == null)
+ return entity;
+ else
+ return result;
+ }
+
+ public void loadConfig() throws UnsupportedEncodingException {
+ Reader r;
+ JsonObject jfeeds, jroot;
+ List<Feed> feedList;
+
+ r = null;
+ try {
+ r = new InputStreamReader(Config.class.getClassLoader().getResourceAsStream("feeds.json"),
+ "UTF-8");
+ jroot = Json.createReader(r).readObject();
+ } finally {
+ if (r != null)
+ try { r.close(); } catch (IOException e) { };
+ }
+
+ loadLanguages(jroot.getJsonArray("languages"));
+ loadCategories(jroot.getJsonArray("categories"));
+
+ jfeeds = jroot.getJsonObject("feeds");
+
+ feedList = new ArrayList<Feed>(jfeeds.size());
+
+ jfeeds.forEach((k, v)-> {
+ JsonObject jf;
+ String str;
+ Category cat;
+ JsonArray jcategories;
+
+ jf = (JsonObject)v;
+ jcategories = jf.getJsonArray("categories");
+ str = jcategories.getString(0);
+
+ cat = getCategory(str);
+
+ if (cat != null)
+ feedList.add(new Feed(k, cat));
+ else
+ LOG.severe("Missing category: " + str);
+ });
+
+ feeds = feedList.toArray(new Feed[0]);
+
+ loadEntities(jroot);
+ }
+
+ public boolean isBlacklistedEntity(String e) {
+ final String METHOD_NAME = "isBlacklistedEntity";
+ boolean result;
+
+ LOG.entering(CLASS_NAME, METHOD_NAME, e);
+
+ result = blacklistedEntities.contains(e);
+
+ LOG.exiting(CLASS_NAME, METHOD_NAME, result);
+
+ return result;
+ }
+
+ public boolean isObsolete(Instant instant) {
+ Instant olderInstant;
+
+ olderInstant = Instant.now().minus(60, ChronoUnit.DAYS);
+
+ if (instant.isAfter(olderInstant))
+ return false;
+ else
+ return true;
+ }
+
+ public Feed[] getFeeds() {
+ return feeds;
+ }
+
+ public Map<Category, List<Feed>> getFeedsByCategory() {
+ Map<Category, List<Feed>> result;
+ Feed[] feeds;
+ List<Feed> catFeeds;
+ Category cat;
+
+ result = new HashMap<>();
+
+ feeds = getFeeds();
+ for (Feed f: feeds) {
+ cat = f.getCategory();
+
+ catFeeds = result.get(cat);
+ if (catFeeds == null) {
+ catFeeds = new ArrayList<Feed>();
+ result.put(cat, catFeeds);
+ }
+ catFeeds.add(f);
+ }
+
+ return result;
+ }
+
+ public Category[] getCategories() {
+ return categories;
+ }
+
+ public Category getDefaultCategory(Language lang) {
+ return defaultCategories.get(lang.getId());
+ }
+
+ public Language[] getLanguages() {
+ return languages;
+ }
+
+ public Language getDefaultLanguage() {
+ return languages[0];
+ }
+}