provide some stats as json
authorJean-Philippe Orsini <orsinije@fr.ibm.com>
Wed, 18 Oct 2017 21:31:53 +0000 (23:31 +0200)
committerJean-Philippe Orsini <orsinije@fr.ibm.com>
Wed, 18 Oct 2017 21:31:53 +0000 (23:31 +0200)
war/pom.xml
war/src/main/java/pnews/HTML.java
war/src/main/java/pnews/JSON.java [new file with mode: 0644]
war/src/main/java/pnews/servlet/ArticleStore.java
war/src/main/java/pnews/servlet/Pnews.java

index e68b9c6..d038cd3 100644 (file)
                         <artifactId>jsoup</artifactId>
                         <version>1.10.3</version>
                 </dependency>
+                <dependency>
+                        <groupId>com.google.code.gson</groupId>
+                        <artifactId>gson</artifactId>
+                        <version>2.8.2</version>
+                </dependency>
         </dependencies>
 </project>
index 9478fa2..4b4af8b 100644 (file)
@@ -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("<a href='");
                buf.append(href);
@@ -29,7 +36,7 @@ public class HTML {
                buf.append("</p>\n");
        }
        
-       private static void append(StringBuffer buf, Article a) {               
+       private static void append(StringBuffer buf, Article a) throws UnsupportedEncodingException {           
                buf.append("<div class='article'>\n");
                
                buf.append("<div class='article-image'>\n");
@@ -43,7 +50,7 @@ public class HTML {
                buf.append("<div class='article-content'>\n");
 
                buf.append("<div class='article-title'>\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("</div>\n");
                
                buf.append("<div class='article-info'>" + a.website + " - " + a.publicationDate + "</div>");
@@ -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 (file)
index 0000000..d01173d
--- /dev/null
@@ -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);
+                
+        }
+}
index 0b40cc3..b0f2e68 100644 (file)
@@ -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<String, WeakReference<Article>> articles = new HashMap<>();
+        private final static Logger LOG = Logger.getLogger(ArticleStore.class.getName());
         
         public Article get(String link) {
                 WeakReference<Article> 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<Article> result;
+                Article a;
+                                
+                synchronized (articles) {
+                        result = new ArrayList<>(articles.size());
+                        
+                        for (WeakReference<Article> r: articles.values()) {
+                                a = r.get();
+                                if (a != null)
+                                        result.add(a);
+                        }
+                        
+                        return result.toArray(new Article[] {});
+                }
+        }
 }
index dcb86ef..428ec87 100644 (file)
@@ -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<Article>(), 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")) {