1. Refactored code to use a utility method instead of having the same method being defined in each of the vis request handlers.

2. Adding a "person level" vis package to handle combination of sparkline & co-authorship vis page.
3. Testing out the concept of accessing fields of a class form jsp page.
This commit is contained in:
cdtank 2010-07-01 15:54:11 +00:00
parent d87ffcc3be
commit 0e8e1dc9e2
16 changed files with 848 additions and 152 deletions

View file

@ -113,6 +113,9 @@ public class VisualizationController extends BaseEditController {
public static final String COAUTHORSHIP_VIS_URL_VALUE
= "coauthorship";
public static final String PERSON_LEVEL_VIS_URL_VALUE
= "person_level";
public static final String UTILITIES_URL_VALUE
= "utilities";
@ -204,7 +207,32 @@ public class VisualizationController extends BaseEditController {
* This is side-effecting because the visualization content is added
* to the request object.
* */
visRequestHandler.generateVisualization(this, dataSource);
visRequestHandler.generateVisualization(dataSource);
} else {
log.error("ERROR! data model empoty");
}
} else if (PERSON_LEVEL_VIS_URL_VALUE
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
edu.cornell.mannlib.vitro.webapp.visualization.personlevel.VisualizationRequestHandler visRequestHandler =
new edu.cornell.mannlib.vitro.webapp.visualization.personlevel.VisualizationRequestHandler(vreq, request, response, log);
String rdfResultFormatParam = "RDF/XML-ABBREV";
DataSource dataSource = setupJENADataSource(request,
response,
vreq,
rdfResultFormatParam);
if (dataSource != null) {
/*
* This is side-effecting because the visualization content is added
* to the request object.
* */
visRequestHandler.generateVisualization(dataSource);
} else {
log.error("ERROR! data model empoty");

View file

@ -15,7 +15,6 @@ import com.hp.hpl.jena.query.DataSource;
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
@ -36,7 +35,7 @@ public class VisualizationRequestHandler {
}
public void generateVisualization(VisualizationController visualizationController, DataSource dataSource) {
public void generateVisualization(DataSource dataSource) {
String resultFormatParam = "RS_TEXT";
String rdfResultFormatParam = "RDF/XML-ABBREV";

View file

@ -40,6 +40,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoDepartmentOrDivision;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoEmployee;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
public class VisualizationRequestHandler {
@ -275,7 +276,7 @@ public class VisualizationRequestHandler {
authorName = "";
}
String outputFileName = slugify(authorName + "-report")
String outputFileName = UtilityFunctions.slugify(authorName + "-report")
+ ".pdf";
response.setContentType("application/pdf");
@ -335,7 +336,7 @@ public class VisualizationRequestHandler {
collegeName = "";
}
String outputFileName = slugify(collegeName) + "depts-pub-count" + ".csv";
String outputFileName = UtilityFunctions.slugify(collegeName) + "depts-pub-count" + ".csv";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
@ -359,17 +360,6 @@ public class VisualizationRequestHandler {
}
}
/**
* Currently the approach for slugifying filenames is naive. In future if there is need,
* we can write more sophisticated method.
* @param textToBeSlugified
* @return
*/
private String slugify(String textToBeSlugified) {
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
}
private void generateCsvFileBuffer(
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
Map<String, VivoCollegeOrSchool> collegeURLToVO, PrintWriter printWriter) {

View file

@ -0,0 +1,213 @@
package edu.cornell.mannlib.vitro.webapp.visualization.personlevel;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.DataSource;
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.CoAuthorshipGraphMLWriter;
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.QueryHandler;
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.VisVOContainer;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
public class VisualizationRequestHandler {
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;
this.request = request;
this.response = response;
this.log = log;
}
public void generateVisualization(DataSource dataSource) {
String resultFormatParam = "RS_TEXT";
String rdfResultFormatParam = "RDF/XML-ABBREV";
String egoURIParam = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE);
String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE);
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE);
String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE);
QueryHandler queryManager =
new QueryHandler(egoURIParam,
resultFormatParam,
rdfResultFormatParam,
dataSource,
log);
try {
VisVOContainer authorNodesAndEdges = queryManager.getVisualizationJavaValueObjects();
/*
* 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
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow.
* It is ugly!
* */
if (VisualizationFrameworkConstants.DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
/*
* When just the graphML file is required - based on which actual visualization will
* be rendered.
* */
prepareVisualizationQueryDataResponse(authorNodesAndEdges);
return;
}
/*
* Computations required to generate HTML for the sparklines & related context.
* */
/*
* This is required because when deciding the range of years over which the vis
* was rendered we dont want to be influenced by the "DEFAULT_PUBLICATION_YEAR".
* */
// publishedYearsForCollege.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
VisualizationCodeGenerator visualizationCodeGenerator =
new VisualizationCodeGenerator(yearToPublicationCount, log);
String visContentCode = visualizationCodeGenerator
.getMainVisualizationCode(authorDocuments,
publishedYears,
visMode,
visContainer);
String visContextCode = visualizationCodeGenerator
.getVisualizationContextCode(vitroRequest.getRequestURI(),
collegeURIParam,
visMode);
*/
/*
* This is side-effecting because the response of this method is just to redirect to
* a page with visualization on it.
* */
RequestDispatcher requestDispatcher = null;
prepareVisualizationQueryStandaloneResponse(egoURIParam, request, response, vitroRequest);
// requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
try {
requestDispatcher.forward(request, response);
} catch (Exception e) {
log.error("EntityEditController could not forward to view.");
log.error(e.getMessage());
log.error(e.getStackTrace());
}
} catch (MalformedQueryParametersException e) {
try {
handleMalformedParameters(e.getMessage());
} catch (ServletException e1) {
log.error(e1.getStackTrace());
} catch (IOException e1) {
log.error(e1.getStackTrace());
}
return;
}
}
private void prepareVisualizationQueryDataResponse(VisVOContainer coAuthorsipVO) {
String outputFileName = UtilityFunctions.slugify(coAuthorsipVO.getEgoNode().getNodeName())
+ "-coauthor-net" + ".graphml";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
try {
PrintWriter responseWriter = response.getWriter();
/*
* We are side-effecting responseWriter since we are directly manipulating the response
* object of the servlet.
* */
CoAuthorshipGraphMLWriter coAuthorShipGraphMLWriter = new CoAuthorshipGraphMLWriter(coAuthorsipVO);
responseWriter.append(coAuthorShipGraphMLWriter.getCoAuthorshipGraphMLContent());
responseWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void prepareVisualizationQueryStandaloneResponse(String egoURIParam,
HttpServletRequest request,
HttpServletResponse response,
VitroRequest vreq) {
Portal portal = vreq.getPortal();
// request.setAttribute("visContentCode", visContentCode);
// request.setAttribute("visContextCode", visContextCode);
request.setAttribute("egoURIParam", egoURIParam);
request.setAttribute("bodyJsp", "/templates/visualization/person_level.jsp");
request.setAttribute("portalBean", portal);
// request.setAttribute("title", "Individual Publication Count Visualization");
// request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
}
private void handleMalformedParameters(String errorMessage)
throws ServletException, IOException {
Portal portal = vitroRequest.getPortal();
request.setAttribute("error", errorMessage);
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
request.setAttribute("portalBean", portal);
request.setAttribute("title", "Visualization Query Error - Individual Publication Count");
try {
requestDispatcher.forward(request, response);
} catch (Exception e) {
log.error("EntityEditController could not forward to view.");
log.error(e.getMessage());
log.error(e.getStackTrace());
}
}
}

View file

@ -164,7 +164,9 @@ public class VisualizationCodeGenerator {
"position:absolute;" +
"}" +
".sparkline_range {" +
"color:#7BS69E;" +
"color:#7BA69E;" +
"font-size:0.9em;" +
"font-style:italic;" +
"}" +
"</style>\n");
@ -360,7 +362,7 @@ public class VisualizationCodeGenerator {
"+ " + renderedFullSparks + "" +
"+ ' papers with year from '" +
"+ ' " + totalPublications + " '" +
"+ ' total'" +
"+ ' total " +
"<span class=\"sparkline_range\">" +
"(" + minPubYearConsidered + " - " + currentYear + ")" +
"</span>'" +

View file

@ -34,6 +34,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
public class VisualizationRequestHandler {
@ -147,7 +148,7 @@ public class VisualizationRequestHandler {
} else {
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
visContentCode, visContextCode);
visContentCode, visContextCode, valueObjectContainer);
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
}
@ -193,7 +194,7 @@ public class VisualizationRequestHandler {
authorName = "";
}
String outputFileName = slugify(authorName) + "report" + ".pdf";
String outputFileName = UtilityFunctions.slugify(authorName) + "report" + ".pdf";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
@ -249,7 +250,7 @@ public class VisualizationRequestHandler {
authorName = "";
}
String outputFileName = slugify(authorName) + "pub-count-sparkline" + ".csv";
String outputFileName = UtilityFunctions.slugify(authorName) + "pub-count-sparkline" + ".csv";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
@ -272,17 +273,6 @@ public class VisualizationRequestHandler {
}
}
/**
* Currently the approach for slugifying filenames is naive. In future if there is need,
* we can write more sophisticated method.
* @param textToBeSlugified
* @return
*/
private String slugify(String textToBeSlugified) {
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
}
private void generateCsvFileBuffer(Map<String, Integer> yearToPublicationCount,
PrintWriter responseWriter) {
@ -304,12 +294,13 @@ public class VisualizationRequestHandler {
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
HttpServletResponse response, VitroRequest vreq,
String visContentCode, String visContextCode) {
String visContentCode, String visContextCode, VisVOContainer valueObjectContainer) {
Portal portal = vreq.getPortal();
request.setAttribute("visContentCode", visContentCode);
request.setAttribute("visContextCode", visContextCode);
request.setAttribute("sparklineVO", valueObjectContainer);
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
request.setAttribute("portalBean", portal);

View file

@ -8,7 +8,7 @@ import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
/**
*
@ -64,7 +64,7 @@ public class Edge {
@SuppressWarnings("serial")
public Map<String, Integer> getEarliestCollaborationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
}
/*
@ -96,7 +96,7 @@ public class Edge {
@SuppressWarnings("serial")
public Map<String, Integer> getLatestCollaborationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
}
/*
@ -128,7 +128,7 @@ public class Edge {
@SuppressWarnings("serial")
public Integer getUnknownCollaborationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
}
Integer unknownYearPubCount = yearToPublicationCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR);

View file

@ -8,7 +8,7 @@ import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
/**
*
@ -65,7 +65,7 @@ public class Node extends Individual {
@SuppressWarnings("serial")
public Map<String, Integer> getEarliestPublicationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
System.out.println("early - " + yearToPublicationCount);
}
@ -98,7 +98,7 @@ public class Node extends Individual {
@SuppressWarnings("serial")
public Map<String, Integer> getLatestPublicationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
}
/*
@ -130,7 +130,7 @@ public class Node extends Individual {
public Integer getUnknownPublicationYearCount() {
if (yearToPublicationCount == null) {
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
}
Integer unknownYearPubCount = yearToPublicationCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR);

View file

@ -4,9 +4,10 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
public class VOUtils {
public class UtilityFunctions {
public static Map<String, Integer> getYearToPublicationCount(
Set<BiboDocument> authorDocuments) {
@ -51,5 +52,16 @@ public class VOUtils {
return yearToPublicationCount;
}
/**
* Currently the approach for slugifying filenames is naive. In future if there is need,
* we can write more sophisticated method.
* @param textToBeSlugified
* @return
*/
public static String slugify(String textToBeSlugified) {
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
}
}