From 0e8e1dc9e2e7be091ee1740a7e96fad32c1c45e7 Mon Sep 17 00:00:00 2001 From: cdtank Date: Thu, 1 Jul 2010 15:54:11 +0000 Subject: [PATCH] 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. --- .../VisualizationController.java | 30 +- .../VisualizationRequestHandler.java | 3 +- .../VisualizationRequestHandler.java | 16 +- .../VisualizationRequestHandler.java | 213 ++++++++++++++ .../VisualizationCodeGenerator.java | 6 +- .../VisualizationRequestHandler.java | 21 +- .../visualization/valueobjects/Edge.java | 8 +- .../visualization/valueobjects/Node.java | 8 +- .../{VOUtils.java => UtilityFunctions.java} | 14 +- .../coauthorship/co_authorship.js | 28 +- .../coauthorship/person_level.js | 274 +++++++++++++++++ .../entity/sparklineVisualization.jsp | 2 +- .../visualization/ajax_vis_content.jsp | 94 ------ .../templates/visualization/co_authorship.jsp | 4 +- .../templates/visualization/person_level.jsp | 277 ++++++++++++++++++ .../visualization/publication_count.jsp | 2 + 16 files changed, 848 insertions(+), 152 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java rename webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/{VOUtils.java => UtilityFunctions.java} (74%) create mode 100644 webapp/web/js/visualization/coauthorship/person_level.js create mode 100644 webapp/web/templates/visualization/person_level.jsp diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/VisualizationController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/VisualizationController.java index b8885bf9f..e3340ea95 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/VisualizationController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/VisualizationController.java @@ -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"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationRequestHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationRequestHandler.java index 758112851..9bc6efbe5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationRequestHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationRequestHandler.java @@ -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"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/collegepubcount/VisualizationRequestHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/collegepubcount/VisualizationRequestHandler.java index c15023aac..f716ba749 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/collegepubcount/VisualizationRequestHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/collegepubcount/VisualizationRequestHandler.java @@ -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> departmentToPublicationsOverTime, Map collegeURLToVO, PrintWriter printWriter) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java new file mode 100644 index 000000000..e8ae09512 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java @@ -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()); + } + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationCodeGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationCodeGenerator.java index 27aa45652..0a11abaa4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationCodeGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationCodeGenerator.java @@ -164,7 +164,9 @@ public class VisualizationCodeGenerator { "position:absolute;" + "}" + ".sparkline_range {" + - "color:#7BS69E;" + + "color:#7BA69E;" + + "font-size:0.9em;" + + "font-style:italic;" + "}" + "\n"); @@ -360,7 +362,7 @@ public class VisualizationCodeGenerator { "+ " + renderedFullSparks + "" + "+ ' papers with year from '" + "+ ' " + totalPublications + " '" + - "+ ' total'" + + "+ ' total " + "" + "(" + minPubYearConsidered + " - " + currentYear + ")" + "'" + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationRequestHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationRequestHandler.java index b9df2417b..dd62f9d88 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationRequestHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/VisualizationRequestHandler.java @@ -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 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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Edge.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Edge.java index 11e6ddd9e..000a6a001 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Edge.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Edge.java @@ -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 getEarliestCollaborationYearCount() { if (yearToPublicationCount == null) { - yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments); + yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments); } /* @@ -96,7 +96,7 @@ public class Edge { @SuppressWarnings("serial") public Map 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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Node.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Node.java index b5142a3d9..63be5ac4c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Node.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/valueobjects/Node.java @@ -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 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 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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/VOUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/UtilityFunctions.java similarity index 74% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/VOUtils.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/UtilityFunctions.java index 6ac9fbbb8..6a80d0120 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/VOUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/UtilityFunctions.java @@ -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 getYearToPublicationCount( Set 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); + } } diff --git a/webapp/web/js/visualization/coauthorship/co_authorship.js b/webapp/web/js/visualization/coauthorship/co_authorship.js index 2fea4016f..011472776 100644 --- a/webapp/web/js/visualization/coauthorship/co_authorship.js +++ b/webapp/web/js/visualization/coauthorship/co_authorship.js @@ -161,35 +161,37 @@ function processProfileInformation(nameContainerID, -function nodeClickedJS(obj){ +function nodeClickedJS(json){ + + var obj = jQuery.parseJSON(json); $("#newsLetter").attr("style","visibility:visible"); - $("#authorName").empty().append(obj[0]); - $("#works").empty().append(obj[1]); + $("#authorName").empty().append(obj.name); + $("#works").empty().append(obj.number_of_authored_works); /* - * Here obj[7] points to the uri of that individual + * Here obj.url points to the uri of that individual */ - if(obj[7]){ - $("#profileUrl").attr("href", getWellFormedURLs(obj[7], "profile")); - $("#coAuthorshipVisUrl").attr("href", getWellFormedURLs(obj[7], "coauthorship")); + if(obj.url){ + $("#profileUrl").attr("href", getWellFormedURLs(obj.url, "profile")); + $("#coAuthorshipVisUrl").attr("href", getWellFormedURLs(obj.url, "coauthorship")); processProfileInformation("", "profileMoniker", "profileImage", - jQuery.parseJSON(getWellFormedURLs(obj[7], "profile_info"))); + jQuery.parseJSON(getWellFormedURLs(obj.url, "profile_info"))); } else{ $("#profileUrl").attr("href","#"); $("#coAuthorshipVisUrl").attr("href","#"); } - $("#coAuthorName").empty().append(obj[0]); + $("#coAuthorName").empty().append(obj.name); - $("#coAuthors").empty().append(obj[5]); - $("#firstPublication").empty().append((obj[3])?obj[3]+" First Publication":""); - $("#lastPublication").empty().append((obj[4])?obj[4]+" Last Publication":""); + $("#coAuthors").empty().append(obj.num_coauthors); + $("#firstPublication").empty().append((obj.earliest_publication)?obj.earliest_publication+" First Publication":""); + $("#lastPublication").empty().append((obj.latest_publication)?obj.latest_publication+" Last Publication":""); - // obj[7]:the url parameter for node + // obj.url:the url parameter for node } diff --git a/webapp/web/js/visualization/coauthorship/person_level.js b/webapp/web/js/visualization/coauthorship/person_level.js new file mode 100644 index 000000000..011472776 --- /dev/null +++ b/webapp/web/js/visualization/coauthorship/person_level.js @@ -0,0 +1,274 @@ +function getWellFormedURLs(given_uri, type) { + + // general best practice is to put javascript code inside document.ready + // but in this case when i do that the function does not get called + // properly. + // so removing it for now. + + // $(document).ready(function() { + + if (type == "coauthorship") { + + var finalURL = $.ajax({ + url: contextPath + "/admin/visQuery", + data: ({vis: "utilities", vis_mode: "COAUTHORSHIP_URL", uri: given_uri}), + dataType: "text", + async: false, + success:function(data){ + // console.log("COA - " + data); + } + }).responseText; + + return finalURL; + + + } else if (type == "profile") { + + var finalURL = $.ajax({ + url: contextPath + "/admin/visQuery", + data: ({vis: "utilities", vis_mode: "PROFILE_URL", uri: given_uri}), + dataType: "text", + async: false, + success:function(data){ + } + }).responseText; + + return finalURL; + + } else if (type == "image") { + + var finalURL = $.ajax({ + url: contextPath + "/admin/visQuery", + data: ({vis: "utilities", vis_mode: "IMAGE_URL", uri: given_uri}), + dataType: "text", + async: false, + success:function(data){ + } + }).responseText; + + return finalURL; + + } else if (type == "profile_info") { + + var profileInfoJSON = $.ajax({ + url: contextPath + "/admin/visQuery", + data: ({vis: "utilities", vis_mode: "PROFILE_INFO", uri: given_uri}), + dataType: "json", + async: false, + success:function(data){ + } + }).responseText; + + return profileInfoJSON; + + } + + // }); +} + +$.fn.image = function(src, successFunc, failureFunc){ + return this.each(function(){ + var profileImage = new Image(); + profileImage.src = src; + profileImage.width = 150; + profileImage.onerror = failureFunc; + profileImage.onload = successFunc; + + + return profileImage; + }); +} + +function setProfileImage(imageContainerID, rawPath, contextPath) { + + if (imageContainerID == "") { + return; + } + + + var imageLink = contextPath + rawPath; + + var imageContainer = $("#" + imageContainerID); + imageContainer.image(imageLink, + function(){ + imageContainer.empty().append(this); + }, + function(){ + //For performing any action on failure to + //find the image. + imageContainer.empty(); + } + ); + +} + +function setProfileMoniker(monikerContainerID, moniker) { + + if (monikerContainerID == "") { + return; + } + + $("#" + monikerContainerID).empty().text(moniker); + +} + +function setProfileName(nameContainerID, name) { + + if (nameContainerID == "") { + return; + } + + $("#" + nameContainerID).empty().text(name); + + +} + +function processProfileInformation(nameContainerID, + monikerContainerID, + imageContainerID, + profileInfoJSON) { + + + var name, imageRawPath, imageContextPath, moniker; + + $.each(profileInfoJSON, function(key, set){ + + if (key.search(/imageThumb/i) > -1) { + + imageRawPath = set[0]; + + } else if (key.search(/imageContextPath/i) > -1) { + + imageContextPath = set[0]; + + } else if (key.search(/moniker/i) > -1) { + + moniker = set[0]; + + } else if (key.search(/label/i) > -1) { + + name = set[0]; + + } + + }); + + setProfileName(nameContainerID, name); + setProfileMoniker(monikerContainerID, moniker); + setProfileImage(imageContainerID, imageRawPath, imageContextPath); + +} + + + +function nodeClickedJS(json){ + + var obj = jQuery.parseJSON(json); + + $("#newsLetter").attr("style","visibility:visible"); + $("#authorName").empty().append(obj.name); + $("#works").empty().append(obj.number_of_authored_works); + + /* + * Here obj.url points to the uri of that individual + */ + if(obj.url){ + $("#profileUrl").attr("href", getWellFormedURLs(obj.url, "profile")); + $("#coAuthorshipVisUrl").attr("href", getWellFormedURLs(obj.url, "coauthorship")); + processProfileInformation("", + "profileMoniker", + "profileImage", + jQuery.parseJSON(getWellFormedURLs(obj.url, "profile_info"))); + + } else{ + $("#profileUrl").attr("href","#"); + $("#coAuthorshipVisUrl").attr("href","#"); + } + + $("#coAuthorName").empty().append(obj.name); + + $("#coAuthors").empty().append(obj.num_coauthors); + $("#firstPublication").empty().append((obj.earliest_publication)?obj.earliest_publication+" First Publication":""); + $("#lastPublication").empty().append((obj.latest_publication)?obj.latest_publication+" Last Publication":""); + + // obj.url:the url parameter for node + +} + +function renderSparklineVisualization(visualizationURL) { + + $(document).ready(function() { + + //$("#ego_sparkline").empty().html(''); + + $.ajax({ + url: visualizationURL, + dataType: "html", + success:function(data){ + $("#ego_sparkline").html(data); + + } + }); + + + }); + +} + +function renderCoAuthorshipVisualization() { + + //Version check for the Flash Player that has the ability to start Player + //Product Install (6.0r65) + var hasProductInstall = DetectFlashVer(6, 0, 65); + + //Version check based upon the values defined in globals + var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision); + + if ( hasProductInstall && !hasRequestedVersion ) { + // DO NOT MODIFY THE FOLLOWING FOUR LINES + // Location visited after installation is complete if installation is + // required + var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn"; + var MMredirectURL = window.location; + document.title = document.title.slice(0, 47) + " - Flash Player Installation"; + var MMdoctitle = document.title; + + AC_FL_RunContent( + "src", "playerProductInstall", + "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"", + "width", "600", + "height", "800", + "align", "middle", + "id", "CoAuthor", + "quality", "high", + "bgcolor", "#ffffff", + "name", "CoAuthor", + "allowScriptAccess","sameDomain", + "type", "application/x-shockwave-flash", + "pluginspage", "http://www.adobe.com/go/getflashplayer" + ); + } else if (hasRequestedVersion) { + // if we've detected an acceptable version + // embed the Flash Content SWF when all tests are passed + AC_FL_RunContent( + "src", swfLink, + "flashVars", "graphmlUrl=" + egoCoAuthorshipDataURL, + "width", "600", + "height", "800", + "align", "middle", + "id", "CoAuthor", + "quality", "high", + "bgcolor", "#ffffff", + "name", "CoAuthor", + "allowScriptAccess","sameDomain", + "type", "application/x-shockwave-flash", + "pluginspage", "http://www.adobe.com/go/getflashplayer" + ); + } else { // flash is too old or we can't detect the plugin + var alternateContent = 'Alternate HTML content should be placed here. ' + + 'This content requires the Adobe Flash Player. ' + + 'Get Flash'; + document.write(alternateContent); // insert non-flash content + } + +} \ No newline at end of file diff --git a/webapp/web/templates/entity/sparklineVisualization.jsp b/webapp/web/templates/entity/sparklineVisualization.jsp index ad442bf2e..dfefabedb 100644 --- a/webapp/web/templates/entity/sparklineVisualization.jsp +++ b/webapp/web/templates/entity/sparklineVisualization.jsp @@ -81,7 +81,7 @@ margin-left:24%; margin-top:-2%; position:absolute; - width:275px; + width:380px; } diff --git a/webapp/web/templates/visualization/ajax_vis_content.jsp b/webapp/web/templates/visualization/ajax_vis_content.jsp index 896e83f29..cbd4097a9 100644 --- a/webapp/web/templates/visualization/ajax_vis_content.jsp +++ b/webapp/web/templates/visualization/ajax_vis_content.jsp @@ -1,97 +1,3 @@ -<%-- - -

