/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.aries.samples.blog.web; import java.io.IOException; import java.io.PrintWriter; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.aries.samples.blog.api.BlogComment; import org.apache.aries.samples.blog.api.BlogEntry; import org.apache.aries.samples.blog.api.BloggingService; import org.apache.aries.samples.blog.web.util.HTMLOutput; import org.apache.aries.samples.blog.web.util.JNDIHelper; public class ViewBlog extends HttpServlet { private static final long serialVersionUID = -1854915218416871420L; private static final int POSTS_PER_PAGE = 10; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); BloggingService service = JNDIHelper.getBloggingService(); String blogTitle = service.getBlogTitle(); // TODO cope with the service being null, redirect elsewhere. HTMLOutput.writeHTMLHeaderPartOne(out, blogTitle); HTMLOutput.writeDojoUses(out, "dojo.parser"); HTMLOutput.writeHTMLHeaderPartTwo(out); int maxPage = (service.getNoOfEntries()-1) / POSTS_PER_PAGE; int pageNoInt = 0; String pageNo = req.getParameter("page"); if (pageNo != null) { try { pageNoInt = Integer.parseInt(pageNo)-1; if (pageNoInt > maxPage) pageNoInt = maxPage; else if (pageNoInt < 0) pageNoInt = 0; } catch (NumberFormatException e) { e.printStackTrace(); } } Iterator<? extends BlogEntry> posts = service.getBlogEntries(pageNoInt * POSTS_PER_PAGE, POSTS_PER_PAGE).iterator(); out.println("<div class=\"links\"><a href=\"CreateBlogEntryForm\">Create New Post</a> <a href=\"EditAuthorForm\">Create Author</a></div>"); Date currentDate = null; for (int i = 0; posts.hasNext(); i++) { BlogEntry post = posts.next(); if (doesNotMatch(post.getPublishDate(), currentDate)) { currentDate = post.getPublishDate(); out.print("<div class=\"postDate\">"); //out.print(DateFormat.getDateInstance(DateFormat.FULL).format(currentDate)); if (currentDate != null) { out.print(DateFormat.getDateInstance(DateFormat.FULL).format(currentDate)); } out.println("</div>"); } out.print("\t\t<div class=\"post\" id=\""); out.print(i); out.println("\">"); out.print("\t\t\t<div class=\"postTitle\">"); out.print(post.getTitle()); out.print("</div>"); out.print("\t\t\t<div class=\"postBody\">"); out.print(post.getBody()); out.println("</div>"); out.print("\t\t\t<div class=\"postAuthor\"><a href=\"ViewAuthor?email="); out.print(post.getAuthorEmail()); out.print("\">"); out.print(post.getAuthor().getFullName()); out.println("</a></div>"); if (service.isCommentingAvailable()) { out.print("<div class=\"links\"><a href=\"AddCommentForm?postId="); out.print(post.getId()); out.print("\">Add Comment</a></div>"); List<? extends BlogComment> comments = service .getCommentsForEntry(post); int size = comments.size(); out.print("<div class=\"commentTitle\""); if (size > 0) { out.print("onclick=\"expand("); out.print(post.getId()); out.print(")\""); } out.print(" style=\"cursor: pointer;\">Comments ("); out.print(size); out.println(")</div>"); if (size > 0) { out.print("<div id=\"comments"); out.print(post.getId()); out.println("\">"); for (BlogComment comment : comments) { out.println("<div class=\"comment\">"); out.println(comment.getComment()); out.println("</div>"); out .print("\t\t\t<div class=\"commentAuthor\"><a href=\"ViewAuthor?email="); out.print(comment.getAuthor().getEmailAddress()); out.print("\">"); out.print( comment.getAuthor().getName()); out.println("</a></div>"); } out.println("</div>"); } } out.println("\t\t</div>"); } /* * Translate indices from 0-indexed to 1-indexed */ writePager(out, pageNoInt+1, maxPage+1); HTMLOutput.writeHTMLFooter(out); } /** * Write a paging bar (if there is more than a single page) * * @param out * @param currentPage Page number (indices starting from 1) * @param maxPage (indices starting from 1) */ private void writePager(PrintWriter out, int currentPage, int maxPage) { /* * No paging is needed if we only have a single page */ if (maxPage > 1) { out.println("<div id=\"pagination\">"); if (currentPage > 1) { out.println("<a href=\"ViewBlog?page=1\"><<</a>"); out.println("<a href=\"ViewBlog?page="+(currentPage-1)+"\"><</a>"); } else { out.println("<span><<</span>"); out.println("<span><</span>"); } out.println(currentPage + " of " + maxPage); if (currentPage < maxPage) { out.println("<a href=\"ViewBlog?page="+(currentPage+1)+"\">></a>"); out.println("<a href=\"ViewBlog?page=" + maxPage + "\">>></a>"); } else { out.println("<span>>></span>"); out.println("<span>></span>"); } out.println("</div>"); } } private boolean doesNotMatch(Date publishDate, Date currentDate) { if (currentDate == null) return true; Calendar publish = Calendar.getInstance(); Calendar current = Calendar.getInstance(); publish.setTime(publishDate); current.setTime(currentDate); boolean differentYear = publish.get(Calendar.YEAR) != current.get(Calendar.YEAR); boolean differentMonth = publish.get(Calendar.MONTH) != current.get(Calendar.MONTH); boolean differentDayOfMonth = publish.get(Calendar.DAY_OF_MONTH) != current.get(Calendar.DAY_OF_MONTH); return differentYear || differentMonth || differentDayOfMonth; } }