1. Made changes so that for people who have 0 known publications sparkline vis is not generated at all for their profile page.

This commit is contained in:
cdtank 2010-07-14 19:30:06 +00:00
parent 68533c7bd3
commit 6a5194d677
2 changed files with 343 additions and 337 deletions

View file

@ -1,335 +1,338 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */ /* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.personpubcount; package edu.cornell.mannlib.vitro.webapp.visualization.personpubcount;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashSet; import java.util.List;
import java.util.List; import java.util.Map;
import java.util.Map; import java.util.Map.Entry;
import java.util.Set;
import java.util.Map.Entry; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletOutputStream;
import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log;
import org.skife.csv.CSVWriter;
import org.apache.commons.logging.Log; import org.skife.csv.SimpleWriter;
import org.skife.csv.CSVWriter;
import org.skife.csv.SimpleWriter; import com.hp.hpl.jena.query.DataSource;
import com.itextpdf.text.Document;
import com.hp.hpl.jena.query.DataSource; import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter; import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers; import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.visualization.PDFDocument;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants; import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.PDFDocument; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.SparklineVOContainer;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException; import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual; public class VisualizationRequestHandler {
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.SparklineVOContainer;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions; private VitroRequest vitroRequest;
private HttpServletRequest request;
public class VisualizationRequestHandler { private HttpServletResponse response;
private Log log;
private VitroRequest vitroRequest;
private HttpServletRequest request;
private HttpServletResponse response;
private Log log; public VisualizationRequestHandler(VitroRequest vitroRequest,
HttpServletRequest request, HttpServletResponse response, Log log) {
this.vitroRequest = vitroRequest;
public VisualizationRequestHandler(VitroRequest vitroRequest, this.request = request;
HttpServletRequest request, HttpServletResponse response, Log log) { this.response = response;
this.log = log;
this.vitroRequest = vitroRequest;
this.request = request; }
this.response = response;
this.log = log; public void generateVisualization(DataSource dataSource) {
} String resultFormatParam = "RS_TEXT";
String rdfResultFormatParam = "RDF/XML-ABBREV";
public void generateVisualization(DataSource dataSource) {
String individualURIParam = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE);
String resultFormatParam = "RS_TEXT";
String rdfResultFormatParam = "RDF/XML-ABBREV"; String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE);
String individualURIParam = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE); String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE);
String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE); String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE);
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE); QueryHandler queryManager =
new QueryHandler(individualURIParam,
String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE); resultFormatParam,
rdfResultFormatParam,
QueryHandler queryManager = dataSource,
new QueryHandler(individualURIParam, log);
resultFormatParam,
rdfResultFormatParam, try {
dataSource, List<BiboDocument> authorDocuments = queryManager.getVisualizationJavaValueObjects();
log);
/*
try { * Create a map from the year to number of publications. Use the BiboDocument's
List<BiboDocument> authorDocuments = queryManager.getVisualizationJavaValueObjects(); * parsedPublicationYear to populate the data.
* */
/* Map<String, Integer> yearToPublicationCount =
* Create a map from the year to number of publications. Use the BiboDocument's queryManager.getYearToPublicationCount(authorDocuments);
* parsedPublicationYear to populate the data.
* */ /*
Map<String, Integer> yearToPublicationCount = * In order to avoid unneeded computations we have pushed this "if" condition up.
queryManager.getYearToPublicationCount(authorDocuments); * This case arises when the render mode is data. In that case we dont want to generate
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow.
/* * It is ugly!
* In order to avoid unneeded computations we have pushed this "if" condition up. * */
* This case arises when the render mode is data. In that case we dont want to generate if (VisualizationFrameworkConstants.DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow. prepareVisualizationQueryDataResponse(queryManager.getAuthor(),
* It is ugly! authorDocuments,
* */ yearToPublicationCount);
if (VisualizationFrameworkConstants.DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) { return;
prepareVisualizationQueryDataResponse(queryManager.getAuthor(), }
authorDocuments,
yearToPublicationCount);
return; if (VisualizationFrameworkConstants.PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
} prepareVisualizationQueryPDFResponse(queryManager.getAuthor(),
authorDocuments,
yearToPublicationCount);
if (VisualizationFrameworkConstants.PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) { return;
prepareVisualizationQueryPDFResponse(queryManager.getAuthor(), }
authorDocuments,
yearToPublicationCount); /*
return; * Computations required to generate HTML for the sparklines & related context.
} * */
/* SparklineVOContainer valueObjectContainer = new SparklineVOContainer();
* Computations required to generate HTML for the sparklines & related context.
* */ VisualizationCodeGenerator visualizationCodeGenerator =
new VisualizationCodeGenerator(vitroRequest.getContextPath(),
SparklineVOContainer valueObjectContainer = new SparklineVOContainer(); individualURIParam,
visMode,
VisualizationCodeGenerator visualizationCodeGenerator = visContainer,
new VisualizationCodeGenerator(vitroRequest.getContextPath(), authorDocuments,
individualURIParam, yearToPublicationCount,
visMode, valueObjectContainer,
visContainer, log);
authorDocuments,
yearToPublicationCount,
valueObjectContainer, /*
log); * This is side-effecting because the response of this method is just to redirect to
* a page with visualization on it.
* */
/* RequestDispatcher requestDispatcher = null;
* This is side-effecting because the response of this method is just to redirect to
* a page with visualization on it. if (VisualizationFrameworkConstants.DYNAMIC_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
* */
RequestDispatcher requestDispatcher = null; prepareVisualizationQueryDynamicResponse(request, response, vitroRequest,
valueObjectContainer, yearToPublicationCount);
if (VisualizationFrameworkConstants.DYNAMIC_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) { requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
prepareVisualizationQueryDynamicResponse(request, response, vitroRequest, } else {
valueObjectContainer); prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp"); valueObjectContainer);
} else { requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest, }
valueObjectContainer);
try {
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP); requestDispatcher.forward(request, response);
} } catch (Exception e) {
log.error("EntityEditController could not forward to view.");
try { log.error(e.getMessage());
requestDispatcher.forward(request, response); log.error(e.getStackTrace());
} catch (Exception e) { }
log.error("EntityEditController could not forward to view.");
log.error(e.getMessage()); } catch (MalformedQueryParametersException e) {
log.error(e.getStackTrace()); try {
} handleMalformedParameters(e.getMessage());
} catch (ServletException e1) {
} catch (MalformedQueryParametersException e) { log.error(e1.getStackTrace());
try { } catch (IOException e1) {
handleMalformedParameters(e.getMessage()); log.error(e1.getStackTrace());
} catch (ServletException e1) { }
log.error(e1.getStackTrace()); return;
} catch (IOException e1) { }
log.error(e1.getStackTrace());
} }
return;
} private void prepareVisualizationQueryPDFResponse(Individual author, List<BiboDocument> authorDocuments,
Map<String, Integer> yearToPublicationCount) {
}
String authorName = null;
private void prepareVisualizationQueryPDFResponse(Individual author, List<BiboDocument> authorDocuments,
Map<String, Integer> yearToPublicationCount) { /*
* To protect against cases where there are no author documents associated with the
String authorName = null; * individual.
* */
/* if (authorDocuments.size() > 0) {
* To protect against cases where there are no author documents associated with the authorName = author.getIndividualLabel();
* individual. }
* */
if (authorDocuments.size() > 0) { /*
authorName = author.getIndividualLabel(); * To make sure that null/empty records for author names do not cause any mischief.
} * */
if (authorName == null) {
/* authorName = "";
* To make sure that null/empty records for author names do not cause any mischief. }
* */
if (authorName == null) { String outputFileName = UtilityFunctions.slugify(authorName) + "report" + ".pdf";
authorName = "";
} response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
String outputFileName = UtilityFunctions.slugify(authorName) + "report" + ".pdf";
ServletOutputStream responseOutputStream;
response.setContentType("application/pdf"); try {
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName); responseOutputStream = response.getOutputStream();
ServletOutputStream responseOutputStream;
try { Document document = new Document();
responseOutputStream = response.getOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
document.open();
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream(); PDFDocument pdfDocument = new PDFDocument(authorName, yearToPublicationCount, document, pdfWriter);
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
document.open(); document.close();
PDFDocument pdfDocument = new PDFDocument(authorName, yearToPublicationCount, document, pdfWriter); // setting some response headers & content type
response.setHeader("Expires", "0");
document.close(); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
// setting some response headers & content type response.setContentLength(baos.size());
response.setHeader("Expires", "0"); // write ByteArrayOutputStream to the ServletOutputStream
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); baos.writeTo(responseOutputStream);
response.setHeader("Pragma", "public"); responseOutputStream.flush();
response.setContentLength(baos.size()); responseOutputStream.close();
// write ByteArrayOutputStream to the ServletOutputStream
baos.writeTo(responseOutputStream); } catch (IOException e) {
responseOutputStream.flush(); e.printStackTrace();
responseOutputStream.close(); } catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) { }
e.printStackTrace(); }
} catch (DocumentException e) {
e.printStackTrace(); private void prepareVisualizationQueryDataResponse(Individual author, List<BiboDocument> authorDocuments,
} Map<String, Integer> yearToPublicationCount) {
}
String authorName = null;
private void prepareVisualizationQueryDataResponse(Individual author, List<BiboDocument> authorDocuments,
Map<String, Integer> yearToPublicationCount) { /*
* To protect against cases where there are no author documents associated with the
String authorName = null; * individual.
* */
/* if (authorDocuments.size() > 0) {
* To protect against cases where there are no author documents associated with the authorName = author.getIndividualLabel();
* individual. }
* */
if (authorDocuments.size() > 0) { /*
authorName = author.getIndividualLabel(); * To make sure that null/empty records for author names do not cause any mischief.
} * */
if (authorName == null) {
/* authorName = "";
* To make sure that null/empty records for author names do not cause any mischief. }
* */
if (authorName == null) { String outputFileName = UtilityFunctions.slugify(authorName) + "pub-count-sparkline" + ".csv";
authorName = "";
} response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
String outputFileName = UtilityFunctions.slugify(authorName) + "pub-count-sparkline" + ".csv";
try {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName); PrintWriter responseWriter = response.getWriter();
try { /*
* We are side-effecting responseWriter since we are directly manipulating the response
PrintWriter responseWriter = response.getWriter(); * object of the servlet.
* */
/* generateCsvFileBuffer(yearToPublicationCount,
* We are side-effecting responseWriter since we are directly manipulating the response responseWriter);
* object of the servlet.
* */ responseWriter.close();
generateCsvFileBuffer(yearToPublicationCount,
responseWriter); } catch (IOException e) {
e.printStackTrace();
responseWriter.close(); }
}
} catch (IOException e) {
e.printStackTrace(); private void generateCsvFileBuffer(Map<String, Integer> yearToPublicationCount,
} PrintWriter responseWriter) {
}
CSVWriter csvWriter = new SimpleWriter(responseWriter);
private void generateCsvFileBuffer(Map<String, Integer> yearToPublicationCount,
PrintWriter responseWriter) { try {
csvWriter.append(new String[]{"Year", "Publications"});
CSVWriter csvWriter = new SimpleWriter(responseWriter); for (Entry<String, Integer> currentEntry : yearToPublicationCount.entrySet()) {
csvWriter.append(new Object[]{currentEntry.getKey(), currentEntry.getValue()});
try { }
csvWriter.append(new String[]{"Year", "Publications"});
for (Entry<String, Integer> currentEntry : yearToPublicationCount.entrySet()) { } catch (IOException e) {
csvWriter.append(new Object[]{currentEntry.getKey(), currentEntry.getValue()}); e.printStackTrace();
} }
} catch (IOException e) { responseWriter.flush();
e.printStackTrace();
} }
responseWriter.flush(); private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
HttpServletResponse response, VitroRequest vreq,
} SparklineVOContainer valueObjectContainer) {
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request, Portal portal = vreq.getPortal();
HttpServletResponse response, VitroRequest vreq,
SparklineVOContainer valueObjectContainer) { request.setAttribute("sparklineVO", valueObjectContainer);
Portal portal = vreq.getPortal(); request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
request.setAttribute("portalBean", portal);
request.setAttribute("sparklineVO", valueObjectContainer); request.setAttribute("title", "Individual Publication Count visualization");
request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
request.setAttribute("portalBean", portal); }
request.setAttribute("title", "Individual Publication Count visualization");
request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp"); private void prepareVisualizationQueryDynamicResponse(HttpServletRequest request,
HttpServletResponse response, VitroRequest vreq, SparklineVOContainer valueObjectContainer,
} Map<String, Integer> yearToPublicationCount) {
private void prepareVisualizationQueryDynamicResponse(HttpServletRequest request, Portal portal = vreq.getPortal();
HttpServletResponse response, VitroRequest vreq, SparklineVOContainer valueObjectContainer) {
request.setAttribute("sparklineVO", valueObjectContainer);
Portal portal = vreq.getPortal();
if (yearToPublicationCount.size() > 0) {
request.setAttribute("sparklineVO", valueObjectContainer); request.setAttribute("shouldVIVOrenderVis", true);
} else {
request.setAttribute("portalBean", portal); request.setAttribute("shouldVIVOrenderVis", false);
request.setAttribute("bodyJsp", "/templates/visualization/ajax_vis_content.jsp"); }
} request.setAttribute("portalBean", portal);
request.setAttribute("bodyJsp", "/templates/visualization/ajax_vis_content.jsp");
private void handleMalformedParameters(String errorMessage)
throws ServletException, IOException { }
Portal portal = vitroRequest.getPortal(); private void handleMalformedParameters(String errorMessage)
throws ServletException, IOException {
request.setAttribute("error", errorMessage);
Portal portal = vitroRequest.getPortal();
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp"); request.setAttribute("error", errorMessage);
request.setAttribute("portalBean", portal);
request.setAttribute("title", "Visualization Query Error - Individual Publication Count"); RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
try { request.setAttribute("portalBean", portal);
requestDispatcher.forward(request, response); request.setAttribute("title", "Visualization Query Error - Individual Publication Count");
} catch (Exception e) {
log.error("EntityEditController could not forward to view."); try {
log.error(e.getMessage()); requestDispatcher.forward(request, response);
log.error(e.getStackTrace()); } catch (Exception e) {
} log.error("EntityEditController could not forward to view.");
} log.error(e.getMessage());
log.error(e.getStackTrace());
} }
}
}

View file

@ -4,6 +4,9 @@
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:set var='sparkline' value='${requestScope.sparklineVO}'/> <c:set var='sparkline' value='${requestScope.sparklineVO}'/>
<c:set var='shouldVIVOrenderVis' value='${requestScope.shouldVIVOrenderVis}'/>
${sparkline.sparklineContent} <c:if test="${shouldVIVOrenderVis}">
${sparkline.sparklineContext} ${sparkline.sparklineContent}
${sparkline.sparklineContext}
</c:if>