provide some stats as json
[pnews.git] / war / src / main / java / pnews / servlet / ArticleStore.java
1 package pnews.servlet;
2
3 import java.lang.ref.WeakReference;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.logging.Logger;
7
8 import pnews.Article;
9
10 public class ArticleStore {
11         public final static ArticleStore singleton = new ArticleStore();
12         private final HashMap<String, WeakReference<Article>> articles = new HashMap<>();
13         private final static Logger LOG = Logger.getLogger(ArticleStore.class.getName());
14         
15         public Article get(String link) {
16                 WeakReference<Article> ref;
17                 Article result;
18                 
19                 synchronized (articles) {
20                         ref = articles.get(link);
21                         if (ref == null) {                                
22                                 return null;
23                         }
24                         
25                         result = ref.get();
26                         if (result == null) {
27                                 LOG.info("Article has been released from memory: " + link);
28                                 articles.remove(link);
29                         }
30                         
31                         return result;
32                 }
33         }
34         
35         public Article getArticle(String link, ArticleFactory factory) {
36                 Article result;
37                 
38                 synchronized (articles) {
39                         result = get(link);
40                         if (result == null) {
41                                 result = factory.create();
42                                 articles.put(link, new WeakReference<>(result));
43                                 LOG.info("Article has been added: " + result.link);
44                         }
45                         
46                         return result;
47                 }
48         }
49         
50         public long size() {
51                 synchronized (this) {
52                         return articles.size();
53                 }
54         }
55         
56         public Article[] getArticles() {
57                 ArrayList<Article> result;
58                 Article a;
59                                 
60                 synchronized (articles) {
61                         result = new ArrayList<>(articles.size());
62                         
63                         for (WeakReference<Article> r: articles.values()) {
64                                 a = r.get();
65                                 if (a != null)
66                                         result.add(a);
67                         }
68                         
69                         return result.toArray(new Article[] {});
70                 }
71         }
72 }