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