cleanup and refactored to move to net.wpitchoune package
[pnews.git] / war / src / main / java / net / wpitchoune / pnews / ArticleStore.java
diff --git a/war/src/main/java/net/wpitchoune/pnews/ArticleStore.java b/war/src/main/java/net/wpitchoune/pnews/ArticleStore.java
new file mode 100644 (file)
index 0000000..f72bc16
--- /dev/null
@@ -0,0 +1,70 @@
+package net.wpitchoune.pnews;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.logging.Logger;
+
+public class ArticleStore {
+        public final static ArticleStore singleton = new ArticleStore();
+        private final HashMap<String, WeakReference<Article>> articles = new HashMap<>();
+        private final static Logger LOG = Logger.getLogger(ArticleStore.class.getName());
+        
+        public Article get(String link) {
+                WeakReference<Article> ref;
+                Article result;
+                
+                synchronized (articles) {
+                        ref = articles.get(link);
+                        if (ref == null) {                                
+                                return null;
+                        }
+                        
+                        result = ref.get();
+                        if (result == null) {
+                                LOG.info("Article has been released from memory: " + link);
+                                articles.remove(link);
+                        }
+                        
+                        return result;
+                }
+        }
+        
+        public Article getArticle(String link, ArticleFactory factory) {
+                Article result;
+                
+                synchronized (articles) {
+                        result = get(link);
+                        if (result == null) {
+                                result = factory.create();
+                                articles.put(link, new WeakReference<>(result));
+                                LOG.fine("Article has been added: " + result.getLink());
+                        }
+                        
+                        return result;
+                }
+        }
+        
+        public long size() {
+                synchronized (this) {
+                        return articles.size();
+                }
+        }
+        
+        public Article[] getArticles() {
+                ArrayList<Article> result;
+                Article a;
+                                
+                synchronized (articles) {
+                        result = new ArrayList<>(articles.size());
+                        
+                        for (WeakReference<Article> r: articles.values()) {
+                                a = r.get();
+                                if (a != null)
+                                        result.add(a);
+                        }
+                        
+                        return result.toArray(new Article[] {});
+                }
+        }
+}