From f4a4051dca40f99db1d84e6967dafbb6b1af647d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Tue, 17 Oct 2017 00:46:24 +0200 Subject: [PATCH] avoid duplicate article instances --- war/pom.xml | 4 +-- .../main/java/pnews/servlet/ArticleFactory.java | 8 +++++ .../main/java/pnews/servlet/ArticleProvider.java | 15 +++++---- war/src/main/java/pnews/servlet/ArticleStore.java | 36 ++++++++++++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 war/src/main/java/pnews/servlet/ArticleFactory.java create mode 100644 war/src/main/java/pnews/servlet/ArticleStore.java diff --git a/war/pom.xml b/war/pom.xml index 3b1f825..e68b9c6 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -8,8 +8,8 @@ UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/war/src/main/java/pnews/servlet/ArticleFactory.java b/war/src/main/java/pnews/servlet/ArticleFactory.java new file mode 100644 index 0000000..b89bebb --- /dev/null +++ b/war/src/main/java/pnews/servlet/ArticleFactory.java @@ -0,0 +1,8 @@ +package pnews.servlet; + +import pnews.Article; + +@FunctionalInterface +public interface ArticleFactory { + Article create(); +} diff --git a/war/src/main/java/pnews/servlet/ArticleProvider.java b/war/src/main/java/pnews/servlet/ArticleProvider.java index c6cad50..d3e4f3d 100644 --- a/war/src/main/java/pnews/servlet/ArticleProvider.java +++ b/war/src/main/java/pnews/servlet/ArticleProvider.java @@ -120,10 +120,10 @@ public class ArticleProvider { return false; } - private Article toArticle(String link, Category cat, SyndEntry entry, SyndFeed feed) { + private static Article toArticle(String link, SyndEntry entry, SyndFeed feed) { String desc, title, thumbnail; Date date; - + thumbnail = null; for (SyndEnclosure e: entry.getEnclosures()) { if (e.getType().startsWith("image/")) @@ -151,9 +151,9 @@ public class ArticleProvider { return new Article(link, title, desc, thumbnail, date, title); } - + private void addArticles(Category cat, SyndFeed feed) { - String link, feedTitle; + String feedTitle; List
articles; Article a; @@ -162,14 +162,14 @@ public class ArticleProvider { LOG.info("addArticles " + cat.getId() + " " + feedTitle + " number of articles: " + feed.getEntries().size()); for (SyndEntry entry: feed.getEntries()) { - link = entry.getLink().trim(); + String link = entry.getLink().trim(); articles = getArticlesForUpdate(cat); if (exists(link, articles)) { LOG.fine("addArticles " + link + " is already present"); continue ; } - a = toArticle(link, cat, entry, feed); + a = ArticleStore.singleton.getArticle(link, ()->toArticle(link, entry, feed)); synchronized (articles) { articles.add(a); @@ -185,14 +185,13 @@ public class ArticleProvider { return -1; return o2.publicationDate.compareTo(o1.publicationDate); } - }); } } LOG.info("addArticles done " + cat.getId()); } - + private void retrieveArticles(Category cat) throws IllegalArgumentException, MalformedURLException, FeedException, IOException { String[] feeds; diff --git a/war/src/main/java/pnews/servlet/ArticleStore.java b/war/src/main/java/pnews/servlet/ArticleStore.java new file mode 100644 index 0000000..0b40cc3 --- /dev/null +++ b/war/src/main/java/pnews/servlet/ArticleStore.java @@ -0,0 +1,36 @@ +package pnews.servlet; + +import java.lang.ref.WeakReference; +import java.util.HashMap; + +import pnews.Article; + +public class ArticleStore { + public final static ArticleStore singleton = new ArticleStore(); + private final HashMap> articles = new HashMap<>(); + + public Article get(String link) { + WeakReference
ref; + + synchronized (articles) { + ref = articles.get(link); + if (ref == null) + return null; + return ref.get(); + } + } + + 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)); + } + + return result; + } + } +} -- 2.7.4