- Number of Publications with NO parseable "Publication Year" => 6 -
- {2004=2, 2005=2, 2006=8, DNA=6} -

- - - - - ---%> - ${requestScope.visContentCode} ${requestScope.visContextCode} diff --git a/webapp/web/templates/visualization/co_authorship.jsp b/webapp/web/templates/visualization/co_authorship.jsp index 5b2b8dd8d..c6f432d4d 100644 --- a/webapp/web/templates/visualization/co_authorship.jsp +++ b/webapp/web/templates/visualization/co_authorship.jsp @@ -79,9 +79,9 @@ var contextPath = "${contextPath}"; cursor:pointer; height:36px; margin-left:24%; - margin-top:-18%; + /*margin-top:-18%;*/ position:absolute; - width:380px; + width:471px; } diff --git a/webapp/web/templates/visualization/person_level.jsp b/webapp/web/templates/visualization/person_level.jsp new file mode 100644 index 000000000..c6f432d4d --- /dev/null +++ b/webapp/web/templates/visualization/person_level.jsp @@ -0,0 +1,277 @@ +<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Co-Authorship Visualization + + + + + + + + + + + + + + + + + + + +
+ + +<%-- Label --%> +
+
+ +
+
+ +<%-- Moniker--%> +
+
+
+ +
+
+
+ +<%-- Image --%> +
+
+
+
+
+
+ +<%-- Sparkline --%> +
+
+
+ + ${requestScope.egoURIParam} + +
+
+
+ + +
+

+
+ + + + +
+

+
+
+
+
+
+ + + +
+ +Download co-authorship newtwork as .graphml file. + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Publications per year
YearPublications
20044
20052
11
Unknown1
+ +Download data as .csv file. + + + + + + + + + + + + + + + + + + + + + + + + + + +
Co - Authorhips
NamePublications
20044
20052
11
Unknown1
+ + + + +
+ + + + diff --git a/webapp/web/templates/visualization/publication_count.jsp b/webapp/web/templates/visualization/publication_count.jsp index 31590fc3c..e347b0ad5 100644 --- a/webapp/web/templates/visualization/publication_count.jsp +++ b/webapp/web/templates/visualization/publication_count.jsp @@ -1,3 +1,5 @@ +<%@ page import="edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.VisVOContainer" %> + <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>