From c30d99692aa188a465ae72a9af48c490466eef0d Mon Sep 17 00:00:00 2001 From: cdtank Date: Fri, 9 Jul 2010 01:05:27 +0000 Subject: [PATCH] 1. Refactored code 2. Fine tuned the sparkline generators for "person level" vis 3. Modified coauthorship vis code geenrator to fix link bugs 4. Modified front end for the person level so that IE behaves properly. 5. Modified style to make sure no weirdness when a user's profile image is present or not. 6. Added handler for downloading a list of all the coauthors and its count. --- .../vitro/webapp/visualization/TestJava.java | 34 +++++- .../VisualizationCodeGenerator.java | 32 ++--- .../VisualizationRequestHandler.java | 4 +- .../VisualizationRequestHandler.java | 111 ++++++++++++++++-- .../VisualizationCodeGenerator.java | 10 +- .../VisualizationRequestHandler.java | 4 - .../visualization/personlevel/person_level.js | 4 +- .../templates/visualization/person_level.jsp | 75 +++++++----- .../person_level_inject_head.jsp | 10 +- 9 files changed, 213 insertions(+), 71 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/TestJava.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/TestJava.java index 99748cbd8..857a1fba8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/TestJava.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/TestJava.java @@ -6,6 +6,11 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.commons.collections.BidiMap; +import org.apache.commons.collections.MapIterator; +import org.apache.commons.collections.bidimap.TreeBidiMap; import com.google.gson.Gson; import com.hp.hpl.jena.iri.IRIFactory; @@ -44,18 +49,39 @@ public class TestJava { System.out.println(sampleBlurns); for (String blurb : sampleBlurns) { - System.out.println(blurb.substring(0, 10)); +// System.out.println(blurb.substring(0, 10)); } Map yearToPublicationCount = new TreeMap(); yearToPublicationCount.put("2003", 5); - yearToPublicationCount.put("2001", 5); - yearToPublicationCount.put("2002", 5); - yearToPublicationCount.put("2090", 7); + yearToPublicationCount.put("2005", 3); + yearToPublicationCount.put("2002", 1); + yearToPublicationCount.put("2090", 5); yearToPublicationCount.put("Unknown", 6); + BidiMap map1 = new TreeBidiMap(yearToPublicationCount); + + + System.out.println(map1 + " --- " + map1.inverseBidiMap()); + Node egoNode; + + MapIterator mapIterator = map1.inverseBidiMap().mapIterator(); + + + while(mapIterator.hasNext()) { + + Object next = mapIterator.next(); + + System.out.println(next + " %%% " + next); + + + } + + + + System.out.println(); Map> biboDocumentURLToCoAuthors = new HashMap>(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationCodeGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationCodeGenerator.java index 0eee6e27c..d1b61c9b7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationCodeGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/coauthorship/VisualizationCodeGenerator.java @@ -176,11 +176,11 @@ public class VisualizationCodeGenerator { "function drawUniqueCoauthorCountVisualization(providedSparklineImgTD) {\n" + "var data = new google.visualization.DataTable();\n" + "data.addColumn('string', 'Year');\n" + - "data.addColumn('number', 'Publications');\n" + + "data.addColumn('number', 'Unique co-authors');\n" + "data.addRows(" + numOfYearsToBeRendered + ");\n"); - int publicationCounter = 0; - int totalPublications = 0; + int uniqueCoAuthorCounter = 0; + int totalUniqueCoAuthors = 0; int renderedFullSparks = 0; @@ -194,33 +194,33 @@ public class VisualizationCodeGenerator { } visualizationCode.append("data.setValue(" - + publicationCounter + + uniqueCoAuthorCounter + ", 0, '" + stringPublishedYear + "');\n"); visualizationCode.append("data.setValue(" - + publicationCounter + + uniqueCoAuthorCounter + ", 1, " + currentPublications + ");\n"); - totalPublications += currentPublications; - publicationCounter++; + totalUniqueCoAuthors += currentPublications; + uniqueCoAuthorCounter++; } /* * Sparks that will be rendered in full mode will always be the one's which has any year * associated with it. Hence. * */ - renderedFullSparks = totalPublications; + renderedFullSparks = totalUniqueCoAuthors; /* * Total publications will also consider publications that have no year associated with * it. Hence. * */ if (yearToUniqueCoauthorsCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR) != null) { - totalPublications += yearToUniqueCoauthorsCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR); + totalUniqueCoAuthors += yearToUniqueCoauthorsCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR); } String sparklineDisplayOptions = "{width: 63, height: 21, showAxisLines: false, " + @@ -259,14 +259,14 @@ public class VisualizationCodeGenerator { shortSparkMinYear, visContainerID, visualizationCode, - totalPublications, + totalUniqueCoAuthors, sparklineDisplayOptions); } else { generateFullSparklineVisualizationContent(currentYear, minPubYearConsidered, visContainerID, visualizationCode, - totalPublications, + totalUniqueCoAuthors, renderedFullSparks, sparklineDisplayOptions); } @@ -285,7 +285,7 @@ public class VisualizationCodeGenerator { private void generateShortSparklineVisualizationContent(int currentYear, int shortSparkMinYear, String visContainerID, - StringBuilder visualizationCode, int totalPublications, + StringBuilder visualizationCode, int totalUniqueCoAuthors, String sparklineDisplayOptions) { /* @@ -330,8 +330,8 @@ public class VisualizationCodeGenerator { * */ visualizationCode.append("$('#" + visDivNames.get("SHORT_SPARK") + " td.sparkline_number').text(renderedShortSparks);"); visualizationCode.append("var shortSparksText = ''" + - "+ ' Papers with year from '" + - "+ ' " + totalPublications + " '" + + "+ ' Unique co-authors with year from '" + + "+ ' " + totalUniqueCoAuthors + " '" + "+ ' total " + "" + "(" + shortSparkMinYear + " - " + currentYear + ")" + @@ -351,7 +351,7 @@ public class VisualizationCodeGenerator { private void generateFullSparklineVisualizationContent( int currentYear, int minPubYearConsidered, String visContainerID, StringBuilder visualizationCode, - int totalPublications, int renderedFullSparks, + int totalUniqueCoAuthors, int renderedFullSparks, String sparklineDisplayOptions) { String csvDownloadURL = ""; @@ -375,7 +375,7 @@ public class VisualizationCodeGenerator { visualizationCode.append("var allSparksText = ''" + "+ ' Unique co-authors '" + - "" + + "+ ' " + "(" + minPubYearConsidered + " - " + currentYear + ")" + " '" + "+ ' (.CSV File)';" + 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 6baeb65e8..a23c41a42 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 @@ -199,7 +199,7 @@ public class VisualizationRequestHandler { if (authorNodesAndEdges.getNodes() == null || authorNodesAndEdges.getNodes().size() < 1 ) { - outputFileName = "no-coauthorship-net" + ".graphml"; + outputFileName = "no-coauthors" + ".csv"; } else { @@ -235,8 +235,6 @@ public class VisualizationRequestHandler { private void generateCsvFileBuffer(Map> yearToCoauthors, PrintWriter printWriter) { -// CSVWriter csvWriter = new SimpleWriter(printWriter); - printWriter.append("\"Year\", \"Number of Co-Authors\", \"Co-Author(s)\"\n"); for (Entry> currentEntry : yearToCoauthors.entrySet()) { 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 index 673c6a5c8..7352a83db 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/personlevel/VisualizationRequestHandler.java @@ -58,6 +58,8 @@ public class VisualizationRequestHandler { String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE); String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE); + + String coAuthorsListMode = "coauthors"; String egoPubSparklineVisContainerID = "ego_pub_sparkline"; String uniqueCoauthorsSparklineVisContainerID = "unique_coauthors_sparkline"; @@ -89,12 +91,29 @@ public class VisualizationRequestHandler { * */ 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(coAuthorshipVO); - return; + /* + * We will be using the same visualization package for providing data for both + * list of unique coauthors & network of coauthors (used in the flash vis). We will + * use "VIS_MODE_URL_HANDLE" as a modifier to differentiate between these two. + * The defualt will be to provide data used to render the coauthorship network vis. + * */ + + if (coAuthorsListMode.equalsIgnoreCase(visMode)) { + /* + * When the csv file is required - containing the unique co-authors vs how many times + * they have co-authored with the ego. + * */ + prepareVisualizationQueryListCoauthorsDataResponse(coAuthorshipVO); + return; + + } else { + /* + * When the graphML file is required - based on which coauthorship network visualization + * will be rendered. + * */ + prepareVisualizationQueryNetworkDataResponse(coAuthorshipVO); + return; + } } @@ -227,13 +246,13 @@ public class VisualizationRequestHandler { return yearToCoAuthors; } - private void prepareVisualizationQueryDataResponse(VisVOContainer coAuthorsipVO) { + private void prepareVisualizationQueryNetworkDataResponse(VisVOContainer coAuthorsipVO) { String outputFileName = ""; if (coAuthorsipVO.getNodes() == null || coAuthorsipVO.getNodes().size() < 1) { - outputFileName = "no-coauthorship-net" + ".graphml"; + outputFileName = "no-coauthorship-net" + ".csv"; } else { @@ -266,6 +285,82 @@ public class VisualizationRequestHandler { } } + private void prepareVisualizationQueryListCoauthorsDataResponse(VisVOContainer coAuthorsipVO) { + + String outputFileName = ""; + Map coAuthorsToCount = new TreeMap(); + + if (coAuthorsipVO.getNodes() == null || coAuthorsipVO.getNodes().size() < 1 ) { + + outputFileName = "no-coauthors-list" + ".csv"; + + } else { + + outputFileName = UtilityFunctions.slugify(coAuthorsipVO.getEgoNode().getNodeName()) + + "-coauthors-list" + ".csv"; + + coAuthorsToCount = getCoAuthorsList(coAuthorsipVO); + + } + + 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. + * */ + generateCsvFileBuffer(coAuthorsToCount, + responseWriter); + + responseWriter.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + + private Map getCoAuthorsList(VisVOContainer coAuthorsipVO) { + + Map coAuthorsToCount = new TreeMap(); + + for (Node currNode : coAuthorsipVO.getNodes()) { + + /* + * We have already printed the Ego Node info. + * */ + if (currNode != coAuthorsipVO.getEgoNode()) { + + coAuthorsToCount.put(currNode.getNodeName(), currNode.getNumOfAuthoredWorks()); + + } + + } + + + return coAuthorsToCount; + } + + private void generateCsvFileBuffer(Map coAuthorsToCount, PrintWriter printWriter) { + + printWriter.append("\"Co-Author\", \"Count\"\n"); + + for (Entry currentEntry : coAuthorsToCount.entrySet()) { + + printWriter.append("\"" + currentEntry.getKey() + "\"," + + "\"" + currentEntry.getValue() + "\"\n" + ); + } + + printWriter.flush(); + } + + private void prepareVisualizationQueryStandaloneResponse( String egoURIParam, SparklineVOContainer egoPubSparklineVO, 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 673f71df0..9d4d8666b 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 @@ -600,10 +600,18 @@ public class VisualizationCodeGenerator { private String generateDataTable() { + String csvDownloadURL = ""; + + try { + csvDownloadURL = getCSVDownloadURL(); + } catch (UnsupportedEncodingException e) { + csvDownloadURL = "#"; + } + StringBuilder dataTable = new StringBuilder(); dataTable.append("" + - "" + + "" + "" + "" + "" + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/utilities/VisualizationRequestHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/utilities/VisualizationRequestHandler.java index 181c07358..c848b9c77 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/utilities/VisualizationRequestHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/visualization/utilities/VisualizationRequestHandler.java @@ -199,10 +199,6 @@ public class VisualizationRequestHandler { + VisualizationFrameworkConstants.VIS_TYPE_URL_HANDLE + "=" + URLEncoder.encode("person_level", VisualizationController.URL_ENCODING_SCHEME).toString() - + "&" - + VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE - + "=" + URLEncoder.encode("ego_sparkline", - VisualizationController.URL_ENCODING_SCHEME).toString() + "&" + VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE + "=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE, diff --git a/webapp/web/js/visualization/personlevel/person_level.js b/webapp/web/js/visualization/personlevel/person_level.js index 8310aef47..8001f2681 100644 --- a/webapp/web/js/visualization/personlevel/person_level.js +++ b/webapp/web/js/visualization/personlevel/person_level.js @@ -176,7 +176,7 @@ function createTable(tableID, tableContainer, tableData) { var table = $('
Publications per yearPublications per year (.CSV File)
Year
'); table.attr('id', tableID); - table.append($(''); @@ -280,7 +280,7 @@ function renderCoAuthorshipVisualization() { "src", swfLink, "flashVars", "graphmlUrl=" + egoCoAuthorshipDataFeederURL, "width", "600", - "height", "840", + "height", "790", "align", "top", "id", "CoAuthor", "quality", "high", diff --git a/webapp/web/templates/visualization/person_level.jsp b/webapp/web/templates/visualization/person_level.jsp index 3c94f1e10..e9046a3eb 100644 --- a/webapp/web/templates/visualization/person_level.jsp +++ b/webapp/web/templates/visualization/person_level.jsp @@ -30,10 +30,13 @@ + +
+ + <%-- Image --%> + + <%-- Label --%>

<%-- Moniker--%> - - <%-- Image --%> - - + + +
<%-- Sparkline --%>

General Statistics

@@ -133,13 +152,12 @@

Co-Author Network (.GraphML File)

-
+ + - -
-
-
+
+
').html("Co-Authorships")); + table.append($('').html("Co-Authors (.CSV File)")); var header = $('