X-Git-Url: https://wpitchoune.net/gitweb/?p=pnews.git;a=blobdiff_plain;f=war%2Fsrc%2Fmain%2Fjava%2Fnet%2Fwpitchoune%2Fpnews%2FArticleStore.java;fp=war%2Fsrc%2Fmain%2Fjava%2Fnet%2Fwpitchoune%2Fpnews%2FArticleStore.java;h=f72bc16fa9a1fc311b30b4a21b209e5b49828864;hp=0000000000000000000000000000000000000000;hb=aff83c8798602b535d13edeaffdb8f4238e2bbf5;hpb=88a7ba9745b8318ca6c4f741906a40e3d6a8f07e 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 index 0000000..f72bc16 --- /dev/null +++ b/war/src/main/java/net/wpitchoune/pnews/ArticleStore.java @@ -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> articles = new HashMap<>(); + private final static Logger LOG = Logger.getLogger(ArticleStore.class.getName()); + + public Article get(String link) { + WeakReference
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
result; + Article a; + + synchronized (articles) { + result = new ArrayList<>(articles.size()); + + for (WeakReference
r: articles.values()) { + a = r.get(); + if (a != null) + result.add(a); + } + + return result.toArray(new Article[] {}); + } + } +}