From bdbb917350f994d72d57881a0c057db3392a4733 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Wed, 18 Oct 2017 23:31:53 +0200 Subject: [PATCH] provide some stats as json --- war/pom.xml | 5 +++ war/src/main/java/pnews/HTML.java | 17 ++++++++-- war/src/main/java/pnews/JSON.java | 28 ++++++++++++++++ war/src/main/java/pnews/servlet/ArticleStore.java | 40 +++++++++++++++++++++-- war/src/main/java/pnews/servlet/Pnews.java | 12 ++++--- 5 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 war/src/main/java/pnews/JSON.java diff --git a/war/pom.xml b/war/pom.xml index e68b9c6..d038cd3 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -29,5 +29,10 @@ jsoup 1.10.3 + + com.google.code.gson + gson + 2.8.2 + diff --git a/war/src/main/java/pnews/HTML.java b/war/src/main/java/pnews/HTML.java index 9478fa2..4b4af8b 100644 --- a/war/src/main/java/pnews/HTML.java +++ b/war/src/main/java/pnews/HTML.java @@ -1,8 +1,15 @@ package pnews; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; public class HTML { + private static final String CLASS_NAME= HTML.class.getName(); + private static final Logger LOG = Logger.getLogger(CLASS_NAME); + private static void appendA(StringBuffer buf, String child, String href, String cl) { buf.append("\n"); buf.append("
\n"); @@ -43,7 +50,7 @@ public class HTML { buf.append("
\n"); buf.append("
\n"); - appendA(buf, a.title, "redirect?url="+a.link, null); + appendA(buf, a.title, "redirect?url=" + URLEncoder.encode(a.link, "UTF-8"), null); buf.append("
\n"); buf.append(""); @@ -101,7 +108,11 @@ public class HTML { i = 0; for (Article e: articles) { - append(buf, e); + try { + append(buf, e); + } catch (UnsupportedEncodingException e1) { + LOG.log(Level.SEVERE, "fail to convert article to HTML", e1); + } if (i == 100) break; else diff --git a/war/src/main/java/pnews/JSON.java b/war/src/main/java/pnews/JSON.java new file mode 100644 index 0000000..d01173d --- /dev/null +++ b/war/src/main/java/pnews/JSON.java @@ -0,0 +1,28 @@ +package pnews; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import pnews.servlet.ArticleStore; + +public class JSON { + public static String getStats() { + JsonObject jarticles, jreadcounts; + Article[] articles; + + jarticles = new JsonObject(); + + jarticles.addProperty("articles-count", ArticleStore.singleton.size()); + + jreadcounts = new JsonObject(); + jarticles.add("read-counts", jreadcounts); + + articles = ArticleStore.singleton.getArticles(); + for (Article a: articles) + if (a.readCount.get() > 0) + jreadcounts.addProperty(a.link, a.readCount); + + return new Gson().toJson(jarticles); + + } +} diff --git a/war/src/main/java/pnews/servlet/ArticleStore.java b/war/src/main/java/pnews/servlet/ArticleStore.java index 0b40cc3..b0f2e68 100644 --- a/war/src/main/java/pnews/servlet/ArticleStore.java +++ b/war/src/main/java/pnews/servlet/ArticleStore.java @@ -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> 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) + 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
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[] {}); + } + } } diff --git a/war/src/main/java/pnews/servlet/Pnews.java b/war/src/main/java/pnews/servlet/Pnews.java index dcb86ef..428ec87 100644 --- a/war/src/main/java/pnews/servlet/Pnews.java +++ b/war/src/main/java/pnews/servlet/Pnews.java @@ -23,6 +23,7 @@ import com.rometools.rome.io.FeedException; import pnews.Article; import pnews.Category; import pnews.HTML; +import pnews.JSON; public class Pnews extends HttpServlet { private static final Logger LOG = Logger.getLogger(Pnews.class.getName()); @@ -87,10 +88,10 @@ public class Pnews extends HttpServlet { } private void writeStats(HttpServletResponse rp) throws IOException { - rp.setContentType("text/html;charset=utf-8"); - rp.setCharacterEncoding("utf8-8"); + rp.setContentType("application/json;charset=utf-8"); + rp.setCharacterEncoding("utf-8"); - rp.getWriter().write("" + ArticleStore.singleton); + rp.getWriter().write(JSON.getStats()); } @@ -104,7 +105,7 @@ public class Pnews extends HttpServlet { html = HTML.toHTML(articles, cat); rp.setContentType("text/html;charset=utf-8"); rp.getWriter().write(html); - rp.setCharacterEncoding("utf8-8"); + rp.setCharacterEncoding("utf-8"); } else { LOG.severe("writeArticles cannot retrieve any articles"); html = HTML.toHTML(new ArrayList
(), cat); @@ -130,6 +131,7 @@ public class Pnews extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { + final String METHOD_NAME = "doGet"; String path; InputStream in; @@ -137,6 +139,8 @@ public class Pnews extends HttpServlet { LOG.info("doGet " + req.getRemoteAddr().toString() + " " + req.getRequestURI() + " " + req.getQueryString()); + LOG.info(METHOD_NAME + " queryString=" + req.getQueryString()); + path = req.getPathInfo(); if (path.equals("/redirect")) { -- 2.7.4