cleanup and refactored to move to net.wpitchoune package
[pnews.git] / war / src / main / java / net / wpitchoune / pnews / Config.java
diff --git a/war/src/main/java/net/wpitchoune/pnews/Config.java b/war/src/main/java/net/wpitchoune/pnews/Config.java
new file mode 100644 (file)
index 0000000..99ebb3f
--- /dev/null
@@ -0,0 +1,234 @@
+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];
+        }        
+}