<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>
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);
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");
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>");
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
--- /dev/null
+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);
+
+ }
+}
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;
}
}
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[] {});
+ }
+ }
}
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());
}
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());
}
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);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
+ final String METHOD_NAME = "doGet";
String path;
InputStream in;
LOG.info("doGet " + req.getRemoteAddr().toString() + " " + req.getRequestURI() + " " + req.getQueryString());
+ LOG.info(METHOD_NAME + " queryString=" + req.getQueryString());
+
path = req.getPathInfo();
if (path.equals("/redirect")) {