provide some stats as json
[pnews.git] / war / src / main / java / pnews / servlet / ArticleStore.java
index 0b40cc3..b0f2e68 100644 (file)
@@ -1,22 +1,34 @@
 package pnews.servlet;
 
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.logging.Logger;
 
 import pnews.Article;
 
 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)
+                        if (ref == null) {                                
                                 return null;
-                        return ref.get();
+                        }
+                        
+                        result = ref.get();
+                        if (result == null) {
+                                LOG.info("Article has been released from memory: " + link);
+                                articles.remove(link);
+                        }
+                        
+                        return result;
                 }
         }
         
@@ -28,9 +40,33 @@ public class ArticleStore {
                         if (result == null) {
                                 result = factory.create();
                                 articles.put(link, new WeakReference<>(result));
+                                LOG.info("Article has been added: " + result.link);
                         }
                         
                         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[] {});
+                }
+        }
 }