1. Modified the content header for the graphML file so that it streams instead of downloading it to the user's machine as a file attachment. This is required because thats how the flash expects the input file to be.
2. Added Asik's first draft of the co-authorship visuazlization files. 3. Integrated the front end with the back end.
This commit is contained in:
parent
ff351a8dce
commit
ee2b141687
5 changed files with 497 additions and 247 deletions
|
@ -14,8 +14,7 @@ public class CoAuthorshipGraphMLWriter {
|
|||
|
||||
private StringBuilder coAuthorshipGraphMLContent;
|
||||
|
||||
public final String GRAPHML_HEADER = ""
|
||||
+ " <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
private final String GRAPHML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
+ " <graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\"\n"
|
||||
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
|
||||
+ " xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns\n"
|
||||
|
@ -29,6 +28,10 @@ public class CoAuthorshipGraphMLWriter {
|
|||
|
||||
}
|
||||
|
||||
public StringBuilder getCoAuthorshipGraphMLContent() {
|
||||
return coAuthorshipGraphMLContent;
|
||||
}
|
||||
|
||||
private StringBuilder createCoAuthorshipGraphMLContent(
|
||||
VisVOContainer visVOContainer) {
|
||||
|
||||
|
|
|
@ -3,14 +3,10 @@ package edu.cornell.mannlib.vitro.webapp.visualization.coauthorship;
|
|||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.servlet.RequestDispatcher;
|
||||
import javax.servlet.ServletException;
|
||||
|
@ -19,8 +15,6 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.skife.csv.CSVWriter;
|
||||
import org.skife.csv.SimpleWriter;
|
||||
|
||||
import com.hp.hpl.jena.query.DataSource;
|
||||
import com.itextpdf.text.Document;
|
||||
|
@ -32,16 +26,10 @@ import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
|||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.PDFDocument;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
||||
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.Edge;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node;
|
||||
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;
|
||||
|
||||
public class VisualizationRequestHandler {
|
||||
|
||||
|
@ -99,14 +87,6 @@ public class VisualizationRequestHandler {
|
|||
|
||||
|
||||
|
||||
/*
|
||||
if (PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||
prepareVisualizationQueryPDFResponse(authorDocuments,
|
||||
yearToPublicationCount);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Computations required to generate HTML for the sparklines & related context.
|
||||
* */
|
||||
|
@ -138,22 +118,13 @@ public class VisualizationRequestHandler {
|
|||
* a page with visualization on it.
|
||||
* */
|
||||
|
||||
/*
|
||||
RequestDispatcher requestDispatcher = null;
|
||||
|
||||
if (DYNAMIC_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||
prepareVisualizationQueryStandaloneResponse(egoURIParam, request, response, vitroRequest);
|
||||
|
||||
prepareVisualizationQueryDynamicResponse(request, response, vitroRequest,
|
||||
visContentCode, visContextCode);
|
||||
// requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
|
||||
|
||||
} else {
|
||||
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
|
||||
visContentCode, visContextCode);
|
||||
|
||||
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||
}
|
||||
|
||||
try {
|
||||
requestDispatcher.forward(request, response);
|
||||
} catch (Exception e) {
|
||||
|
@ -162,7 +133,6 @@ public class VisualizationRequestHandler {
|
|||
log.error(e.getStackTrace());
|
||||
}
|
||||
|
||||
*/
|
||||
} catch (MalformedQueryParametersException e) {
|
||||
try {
|
||||
handleMalformedParameters(e.getMessage());
|
||||
|
@ -176,139 +146,9 @@ public class VisualizationRequestHandler {
|
|||
|
||||
}
|
||||
|
||||
private Map<String, Integer> getUpdatedDepartmentPublicationsOverTime(
|
||||
Map<String, Integer> currentEmployeeYearToPublicationCount,
|
||||
Map<String, Integer> currentDepartmentYearToPublicationCount) {
|
||||
|
||||
Map<String, Integer> departmentYearToPublicationCount;
|
||||
|
||||
// System.out.println("inside get updated dept pub obr time");
|
||||
|
||||
/*
|
||||
* In case this is the first time we are consolidating publication counts over time for a department.
|
||||
* */
|
||||
if (currentDepartmentYearToPublicationCount == null) {
|
||||
departmentYearToPublicationCount = new TreeMap<String, Integer>();
|
||||
|
||||
// System.out.println("new dept yr pub cnt");
|
||||
|
||||
} else {
|
||||
departmentYearToPublicationCount = currentDepartmentYearToPublicationCount;
|
||||
}
|
||||
|
||||
|
||||
Iterator employeePubCountIterator = currentEmployeeYearToPublicationCount.entrySet().iterator();
|
||||
|
||||
while (employeePubCountIterator.hasNext()) {
|
||||
Map.Entry<String, Integer> employeePubCountEntry = (Map.Entry) employeePubCountIterator.next();
|
||||
|
||||
String employeePublicationYear = employeePubCountEntry.getKey();
|
||||
Integer employeePublicationCount = employeePubCountEntry.getValue();
|
||||
|
||||
try {
|
||||
if (departmentYearToPublicationCount.containsKey(employeePublicationYear)) {
|
||||
departmentYearToPublicationCount.put(employeePublicationYear,
|
||||
departmentYearToPublicationCount
|
||||
.get(employeePublicationYear)
|
||||
+ employeePublicationCount);
|
||||
|
||||
} else {
|
||||
departmentYearToPublicationCount.put(employeePublicationYear, employeePublicationCount);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
return departmentYearToPublicationCount;
|
||||
}
|
||||
|
||||
private void prepareVisualizationQueryPDFResponse(Individual college,
|
||||
List<BiboDocument> authorDocuments,
|
||||
Map<String, Integer> yearToPublicationCount) {
|
||||
|
||||
String authorName = null;
|
||||
|
||||
/*
|
||||
* To protect against cases where there are no author documents associated with the
|
||||
* individual.
|
||||
* */
|
||||
if (authorDocuments.size() > 0) {
|
||||
authorName = college.getIndividualLabel();
|
||||
}
|
||||
|
||||
/*
|
||||
* To make sure that null/empty records for author names do not cause any mischief.
|
||||
* */
|
||||
if (authorName == null) {
|
||||
authorName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(authorName + "-report")
|
||||
+ ".pdf";
|
||||
|
||||
response.setContentType("application/pdf");
|
||||
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||
|
||||
ServletOutputStream responseOutputStream;
|
||||
try {
|
||||
responseOutputStream = response.getOutputStream();
|
||||
|
||||
|
||||
Document document = new Document();
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
|
||||
document.open();
|
||||
|
||||
PDFDocument pdfDocument = new PDFDocument(authorName,
|
||||
yearToPublicationCount,
|
||||
document,
|
||||
pdfWriter);
|
||||
document.close();
|
||||
|
||||
response.setHeader("Expires", "0");
|
||||
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
|
||||
response.setHeader("Pragma", "public");
|
||||
response.setContentLength(baos.size());
|
||||
|
||||
baos.writeTo(responseOutputStream);
|
||||
responseOutputStream.flush();
|
||||
responseOutputStream.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (DocumentException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareVisualizationQueryDataResponse(VisVOContainer authorNodesAndEdges) {
|
||||
|
||||
String egoName = null;
|
||||
|
||||
Node egoNode = authorNodesAndEdges.getEgoNode();
|
||||
|
||||
|
||||
/*
|
||||
* To protect against cases where there are no author documents associated with the
|
||||
* individual.
|
||||
* */
|
||||
// System.out.println(collegeURLToVO);
|
||||
if (egoNode != null) {
|
||||
egoName = egoNode.getNodeName();
|
||||
}
|
||||
|
||||
/*
|
||||
* To make sure that null/empty records for author names do not cause any mischief.
|
||||
* */
|
||||
if (egoName == null) {
|
||||
egoName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(egoName) + "co-authorship" + ".txt";
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||
response.setContentType("text/xml");
|
||||
|
||||
try {
|
||||
|
||||
|
@ -318,97 +158,34 @@ public class VisualizationRequestHandler {
|
|||
* We are side-effecting responseWriter since we are directly manipulating the response
|
||||
* object of the servlet.
|
||||
* */
|
||||
generateCsvFileBuffer(authorNodesAndEdges,
|
||||
responseWriter);
|
||||
|
||||
|
||||
CoAuthorshipGraphMLWriter coAuthorShipGraphMLWriter = new CoAuthorshipGraphMLWriter(authorNodesAndEdges);
|
||||
|
||||
responseWriter.append(coAuthorShipGraphMLWriter.getCoAuthorshipGraphMLContent());
|
||||
|
||||
responseWriter.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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(VisVOContainer authorNodesAndEdges,
|
||||
PrintWriter printWriter) {
|
||||
|
||||
Node egoNode = authorNodesAndEdges.getEgoNode();
|
||||
Set<Node> authorNodes = authorNodesAndEdges.getNodes();
|
||||
Set<Edge> edges = authorNodesAndEdges.getEdges();
|
||||
|
||||
printWriter.append("\nEGO => ");
|
||||
printWriter.append(egoNode.getNodeID() + " - " + egoNode.getNodeName() + " -> " + egoNode.getNodeURL() + "\n");
|
||||
printWriter.append("\tEarliest Publication - " + egoNode.getEarliestPublicationYearCount()
|
||||
+ "\n\tLatest Publication - " + egoNode.getLatestPublicationYearCount()
|
||||
+ "\n\tUnknown Publication - " + egoNode.getUnknownPublicationYearCount());
|
||||
|
||||
// authorNodes.remove(egoNode);
|
||||
|
||||
for (Node currNode : authorNodes) {
|
||||
|
||||
printWriter.append("\nCO-AUTHOR => ");
|
||||
printWriter.append(currNode.getNodeID() + " - " + currNode.getNodeName() + " -> " + currNode.getNodeURL() + "\n");
|
||||
printWriter.append("\tEarliest Publication - " + currNode.getEarliestPublicationYearCount()
|
||||
+ "\n\tLatest Publication - " + currNode.getLatestPublicationYearCount()
|
||||
+ "\n\tUnknown Publication - " + currNode.getUnknownPublicationYearCount()
|
||||
+ "\n\tTotal Publications - " + currNode.getNumOfAuthoredWorks());
|
||||
|
||||
|
||||
}
|
||||
|
||||
for (Edge currentEdge : edges) {
|
||||
|
||||
printWriter.append("\nEdge => ");
|
||||
printWriter.append(currentEdge.getEdgeID() + " => " + currentEdge.getSourceNode().getNodeName() + " - "
|
||||
+ currentEdge.getTargetNode().getNodeName() + "\n");
|
||||
printWriter.append("\tEarliest Collaboration - " + currentEdge.getEarliestCollaborationYearCount()
|
||||
+ "\n\tLatest Collaboration - " + currentEdge.getLatestCollaborationYearCount()
|
||||
+ "\n\tUnknown Collaboration - " + currentEdge.getUnknownCollaborationYearCount()
|
||||
+ "\n\tTotal Collaboration - " + currentEdge.getNumOfCoAuthoredWorks());
|
||||
|
||||
}
|
||||
|
||||
printWriter.flush();
|
||||
|
||||
}
|
||||
|
||||
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
|
||||
HttpServletResponse response, VitroRequest vreq,
|
||||
String visContentCode, String visContextCode) {
|
||||
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("visContentCode", visContentCode);
|
||||
// request.setAttribute("visContextCode", visContextCode);
|
||||
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
|
||||
request.setAttribute("egoURIParam", egoURIParam);
|
||||
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/co_authorship.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,
|
||||
String visContentCode, String visContextCode) {
|
||||
|
||||
Portal portal = vreq.getPortal();
|
||||
|
||||
request.setAttribute("visContentCode", visContentCode);
|
||||
request.setAttribute("visContextCode", visContextCode);
|
||||
|
||||
request.setAttribute("portalBean", portal);
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/ajax_vis_content.jsp");
|
||||
// request.setAttribute("title", "Individual Publication Count Visualization");
|
||||
// request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue