re-integrating the branch /branches/iu-vis-dev-branches/vivo-post-1.1

This commit is contained in:
bkoniden 2010-11-22 19:39:51 +00:00
parent 3488c43f55
commit 67d14f3212
49 changed files with 4796 additions and 921 deletions

77
deploy.properties Normal file
View file

@ -0,0 +1,77 @@
# -----------------------------------------------------------------------------
#
# VIVO deployment properties
#
# This file is provided as example.deploy.properties.
#
# Save a copy of this file as deploy.properties, and edit the properties as
# needed for your deployment.
#
# -----------------------------------------------------------------------------
#
# This namespace will be used when generating URIs for objects created in the
# editor. Change it to reflect your own domain. For example, Cornell's
# namespace is http://vivo.cornell.edu/individual/
#
# Note: it is essential that this namespace end with a trailing slash.
#
Vitro.defaultNamespace = http://vivo-trunk.indiana.edu/individual/
#
# Where is the Vitro core directory?
# In most deployments, this is set to ./vitro-core, but internal developers may
# prefer to set it to ../vitro
# Examples:
# vitro.core.dir = ./vitro-core
# vitro.core.dir = ../vitro
# vitro.core.dir = /usr/local/vitro/trunk
vitro.core.dir = /usr/local/home/bkoniden/eclipse-workspace/bkoniden-vitro-post-1.1
#
# The base install directory for your Tomcat server. The VIVO application
# will be deployed in the /webapps directory below this base.
#
tomcat.home = /usr/local/tomcat
#
# The name of the VIVO application. This will be used as the name of the
# subdirectory within your Tomcat server's /webapps directory. It also appears
# in the URL for the application. For example, http://my.vivo.server/vivo
#
webapp.name = vivo1
#
# The location where the VIVO application will store uploaded files
# (usually images). You should arrange for these files to be backed up in some
# way.
#
upload.directory = /usr/local/vivo1/data-vivo-updated/uploads
#
# The location where the VIVO application will create its Lucene search
# index.
#
LuceneSetup.indexDir = /usr/local/vivo1/data-vivo-updated/luceneIndex
#
# SMTP host which the "Contact Us" form can use to send mail. If this is left
# empty, the "Contact Us" form will be disabled.
#
Vitro.smtpHost =
#
# The basic parameters for a MySQL database connection. Change the end of the
# URL to reflect your database name (if it is not "vitro"). Change the username
# and password to match the authorized user you created in MySQL.
#
VitroConnection.DataSource.url = jdbc:mysql://localhost/vivo1
VitroConnection.DataSource.username = vivouser1
VitroConnection.DataSource.password = vivo123
#
# The name of your first admin user for the VIVO application. The password for
# for this user is initially set to "defaultAdmin", but you will be asked to
# change the password the first time you login.
#
initialAdminUser = defaultAdmin

2
deployVIVOInstance Executable file
View file

@ -0,0 +1,2 @@
sudo /usr/local/tomcat/bin/shutdown.sh
ant clean deploy

View file

@ -14,7 +14,7 @@
# editor. Change it to reflect your own domain. For example, Cornell's # editor. Change it to reflect your own domain. For example, Cornell's
# namespace is http://vivo.cornell.edu/individual/ # namespace is http://vivo.cornell.edu/individual/
# #
# Note: it is essential that this namespace end with a trailing slash. # Note: it is essential that this namespace end with a trailing slash.
# #
Vitro.defaultNamespace = http://vivo.mydomain.edu/individual/ Vitro.defaultNamespace = http://vivo.mydomain.edu/individual/

View file

@ -1,6 +1,5 @@
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
@ -10,33 +9,52 @@
http://www.springframework.org/schema/context/spring-context-2.5.xsd"> http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="person_pub_count" class="edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.PersonPublicationCountRequestHandler" /> <bean id="person_pub_count"
<bean id="college_pub_count" class="edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount.CollegePublicationCountRequestHandler" /> class="edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.PersonPublicationCountRequestHandler" />
<bean id="coauthorship" class="edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.CoAuthorshipRequestHandler" /> <bean id="coauthorship"
<bean id="person_level" class="edu.cornell.mannlib.vitro.webapp.visualization.personlevel.PersonLevelRequestHandler" /> class="edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.CoAuthorshipRequestHandler" />
<bean id="utilities" class="edu.cornell.mannlib.vitro.webapp.visualization.utilities.UtilitiesRequestHandler" /> <bean id="person_level"
class="edu.cornell.mannlib.vitro.webapp.visualization.personlevel.PersonLevelRequestHandler" />
<bean id="utilities"
class="edu.cornell.mannlib.vitro.webapp.visualization.utilities.UtilitiesRequestHandler" />
<bean id="entity_comparison"
class="edu.cornell.mannlib.vitro.webapp.visualization.entitycomparison.EntityPublicationCountRequestHandler" />
<bean id="coprincipalinvestigator"
class="edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator.CoPIGrantCountRequestHandler" />
<bean id="freemarker"
class="edu.cornell.mannlib.vitro.webapp.visualization.freemarker.FreemarkerRequestHandler" />
<bean id="visualizationInjector" class="edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationInjector">
<property name="visualizations"> <bean id="visualizationInjector"
<map> class="edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationInjector">
<entry key="person_pub_count"> <property name="visualizations">
<ref bean="person_pub_count"></ref> <map>
</entry> <entry key="person_pub_count">
<entry key="college_pub_count"> <ref bean="person_pub_count"></ref>
<ref bean="college_pub_count"></ref> </entry>
</entry> <entry key="coauthorship">
<entry key="coauthorship"> <ref bean="coauthorship"></ref>
<ref bean="coauthorship"></ref> </entry>
</entry>
<entry key="person_level"> <entry key="person_level">
<ref bean="person_level"></ref> <ref bean="person_level"></ref>
</entry> </entry>
<entry key="utilities"> <entry key="utilities">
<ref bean="utilities"></ref> <ref bean="utilities"></ref>
</entry> </entry>
</map> <entry key="entity_comparison">
</property> <ref bean="entity_comparison"></ref>
</entry>
</bean> <entry key="coprincipalinvestigator">
<ref bean="coprincipalinvestigator"></ref>
</entry>
<entry key="freemarker">
<ref bean="freemarker"></ref>
</entry>
</map>
</property>
</bean>
</beans> </beans>

View file

@ -1221,7 +1221,6 @@
<url-pattern>/admin/sparqlquery</url-pattern> <url-pattern>/admin/sparqlquery</url-pattern>
</servlet-mapping> </servlet-mapping>
<!--
<servlet> <servlet>
<servlet-name>DummyVisClient</servlet-name> <servlet-name>DummyVisClient</servlet-name>
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.DummyVisClientController</servlet-class> <servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.DummyVisClientController</servlet-class>
@ -1231,7 +1230,8 @@
<servlet-name>DummyVisClient</servlet-name> <servlet-name>DummyVisClient</servlet-name>
<url-pattern>/admin/dummyVisClient</url-pattern> <url-pattern>/admin/dummyVisClient</url-pattern>
</servlet-mapping> </servlet-mapping>
-->
<servlet> <servlet>
<servlet-name>VisualizationController</servlet-name> <servlet-name>VisualizationController</servlet-name>

View file

@ -0,0 +1,75 @@
//Hard coded color constants
var TURQUOISE = "#8DD3C7";
var LIGHT_YELLOW = "#FFFFB3";
var LIGHT_VIOLET = "#BEBADA";
var LIGHT_RED = "#FB8072";
var SKY_BLUE = "#80B1D3";
var ORANGE = "#FDB462";
var LIGHT_GREEN = "#B3DE69";
var LIGHT_PINK = "#FCCDE5";
var LIGHT_GREY = "#D9D9D9";
var PURPLE = "#BC80BD";
var colorConstantQueue =
[
TURQUOISE, LIGHT_YELLOW, LIGHT_VIOLET, LIGHT_RED,
SKY_BLUE, ORANGE, LIGHT_GREEN, LIGHT_PINK, LIGHT_GREY,
PURPLE
];
var freeColors = [
TURQUOISE, LIGHT_YELLOW, LIGHT_VIOLET, LIGHT_RED,
SKY_BLUE, ORANGE, LIGHT_GREEN, LIGHT_PINK, LIGHT_GREY,
PURPLE
];
var year = {
min: 1998,
max: 2018,
globalMin: 1995,
globalMax: 2025
};
var colors = {};
var prevColor = {};
var colorToAssign, colorToRemove;
var renderedObjects = [];
var labelToEntityRecord = {};
var setOfLabels = [];
var labelToCheckedEntities = {};
var stopWordsToCount = {};
var graphContainer;
var tableDiv;
var entityLevel;
//options for Flot
var FlotOptions = {
legend : {
show : false
},
lines : {
show : true
},
points : {
show : false
},
xaxis : {
tickDecimals : 0,
tickSize : 10
},
series : {
lines : {
lineWidth : 7
}
},
yaxis : {
tickSize : 1,
tickDecimals : 0,
min : 0
}
};
FlotOptions.colors = colorConstantQueue;

File diff suppressed because it is too large Load diff

View file

@ -256,6 +256,7 @@ function createTable(tableID, tableContainer, tableData) {
$('#' + tableContainer + " #loadingData").remove(); $('#' + tableContainer + " #loadingData").remove();
} }
//renderStatsOnNodeClicked, CoRelations, noOfCoRelations
function nodeClickedJS(json){ function nodeClickedJS(json){
var obj = jQuery.parseJSON(json); var obj = jQuery.parseJSON(json);
@ -309,6 +310,11 @@ function nodeClickedJS(json){
} }
function encodeURL(url){
var domainURL = 'http://vivo-vis-bkoniden.slis.indiana.edu/';
return domainURL + url.replace(/&/g,'%26');
}
function renderCoAuthorshipVisualization() { function renderCoAuthorshipVisualization() {
// Version check for the Flash Player that has the ability to start Player // Version check for the Flash Player that has the ability to start Player
@ -330,13 +336,13 @@ function renderCoAuthorshipVisualization() {
AC_FL_RunContent( AC_FL_RunContent(
"src", "playerProductInstall", "src", "playerProductInstall",
"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"", "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
"width", "600", "width", "800",
"height", "840", "height", "840",
"align", "middle", "align", "middle",
"id", "CoAuthor", "id", "EgoCentric",
"quality", "high", "quality", "high",
"bgcolor", "#ffffff", "bgcolor", "#ffffff",
"name", "CoAuthor", "name", "EgoCentric",
"allowScriptAccess","sameDomain", "allowScriptAccess","sameDomain",
"type", "application/x-shockwave-flash", "type", "application/x-shockwave-flash",
"pluginspage", "http://www.adobe.com/go/getflashplayer" "pluginspage", "http://www.adobe.com/go/getflashplayer"
@ -344,16 +350,17 @@ function renderCoAuthorshipVisualization() {
} else if (hasRequestedVersion) { } else if (hasRequestedVersion) {
// if we've detected an acceptable version // if we've detected an acceptable version
// embed the Flash Content SWF when all tests are passed // embed the Flash Content SWF when all tests are passed
//coAuthorUrl=/vivo1/visualization?vis=coauthorship%26render_mode=data%26uri=http%3A%2F%2Fvivo.iu.edu%2Findividual%2FBrnerKaty&labelField=label&coPIUrl=/vivo1/visualization?vis=coprincipalinvestigator%26render_mode=data%26uri=http%3A%2F%2Fvivo.iu.edu%2Findividual%2FBrnerKaty&labelField=label
AC_FL_RunContent( AC_FL_RunContent(
"src", swfLink, "src", swfLink,
"flashVars", "graphmlUrl=" + egoCoAuthorshipDataFeederURL, "flashVars", 'coAuthorUrl='+ encodeURL(egoCoAuthorshipDataFeederURL) + '&coPIUrl=' + encodeURL(egoCoPIDataFeederURL) ,
"width", "600", "width", "800",
"height", "850", "height", "850",
"align", "top", "align", "top",
"id", "CoAuthor", "id", "EgoCentric",
"quality", "high", "quality", "high",
"bgcolor", "#ffffff", "bgcolor", "#ffffff",
"name", "CoAuthor", "name", "EgoCentric",
"allowScriptAccess","sameDomain", "allowScriptAccess","sameDomain",
"type", "application/x-shockwave-flash", "type", "application/x-shockwave-flash",
"pluginspage", "http://www.adobe.com/go/getflashplayer" "pluginspage", "http://www.adobe.com/go/getflashplayer"

View file

@ -35,7 +35,6 @@
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5611"/> <c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5611"/>
</c:url> </c:url>
<c:url var="staticHref3" value="/visualization"> <c:url var="staticHref3" value="/visualization">
<c:param name="vis" value="person_pub_count"/> <c:param name="vis" value="person_pub_count"/>
<c:param name="vis_mode" value="short"/> <c:param name="vis_mode" value="short"/>
@ -204,13 +203,13 @@
<c:url var="coAuthorship10" value="/visualization"> <c:url var="coAuthorship10" value="/visualization">
<c:param name="vis" value="coauthorship"/> <c:param name="vis" value="coauthorship"/>
<c:param name="render_mode" value="standalone"/> <c:param name="render_mode" value="standalone"/>
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual12053"/> <c:param name="uri" value="http://vivo.iu.edu/individual/BrnerKaty"/>
</c:url> </c:url>
<c:url var="coAuthorship10Data" value="/visualization"> <c:url var="coAuthorship10Data" value="/visualization">
<c:param name="vis" value="coauthorship"/> <c:param name="vis" value="coauthorship"/>
<c:param name="render_mode" value="data"/> <c:param name="render_mode" value="data"/>
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual12053"/> <c:param name="uri" value="http://vivo.iu.edu/individual/BrnerKaty"/>
</c:url> </c:url>
<c:url var="coAuthorshipSparklineData" value="/visualization"> <c:url var="coAuthorshipSparklineData" value="/visualization">
@ -229,6 +228,61 @@
<c:url var="loadingImageLink" value="/${themeDir}site_icons/visualization/ajax-loader.gif"></c:url> <c:url var="loadingImageLink" value="/${themeDir}site_icons/visualization/ajax-loader.gif"></c:url>
<c:url var="departmentPublications" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="standalone"/>
<c:param name="vis_mode" value="DEPARTMENT"/>
<c:param name="uri" value="http://vivo-trunk.indiana.edu/individual/DepartmentBL-SLIS"/>
</c:url>
<c:url var="schoolPublications" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="standalone"/>
<c:param name="vis_mode" value="SCHOOL"/>
<c:param name="uri" value="http://vivo.iu.edu/individual/SchoolofLibraryandInformationScience"/>
</c:url>
<c:url var="universityPublications" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="standalone"/>
<c:param name="vis_mode" value="UNIVERSITY"/>
<c:param name="uri" value="http://vivo-trunk.indiana.edu/individual/n7971"/>
</c:url>
<c:url var="departmentPublicationsdata" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="data"/>
<c:param name="vis_mode" value="DEPARTMENT"/>
<c:param name="uri" value="http://vivo-trunk.indiana.edu/individual/DepartmentBL-SLIS"/>
</c:url>
<c:url var="schoolPublicationsdata" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="data"/>
<c:param name="vis_mode" value="SCHOOL"/>
<c:param name="uri" value="http://vivo.iu.edu/individual/SchoolofLibraryandInformationScience"/>
</c:url>
<c:url var="universityPublicationsdata" value="/visualization">
<c:param name="vis" value="entity_comparison"/>
<c:param name="render_mode" value="data"/>
<c:param name="vis_mode" value="UNIVERSITY"/>
<c:param name="uri" value="http://vivo-trunk.indiana.edu/individual/n7971"/>
</c:url>
<c:url var="coprincipalinvestigatordata" value="/visualization">
<c:param name="vis" value="coprincipalinvestigator"/>
<c:param name="render_mode" value="data"/>
<c:param name="uri" value="http://vivo.iu.edu/individual/McDonaldRobertH"/>
</c:url>
<c:url var="freemarkertest" value="/visualization">
<c:param name="vis" value="freemarker"/>
<c:param name="render_mode" value="standalone"/>
<c:param name="uri" value="http://vivo.iu.edu/individual/McDonaldRobertH"/>
</c:url>
<style type="text/css"> <style type="text/css">
.get_vis { .get_vis {
background-color:Yellow; background-color:Yellow;
@ -316,7 +370,7 @@ $(document).ready(function() {
<h1 id="test-bed">Visualization Testbed (Not to be seen by eventual end users)</h1> <h1 id="test-bed">Visualization Testbed (Not to be seen by eventual end users)</h1>
<h2>Hello World!</h2>
<a href='<c:out value="${coAuthorship1}"/>'>vis link for coauthorship -> "Erb, Hollis Nancy"</a> <a href='<c:out value="${coAuthorship1}"/>'>vis link for coauthorship -> "Erb, Hollis Nancy"</a>
&nbsp;&nbsp;<a href='<c:out value="${coAuthorship1Data}"/>'>Data</a> &nbsp;&nbsp;<a href='<c:out value="${coAuthorship1Data}"/>'>Data</a>
@ -342,8 +396,24 @@ $(document).ready(function() {
<a href='<c:out value="${coAuthorship10}"/>'>vis link for coauthorship -> "Not Working"</a>&nbsp; <a href='<c:out value="${coAuthorship10}"/>'>vis link for coauthorship -> "Not Working"</a>&nbsp;
<a href='<c:out value="${coAuthorship10Data}"/>'>Data</a><br /> <a href='<c:out value="${coAuthorship10Data}"/>'>Data</a><br />
<a href='<c:out value="${departmentPublications}"/>'>Department Publications</a>
&nbsp;&nbsp;<a href='<c:out value="${departmentPublicationsdata}"/>'>Data</a><br />
<a href='<c:out value="${schoolPublications}"/>'>School Publications</a>
&nbsp;&nbsp;<a href='<c:out value="${schoolPublicationsdata}"/>'>Data</a><br />
<a href='<c:out value="${universityPublications}"/>'>University Publications</a>
&nbsp;&nbsp;<a href='<c:out value="${universityPublicationsdata}"/>'>Data</a><br />
<br /><br /><br /> <br /><br /><br />
<a href='<c:out value="${coprincipalinvestigatordata}"/>'>Co-PI data </a>
<br /><br /><br />
<a href='<c:out value="${freemarkertest}"/>'>Freemarker Test</a>
<br /><br /><br />
<a href='<c:out value="${collegeCSV}"/>'>vis data query for college -> "School of Industrial and Labor Relations (ILR)"</a><br /> <a href='<c:out value="${collegeCSV}"/>'>vis data query for college -> "School of Industrial and Labor Relations (ILR)"</a><br />
<a href='<c:out value="${collegeCSV2}"/>'>vis data query for college -> "College of Agriculture and Life Sciences (CALS)"</a><br /> <a href='<c:out value="${collegeCSV2}"/>'>vis data query for college -> "College of Agriculture and Life Sciences (CALS)"</a><br />
<a href='<c:out value="${collegeCSV3}"/>'>vis data query for college -> "College of Arts and Sciences"</a><br /> <a href='<c:out value="${collegeCSV3}"/>'>vis data query for college -> "College of Arts and Sciences"</a><br />

View file

@ -0,0 +1,189 @@
<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%>
<!--<script type="text/javascript" src="http://orderedlist.com/demos/quicksilverjs/javascripts/quicksilver.js"></script>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<c:set var="portalBean" value="${requestScope.portalBean}" />
<c:set var="themeDir">
<c:out value="${portalBean.themeDir}" />
</c:set>
<c:set var='jsonContent' value='${requestScope.JsonContent}' />
<div id="body">
<div id="navcontainer">
<ul id="navlist">
<li><a href="#">Temporal</a></li>
<li><a href="#">Geospatial</a></li>
<li><a href="#">Scimap</a></li>
<li><a href="#">Networks</a></li>
</ul>
</div>
<h1>Temporal Graph Visualization<span id="entitylevelheading"><i> School level</i></span></h1>
<div id="leftblock">
<div id="leftUpper">
<h2 style="background-color:#3D454E; color: white; margin-top: 0px; margin-bottom: 20px; padding-bottom:5px;">How do you want to compare?</h2>
<p style="float:left; margin-left:10px; margin-right: 10px; margin-top: 6px;">Select </p>
<select class="comparisonValues" style="margin-bottom: 20px;">
<option value="Publications" selected="selected">Publications</option>
<option value="Grants" disabled="disabled">Grants</option>
<option value="People" disabled="disabled">People</option>
<option value="Item4" disabled="disabled">Item4</option>
<option value="Item5" disabled="disabled">Item5</option>
</select>
</div>
<br/>
<div id="leftLower">
<h2 style="background-color:#3D454E; color: white; margin-top: 0px; margin-bottom: 20px; padding-bottom:5px;">Choose</h2>
<div id="paginatedTable">
</div>
</div>
<div id = "stopwordsdiv">
* The entity types core:Person, foaf:Organization have been excluded as they are too general.
</div>
</div>
<div id="rightblock">
<div id="graphContainer" style="width: 450px; height: 250px;"></div>
<div id="yaxislabel"></div>
<div id="bottom" style="width: 450px; height: 350px;">
<div id="xaxislabel">Year</div>
<h3><span id="comparisonParameter"></span></h3>
<p class="displayCounter">You have selected <span id="counter">0</span> of a maximum <span
id="total">10</span> <span id="entityleveltext"> schools</span> to compare.</p>
</div>
</div>
<div id="bottomButtons">
<button id="clear" class = "metallic" type ="button">Clear</button>
<button id="csv" class = "metallic" type ="button">Save as CSV</button>
<button id="image" class= "metallic" type="button" onClick="window.print()"> Save as Image</button>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var jsonString = '${jsonContent}';
var jsonObject = {
prepare : function(arg1){
loadData(arg1);
}
};
graphContainer = $("#graphContainer");
tableDiv = $('#paginatedTable');
// initial display of the grid when the page loads
init(graphContainer);
/*
* When the intra-entity parameters are clicked,
* update the status accordingly.
*/
$("select.comparisonValues").click(function(){
var selectedValue = $("select.comparisonValues option:selected").val();
$("#comparisonParameter").text("Total Number of " + selectedValue);
$('#yaxislabel').html("Number of " + selectedValue ).mbFlipText(false);
$("span#paramdesc").text($("select.comparisonValues option:selected").val() + ' (desc)');
$("span#paramasc").text($("select.comparisonValues option:selected").val() + ' (asc)');
});
//click event handler for clear button
$("button#clear").click(function(){
clearRenderedObjects();
});
$("input[type=checkbox].easyDeselectCheckbox").live('click', function(){
var checkbox = $(this);
var checkboxValue = $(this).attr("value");
var linkedCheckbox = labelToCheckedEntities[checkboxValue];
//console.log('checkbox value is '+ checkboxValue);
var entityToBeRemoved = labelToEntityRecord[checkboxValue];
if(!checkbox.is(':checked')){
//console.log("Easy deselect checkbox is unclicked!");
updateRowHighlighter(linkedCheckbox);
removeUsedColor(entityToBeRemoved);
removeEntityUnChecked(renderedObjects, entityToBeRemoved);
removeGraphic(linkedCheckbox);
removeCheckBoxFromGlobalSet(linkedCheckbox);
$(linkedCheckbox).attr('checked', false);
checkIfColorLimitIsReached();
displayLineGraphs();
updateCounter();
}
});
//parse the json object and pass it to loadData
jsonObject.prepare(jQuery.parseJSON(jsonString));
/*
* function to populate the labelToEntityRecord object with the
* values from the json file and
* dynamically generate checkboxes
*/
function loadData(jsonData){
// var yearRange;
$.each(jsonData, function(index, val){
setOfLabels.push(val.label);
labelToEntityRecord[val.label] = val;
});
getEntityVisMode(jsonData);
prepareTableForDataTablePagination(jsonData);
setEntityLevel();
// calcMinandMaxYears(labelToEntityRecord, year);
//yearRange = (year.max - year.min);
// setLineWidthAndTickSize(yearRange, FlotOptions);
//setTickSizeOfYAxis(calcMaxOfComparisonParameter(labelToEntityRecord), FlotOptions);
/*
* When the elements in the paginated div
* are clicked this event handler is called
*/
$("input.if_clicked_on_school").live('click', function(){
var checkbox = $(this);
var checkboxValue = $(this).attr("value");
var entity = labelToEntityRecord[checkboxValue];
//Dynamically generate the bar, checkbox and label.
var bottomDiv = $("#bottom");
var hiddenLabel = createGraphic(entity, bottomDiv);
var divBar = hiddenLabel.next();
var divLabel = hiddenLabel.prev();
var spanElement = divBar.next('span');
if (checkbox.is(':checked')) {
getNextFreeColor(entity);
generateBarAndLabel(entity, divBar, divLabel,checkbox, spanElement) ;
renderLineGraph(renderedObjects, entity);
labelToCheckedEntities[checkboxValue] = checkbox;
} else if (!checkbox.is(':checked')) {
removeUsedColor(entity);
removeEntityUnChecked(renderedObjects, entity);
removeGraphic(checkbox);
removeCheckBoxFromGlobalSet(checkbox);
}
//console.log('Number of checked entities: ' + getSize(labelToCheckedEntities));
//disableUncheckedEntities();
setTickSizeOfAxes();
checkIfColorLimitIsReached();
//populateMapOfCheckedEntities();
displayLineGraphs();
updateCounter();
});
}
});
</script>

View file

@ -0,0 +1,62 @@
<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:set var="portalBean" value="${requestScope.portalBean}" />
<c:set var="themeDir"><c:out value="${portalBean.themeDir}" /></c:set>
<c:set var="contextPath"><c:out value="${pageContext.request.contextPath}" /></c:set>
<c:url var="jquery" value="/js/jquery.js"/>
<c:url var="flot" value="/js/jquery_plugins/flot/jquery.flot.js"/>
<c:url var="fliptext" value="/js/jquery_plugins/fliptext/jquery.mb.flipText.js"/>
<c:url var="jgrowl" value="/js/jquery_plugins/jgrowl/jquery.jgrowl.js"/>
<c:url var="pagination" value="/js/jquery_plugins/pagination/jquery.pagination.js"/>
<c:url var="livesearch" value="/js/jquery_plugins/jquery.livesearch.js"/>
<c:url var="datatable" value="/js/jquery_plugins/datatable/jquery.dataTables.js"/>
<c:url var="autoellipsis" value="/js/jquery_plugins/jquery.AutoEllipsis.js"/>
<c:url var="entityComparisonUtils" value="/js/visualization/entityComparison/util.js" />
<c:url var="entityComparisonConstants" value="/js/visualization/entityComparison/constants.js" />
<!-- css related to jgrowl and pagination js files. -->
<c:url var="paginationStyle" value="/js/jquery_plugins/pagination/pagination.css" />
<c:url var="jgrowlStyle" value="/js/jquery_plugins/jgrowl/jquery.jgrowl.css" />
<!-- css related to dataTable js files. -->
<c:url var="demopage" value="/js/jquery_plugins/datatable/demo_page.css" />
<c:url var="demoTable" value="/js/jquery_plugins/datatable/demo_table.css" />
<c:url var="entityComparisonStyle" value="/${themeDir}css/visualization/entityComparison/layout.css" />
<c:url var="vizStyle" value="/${themeDir}css/visualization/visualization.css" />
<!-- Including jquery, entity comparison related javascript files -->
<script type="text/javascript" src="${jquery}"></script>
<script type="text/javascript" src="${flot}"></script>
<script type="text/javascript" src="${fliptext}"></script>
<script type="text/javascript" src="${jgrowl}"></script>
<script type="text/javascript" src="${pagination}"></script>
<script type="text/javascript" src="${livesearch}"></script>
<script type="text/javascript" src="${datatable}"></script>
<script type="text/javascript" src="${autoellipsis}"></script>
<script type="text/javascript" src="${entityComparisonUtils}"></script>
<script type="text/javascript" src="${entityComparisonConstants}"></script>
<link href="${entityComparisonStyle}" rel="stylesheet" type="text/css" />
<link href="${paginationStyle}" rel="stylesheet" type="text/css" />
<link href="${jgrowlStyle}" rel="stylesheet" type="text/css" />
<link href="${demopage}" rel="stylesheet" type="text/css" />
<link href="${demoTable}" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="${vizStyle}" />
<script language="JavaScript" type="text/javascript">
<!--
var contextPath = "${contextPath}";
// -->
</script>

View file

@ -18,6 +18,8 @@
<c:set var='numOfAuthors' value='${requestScope.numOfAuthors}' /> <c:set var='numOfAuthors' value='${requestScope.numOfAuthors}' />
<c:set var='numOfCoAuthorShips' value='${requestScope.numOfCoAuthorShips}' /> <c:set var='numOfCoAuthorShips' value='${requestScope.numOfCoAuthorShips}' />
<c:set var='completeURL' value='${requestScope.completeURL}' />
<c:url var="egoVivoProfileURL" value="/individual"> <c:url var="egoVivoProfileURL" value="/individual">
<c:param name="uri" value="${requestScope.egoURIParam}" /> <c:param name="uri" value="${requestScope.egoURIParam}" />
</c:url> </c:url>
@ -59,6 +61,7 @@ $(document).ready(function(){
<div id="body"> <div id="body">
<div>complete URL = '${completeURL} '</div>
<!--[if IE]> <!--[if IE]>
<style type="text/css"> <style type="text/css">

View file

@ -13,6 +13,14 @@
<c:param name="labelField" value="label" /> <c:param name="labelField" value="label" />
</c:url> </c:url>
<c:url var="egoCoPIDataFeederURL" value="/visualization">
<c:param name="vis" value="coprincipalinvestigator" />
<c:param name="render_mode" value="data" />
<c:param name="uri" value="${requestScope.egoURIParam}" />
<c:param name="labelField" value="label" />
</c:url>
<c:url var="egoCoAuthorsListDataFileURL" value="/visualization"> <c:url var="egoCoAuthorsListDataFileURL" value="/visualization">
<c:param name="vis" value="person_level" /> <c:param name="vis" value="person_level" />
<c:param name="render_mode" value="data" /> <c:param name="render_mode" value="data" />
@ -20,7 +28,7 @@
<c:param name="uri" value="${requestScope.egoURIParam}" /> <c:param name="uri" value="${requestScope.egoURIParam}" />
</c:url> </c:url>
<c:url var="swfLink" value="/${themeDir}site_icons/visualization/coauthorship/CoAuthor.swf" /> <c:url var="swfLink" value="/${themeDir}site_icons/visualization/coauthorship/EgoCentric.swf" />
<c:url var="jquery" value="/js/jquery.js"/> <c:url var="jquery" value="/js/jquery.js"/>
<c:url var="adobeFlashDetector" value="/js/visualization/coauthorship/AC_OETags.js" /> <c:url var="adobeFlashDetector" value="/js/visualization/coauthorship/AC_OETags.js" />
@ -48,6 +56,7 @@ var swfLink = "${swfLink}";
var egoURI = "${requestScope.egoURIParam}"; var egoURI = "${requestScope.egoURIParam}";
var egoCoAuthorshipDataFeederURL = "${egoCoAuthorshipDataFeederURL}"; var egoCoAuthorshipDataFeederURL = "${egoCoAuthorshipDataFeederURL}";
var egoCoAuthorsListDataFileURL = "${egoCoAuthorsListDataFileURL}"; var egoCoAuthorsListDataFileURL = "${egoCoAuthorsListDataFileURL}";
var egoCoPIDataFeederURL = "${egoCoPIDataFeederURL}";
var contextPath = "${contextPath}"; var contextPath = "${contextPath}";
// --> // -->

View file

@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
@ -36,14 +37,13 @@ import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequ
* *
* @author cdtank * @author cdtank
*/ */
@SuppressWarnings("serial")
public class VisualizationController extends BaseEditController { public class VisualizationController extends BaseEditController {
private Map<String, VisualizationRequestHandler> visualizationIDsToClass; private Map<String, VisualizationRequestHandler> visualizationIDsToClass;
public static final String URL_ENCODING_SCHEME = "UTF-8"; public static final String URL_ENCODING_SCHEME = "UTF-8";
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(VisualizationController.class.getName()); private static final Log log = LogFactory.getLog(VisualizationController.class.getName());
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;

View file

@ -46,6 +46,7 @@ public class VisualizationFrameworkConstants {
public static final String COAUTHORSLIST_VIS_MODE = "coauthors"; public static final String COAUTHORSLIST_VIS_MODE = "coauthors";
public static final String SHORT_SPARKLINE_VIS_MODE = "short"; public static final String SHORT_SPARKLINE_VIS_MODE = "short";
public static final String FULL_SPARKLINE_VIS_MODE = "full"; public static final String FULL_SPARKLINE_VIS_MODE = "full";
public static final String COPI_VIS_MODE = "copi";
/* /*
* These values represent possible utilities vis modes. * These values represent possible utilities vis modes.
@ -55,6 +56,10 @@ public class VisualizationFrameworkConstants {
public static final String COAUTHOR_UTILS_VIS_MODE = "COAUTHORSHIP_URL"; public static final String COAUTHOR_UTILS_VIS_MODE = "COAUTHORSHIP_URL";
public static final String PERSON_LEVEL_UTILS_VIS_MODE = "PERSON_LEVEL_URL"; public static final String PERSON_LEVEL_UTILS_VIS_MODE = "PERSON_LEVEL_URL";
public static final String IMAGE_UTILS_VIS_MODE = "IMAGE_URL"; public static final String IMAGE_UTILS_VIS_MODE = "IMAGE_URL";
public static final String UNIVERSITY_COMPARISON_VIS_MODE = "UNIVERSITY";
public static final String SCHOOL_COMPARISON_VIS_MODE = "SCHOOL";
public static final String DEPARTMENT_COMPARISON_VIS_MODE = "DEPARTMENT";
/* /*
* These values represent possible visualizations provided as values to the "vis" url key. * These values represent possible visualizations provided as values to the "vis" url key.
@ -65,5 +70,8 @@ public class VisualizationFrameworkConstants {
public static final String COAUTHORSHIP_VIS = "coauthorship"; public static final String COAUTHORSHIP_VIS = "coauthorship";
public static final String PERSON_LEVEL_VIS = "person_level"; public static final String PERSON_LEVEL_VIS = "person_level";
public static final String UTILITIES_VIS = "utilities"; public static final String UTILITIES_VIS = "utilities";
public static final String ENTITY_COMPARISON_VIS = "entity_comparison";
public static final String CO_PI_VIS = "coprincipalinvestigator";
} }

View file

@ -0,0 +1,5 @@
package edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker;
public class VisualizationController {
}

View file

@ -33,7 +33,6 @@ import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoAuthorshipData; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoAuthorshipData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Edge; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Edge;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node; 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.visutils.QueryRunner; import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator; import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
@ -51,8 +50,6 @@ public class CoAuthorshipQueryRunner implements QueryRunner<CoAuthorshipData> {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
private String egoURI; private String egoURI;
private Map<String, VivoCollegeOrSchool> collegeURLToVO =
new HashMap<String, VivoCollegeOrSchool>();
private DataSource dataSource; private DataSource dataSource;
@ -356,9 +353,9 @@ public class CoAuthorshipQueryRunner implements QueryRunner<CoAuthorshipData> {
} }
public Map<String, VivoCollegeOrSchool> getCollegeURLToVO() { // public Map<String, VivoCollegeOrSchool> getCollegeURLToVO() {
return collegeURLToVO; // return collegeURLToVO;
} // }
private BiboDocument createDocumentVO(QuerySolution solution, String documentURL) { private BiboDocument createDocumentVO(QuerySolution solution, String documentURL) {

View file

@ -1,322 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.hp.hpl.jena.iri.IRI;
import com.hp.hpl.jena.iri.IRIFactory;
import com.hp.hpl.jena.iri.Violation;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants.EmployeeType;
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.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.QueryRunner;
/**
* @author cdtank
*/
public class CollegePublicationCountQueryRunner implements QueryRunner<Set<VivoEmployee>> {
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
private String collegeURI;
private Map<String, VivoCollegeOrSchool> collegeURLToVO =
new HashMap<String, VivoCollegeOrSchool>();
private DataSource dataSource;
private Log log;
public CollegePublicationCountQueryRunner(String collegeURI,
DataSource dataSource, Log log) {
this.collegeURI = collegeURI;
this.dataSource = dataSource;
this.log = log;
}
private Set<VivoEmployee> createJavaValueObjects(ResultSet resultSet) {
Set<VivoEmployee> collegeAcademicEmployees = new HashSet<VivoEmployee>();
Map<String, VivoDepartmentOrDivision> departmentURLToVO =
new HashMap<String, VivoDepartmentOrDivision>();
Map<String, VivoEmployee> employeeURLToVO = new HashMap<String, VivoEmployee>();
while (resultSet.hasNext()) {
QuerySolution solution = resultSet.nextSolution();
String collegeURL = solution.get(QueryFieldLabels.COLLEGE_URL).toString();
VivoCollegeOrSchool currentCollege;
if (collegeURLToVO.containsKey(collegeURL)) {
currentCollege = collegeURLToVO.get(collegeURL);
} else {
currentCollege = new VivoCollegeOrSchool(collegeURL);
collegeURLToVO.put(collegeURL, currentCollege);
RDFNode collegeLabelNode = solution.get(QueryFieldLabels.COLLEGE_LABEL);
if (collegeLabelNode != null) {
currentCollege.setCollegeLabel(collegeLabelNode.toString());
}
}
String departmentURL = solution.get(QueryFieldLabels.DEPARTMENT_URL).toString();
VivoDepartmentOrDivision currentDepartment;
if (departmentURLToVO.containsKey(departmentURL)) {
currentDepartment = departmentURLToVO.get(departmentURL);
currentDepartment.addParentCollege(currentCollege);
} else {
currentDepartment = new VivoDepartmentOrDivision(departmentURL, currentCollege);
departmentURLToVO.put(departmentURL, currentDepartment);
RDFNode departmentLabelNode = solution.get(QueryFieldLabels.DEPARTMENT_LABEL);
if (departmentLabelNode != null) {
currentDepartment.setDepartmentLabel(departmentLabelNode.toString());
}
}
currentCollege.addDepartment(currentDepartment);
RDFNode employeeNode = solution.get(QueryFieldLabels.ACADEMIC_FACULTY_EMPLOYEE_URL);
EmployeeType currentEmployeeType;
VivoEmployee currentEmployee;
if (employeeNode != null) {
currentEmployeeType = EmployeeType.ACADEMIC_FACULTY_EMPLOYEE;
} else {
currentEmployeeType = EmployeeType.ACADEMIC_STAFF_EMPLOYEE;
employeeNode = solution.get(QueryFieldLabels.ACADEMIC_STAFF_EMPLOYEE_URL);
}
if (employeeURLToVO.containsKey(employeeNode.toString())) {
currentEmployee = employeeURLToVO.get(employeeNode.toString());
currentEmployee.addParentDepartment(currentDepartment);
} else {
currentEmployee = new VivoEmployee(employeeNode.toString(),
currentEmployeeType,
currentDepartment);
RDFNode authorLabelNode = solution.get(QueryFieldLabels.AUTHOR_LABEL);
if (authorLabelNode != null) {
currentEmployee.setIndividualLabel(authorLabelNode.toString());
}
employeeURLToVO.put(employeeNode.toString(), currentEmployee);
}
RDFNode documentNode = solution.get(QueryFieldLabels.DOCUMENT_URL);
if (documentNode != null) {
/*
* A document can have multiple authors but if the same author serves in
* multiple departments then we need to account for "An Authored Document"
* only once. This check will make sure that a document by same author is
* not added twice just because that author serves in 2 distinct department.
* */
boolean isNewDocumentAlreadyAdded = testForDuplicateEntryOfDocument(
currentEmployee,
documentNode);
if (!isNewDocumentAlreadyAdded) {
currentEmployee.addAuthorDocument(
createAuthorDocumentsVO(solution,
documentNode.toString()));
}
}
collegeAcademicEmployees.add(currentEmployee);
}
return collegeAcademicEmployees;
}
private boolean testForDuplicateEntryOfDocument(
VivoEmployee currentEmployee, RDFNode documentNode) {
boolean isNewDocumentAlreadyAdded = false;
for (BiboDocument currentAuthoredDocument : currentEmployee.getAuthorDocuments()) {
if (currentAuthoredDocument.getDocumentURL()
.equalsIgnoreCase(documentNode.toString())) {
isNewDocumentAlreadyAdded = true;
break;
}
}
return isNewDocumentAlreadyAdded;
}
public Map<String, VivoCollegeOrSchool> getCollegeURLToVO() {
return collegeURLToVO;
}
private BiboDocument createAuthorDocumentsVO(QuerySolution solution, String documentURI) {
BiboDocument biboDocument = new BiboDocument(documentURI);
RDFNode documentLabelNode = solution.get(QueryFieldLabels.DOCUMENT_LABEL);
if (documentLabelNode != null) {
biboDocument.setDocumentLabel(documentLabelNode.toString());
}
RDFNode documentBlurbNode = solution.get(QueryFieldLabels.DOCUMENT_BLURB);
if (documentBlurbNode != null) {
biboDocument.setDocumentBlurb(documentBlurbNode.toString());
}
RDFNode documentMonikerNode = solution.get(QueryFieldLabels.DOCUMENT_MONIKER);
if (documentMonikerNode != null) {
biboDocument.setDocumentMoniker(documentMonikerNode.toString());
}
RDFNode documentDescriptionNode = solution.get(QueryFieldLabels.DOCUMENT_DESCRIPTION);
if (documentDescriptionNode != null) {
biboDocument.setDocumentDescription(documentDescriptionNode.toString());
}
RDFNode publicationYearNode = solution.get(QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR);
if (publicationYearNode != null) {
biboDocument.setPublicationYear(publicationYearNode.toString());
}
RDFNode publicationYearMonthNode = solution.get(
QueryFieldLabels
.DOCUMENT_PUBLICATION_YEAR_MONTH);
if (publicationYearMonthNode != null) {
biboDocument.setPublicationYearMonth(publicationYearMonthNode.toString());
}
RDFNode publicationDateNode = solution.get(QueryFieldLabels.DOCUMENT_PUBLICATION_DATE);
if (publicationDateNode != null) {
biboDocument.setPublicationDate(publicationDateNode.toString());
}
return biboDocument;
}
private ResultSet executeQuery(String queryText,
DataSource dataSource) {
QueryExecution queryExecution = null;
try {
Query query = QueryFactory.create(queryText, SYNTAX);
// QuerySolutionMap qs = new QuerySolutionMap();
// qs.add("authPerson", queryParam); // bind resource to s
queryExecution = QueryExecutionFactory.create(query, dataSource);
if (query.isSelectType()) {
return queryExecution.execSelect();
}
} finally {
if (queryExecution != null) {
queryExecution.close();
}
}
return null;
}
private String generateCollegeEmployeeSparqlQuery(String queryURI) {
// Resource uri1 = ResourceFactory.createResource(queryURI);
String sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT (str(?collegeLabel) as ?" + QueryFieldLabels.COLLEGE_LABEL + ") "
+ " (str(?department) as ?" + QueryFieldLabels.DEPARTMENT_URL + ") "
+ " (str(?departmentLabel) as ?" + QueryFieldLabels.DEPARTMENT_LABEL + ") "
+ " (str(?academicFacultyEmployee) as ?" + QueryFieldLabels.ACADEMIC_FACULTY_EMPLOYEE_URL + ") "
+ " (str(?academicStaffEmployee) as ?" + QueryFieldLabels.ACADEMIC_STAFF_EMPLOYEE_URL + ") "
+ " (str(<" + queryURI + ">) as ?" + QueryFieldLabels.COLLEGE_URL + ") "
+ " (str(?authorLabel) as ?" + QueryFieldLabels.AUTHOR_LABEL + ") "
+ " (str(?document) as ?" + QueryFieldLabels.DOCUMENT_URL + ") "
+ " (str(?documentMoniker) as ?" + QueryFieldLabels.DOCUMENT_MONIKER + ") "
+ " (str(?documentLabel) as ?" + QueryFieldLabels.DOCUMENT_LABEL + ") "
+ " (str(?documentBlurb) as ?" + QueryFieldLabels.DOCUMENT_BLURB + ") "
+ " (str(?documentDescription) as ?" + QueryFieldLabels.DOCUMENT_DESCRIPTION + ") "
+ " (str(?publicationYear) as ?" + QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR + ") "
+ "WHERE { "
+ "<" + queryURI + "> rdf:type vivo:CollegeOrSchoolWithinUniversity; " +
"rdfs:label ?collegeLabel; " +
"vivo:hasAcademicDepartmentOrDivision ?department . "
+ "?department rdfs:label ?departmentLabel ."
+ "{ "
+ getAcademicEmployeePublicationsSparqlQuery("academicFacultyEmployee", "vivo:hasEmployeeAcademicFacultyMember")
+ " UNION "
+ getAcademicEmployeePublicationsSparqlQuery("academicStaffEmployee", "vivo:hasEmployeeAcademicStaffMember")
+ "}"
+ "}";
// System.out.println(sparqlQuery);
return sparqlQuery;
}
private String getAcademicEmployeePublicationsSparqlQuery(String employeeHandle,
String ontologyHandle) {
String sparqlQuery = " {?department " + ontologyHandle + " ?" + employeeHandle + " . "
+ "?" + employeeHandle + " rdf:type foaf:Person; rdfs:label ?authorLabel. "
+ "OPTIONAL { ?" + employeeHandle + " vivo:authorOf ?document ." +
" ?document rdfs:label ?documentLabel ." +
" OPTIONAL { ?document vitro:moniker ?documentMoniker } ." +
" OPTIONAL { ?document vitro:blurb ?documentBlurb } ." +
" OPTIONAL { ?document vitro:description ?documentDescription } ." +
" OPTIONAL { ?document vivo:publicationYear ?publicationYear } ." +
"}" +
"} ";
return sparqlQuery;
}
public Set<VivoEmployee> getQueryResult()
throws MalformedQueryParametersException {
if (StringUtils.isNotBlank(this.collegeURI)) {
/*
* To test for the validity of the URI submitted.
* */
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
IRI iri = iRIFactory.create(this.collegeURI);
if (iri.hasViolation(false)) {
String errorMsg = ((Violation) iri.violations(false).next()).getShortMessage();
log.error("Pub Count Vis Query " + errorMsg);
throw new MalformedQueryParametersException(
"URI provided for an individual is malformed.");
}
} else {
throw new MalformedQueryParametersException("URI parameter is either null or empty.");
}
ResultSet resultSet = executeQuery(generateCollegeEmployeeSparqlQuery(this.collegeURI),
this.dataSource);
return createJavaValueObjects(resultSet);
}
}

View file

@ -1,394 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount;
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.ServletException;
import javax.servlet.ServletOutputStream;
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;
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.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
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.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.PDFDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler;
public class CollegePublicationCountRequestHandler implements VisualizationRequestHandler {
public void generateVisualization(VitroRequest vitroRequest,
HttpServletRequest request,
HttpServletResponse response,
Log log,
DataSource dataSource) {
String collegeURIParam = vitroRequest.getParameter(
VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
String renderMode = vitroRequest.getParameter(
VisualizationFrameworkConstants.RENDER_MODE_KEY);
String visMode = vitroRequest.getParameter(
VisualizationFrameworkConstants.VIS_MODE_KEY);
String visContainer = vitroRequest.getParameter(
VisualizationFrameworkConstants.VIS_CONTAINER_KEY);
QueryRunner<Set<VivoEmployee>> queryManager =
new CollegePublicationCountQueryRunner(collegeURIParam,
dataSource,
log);
try {
Set<VivoEmployee> employees = queryManager.getQueryResult();
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime =
new HashMap<VivoDepartmentOrDivision, Map<String, Integer>>();
Set<String> publishedYearsForCollege = new HashSet<String>();
for (VivoEmployee currentEmployee : employees) {
Map<String, Integer> currentEmployeeYearToPublicationCount =
UtilityFunctions.getYearToPublicationCount(
currentEmployee.getAuthorDocuments());
if (currentEmployeeYearToPublicationCount.size() > 0) {
publishedYearsForCollege.addAll(currentEmployeeYearToPublicationCount.keySet());
for (VivoDepartmentOrDivision currentDepartment
: currentEmployee.getParentDepartments()) {
departmentToPublicationsOverTime
.put(currentDepartment,
getUpdatedDepartmentPublicationsOverTime(
currentEmployeeYearToPublicationCount,
departmentToPublicationsOverTime
.get(currentDepartment)));
}
}
}
/*
* 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.equalsIgnoreCase(renderMode)) {
prepareDataResponse(
departmentToPublicationsOverTime,
((CollegePublicationCountQueryRunner) queryManager).getCollegeURLToVO(),
response);
log.debug(publishedYearsForCollege);
return;
}
/*
if (PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
prepareVisualizationQueryPDFResponse(authorDocuments,
yearToPublicationCount);
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);
} catch (MalformedQueryParametersException e) {
try {
UtilityFunctions.handleMalformedParameters(
e.getMessage(),
"Visualization Query Error - College Publication Count",
vitroRequest,
request,
response,
log);
} catch (ServletException e1) {
log.error(e1.getStackTrace());
} catch (IOException e1) {
log.error(e1.getStackTrace());
}
return;
}
}
private Map<String, Integer> getUpdatedDepartmentPublicationsOverTime(
Map<String, Integer> currentEmployeeYearToPublicationCount,
Map<String, Integer> currentDepartmentYearToPublicationCount) {
Map<String, Integer> departmentYearToPublicationCount;
/*
* 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>();
} 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 preparePDFResponse(Individual college,
List<BiboDocument> authorDocuments,
Map<String, Integer> yearToPublicationCount,
HttpServletResponse response) {
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 = UtilityFunctions.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 prepareDataResponse(
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
Map<String, VivoCollegeOrSchool> collegeURLToVO, HttpServletResponse response) {
String collegeName = null;
/*
* To protect against cases where there are no author documents associated with the
* individual.
* */
if (collegeURLToVO.size() > 0) {
collegeName = ((VivoCollegeOrSchool) collegeURLToVO.values()
.iterator().next()).getCollegeLabel();
}
/*
* To make sure that null/empty records for author names do not cause any mischief.
* */
if (collegeName == null) {
collegeName = "";
}
String outputFileName = UtilityFunctions.slugify(collegeName) + "depts-pub-count" + ".csv";
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(departmentToPublicationsOverTime,
collegeURLToVO,
responseWriter);
responseWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void generateCsvFileBuffer(
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
Map<String, VivoCollegeOrSchool> collegeURLToVO, PrintWriter printWriter) {
CSVWriter csvWriter = new SimpleWriter(printWriter);
try {
csvWriter.append(new String[]{"School", "Department", "Year", "Publications"});
Iterator<VivoCollegeOrSchool> collegeIterator = collegeURLToVO.values().iterator();
while (collegeIterator.hasNext()) {
VivoCollegeOrSchool college = collegeIterator.next();
String collegeLabel = college.getCollegeLabel();
for (VivoDepartmentOrDivision currentDepartment : college.getDepartments()) {
Map<String, Integer> currentDepartmentPublicationsOverTime =
departmentToPublicationsOverTime.get(currentDepartment);
/*
* This because many departments might not have any publication.
* */
if (currentDepartmentPublicationsOverTime != null) {
for (Entry<String, Integer> currentEntry
: currentDepartmentPublicationsOverTime.entrySet()) {
csvWriter.append(new Object[]{collegeLabel,
currentDepartment.getDepartmentLabel(),
currentEntry.getKey(),
currentEntry.getValue()});
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
printWriter.flush();
}
private void prepareStandaloneResponse(HttpServletRequest request,
HttpServletResponse response, VitroRequest vreq,
String visContentCode, String visContextCode) {
Portal portal = vreq.getPortal();
request.setAttribute("visContentCode", visContentCode);
request.setAttribute("visContextCode", visContextCode);
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 prepareDynamicResponse(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");
}
}

View file

@ -51,11 +51,7 @@ public class QueryFieldLabels {
public static final String COLLEGE_URL = "collegeLit"; public static final String COLLEGE_URL = "collegeLit";
public static final String COLLEGE_LABEL = "collegeLabelLit"; public static final String COLLEGE_LABEL = "collegeLabelLit";
/*
* Department related field labels
* */
public static final String DEPARTMENT_URL = "departmentLit";
public static final String DEPARTMENT_LABEL = "departmentLabelLit";
/* /*
* Employee related field labels * Employee related field labels
@ -63,4 +59,62 @@ public class QueryFieldLabels {
public static final String ACADEMIC_FACULTY_EMPLOYEE_URL = "academicFacultyEmployeeLit"; public static final String ACADEMIC_FACULTY_EMPLOYEE_URL = "academicFacultyEmployeeLit";
public static final String ACADEMIC_STAFF_EMPLOYEE_URL = "academicStaffEmployeeLit"; public static final String ACADEMIC_STAFF_EMPLOYEE_URL = "academicStaffEmployeeLit";
/*
* Person related field Labels
*/
public static final String PERSON_URL = "personLit";
public static final String PERSON_LABEL = "personLabelLit";
public static final String PERSON_TYPE = "personTypeLit";
public static final String PERSON_TYPE_LABEL = "personTypeLabelLit";
/*
* Position related field labels
*/
public static final String SECONDARY_POSITION_LABEL = "SecondaryPositionLabelLit";
/*
* start year related field labels
*/
public static final String START_YEAR_LABEL = "StartYearLit";
/*
* Organization related field Labels
*/
public static final String ORGANIZATION_URL = "organizationLit";
public static final String ORGANIZATION_LABEL = "organizationLabelLit";
/*
* Sub Organization related field labels
*/
public static final String SUBORGANIZATION_URL = "subOrganizationLit";
public static final String SUBORGANIZATION_LABEL = "subOrganizationLabelLit";
/*
* Sub Organization related field labels
*/
public static final String SUBORGANIZATION_TYPE = "subOrganizationTypeLit";
public static final String SUBORGANIZATION_TYPE_LABEL = "subOrganizationTypeLabelLit";
/*
* Department related field labels
* */
public static final String DEPARTMENT_URL = "departmentLit";
public static final String DEPARTMENT_LABEL = "departmentLabelLit";
/*
* Co-PI related field labels
*/
public static final String PI_URL = "PILit";
public static final String PI_LABEL = "PILabelLit";
public static final String CO_PI_URL = "coPILit";
public static final String CO_PI_LABEL = "coPILabelLit";
public static final String GRANT_URL = "grantLit";
public static final String GRANT_LABEL = "grantLabelLit";
public static final String GRANT_START_DATE = "grantStartDateLit";
public static final String GRANT_END_DATE = "grantEndDateLit";
} }

View file

@ -11,6 +11,7 @@ import java.util.Calendar;
public class VOConstants { public class VOConstants {
public static final String DEFAULT_PUBLICATION_YEAR = "Unknown"; public static final String DEFAULT_PUBLICATION_YEAR = "Unknown";
public static final String DEFAULT_GRANT_YEAR = "Unknown";
/* /*
* Employee related constants * Employee related constants

View file

@ -0,0 +1,22 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator;
import java.util.Comparator;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIEdge;
/**
* This Comparator is used to sort the edges based on their IDs in ascending order.
* @author bkoniden
*
*/
public class CoPIEdgeComparator implements Comparator<CoPIEdge> {
@Override
public int compare(CoPIEdge arg0, CoPIEdge arg1) {
return arg0.getEdgeID() - arg1.getEdgeID();
}
}

View file

@ -0,0 +1,438 @@
package edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.hp.hpl.jena.iri.IRI;
import com.hp.hpl.jena.iri.IRIFactory;
import com.hp.hpl.jena.iri.Violation;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIEdge;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Grant;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPINode;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
public class CoPIGrantCountQueryRunner implements QueryRunner<CoPIData> {
private static final int MAX_PI_PER_GRANT_ALLOWED = 100;
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
private String egoURI;
private DataSource dataSource;
private Log log;
private UniqueIDGenerator nodeIDGenerator;
private UniqueIDGenerator edgeIDGenerator;
public CoPIGrantCountQueryRunner(String egoURI,
DataSource dataSource, Log log) {
this.egoURI = egoURI;
this.dataSource = dataSource;
this.log = log;
this.nodeIDGenerator = new UniqueIDGenerator();
this.edgeIDGenerator = new UniqueIDGenerator();
}
private String generateEgoCoPIquery(String queryURI) {
String sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT "
+ " (str(<" + queryURI + ">) as ?" + QueryFieldLabels.PI_URL + ") "
+ " (str(?PILabel) as ?" + QueryFieldLabels.PI_LABEL + ") "
+ " (str(?Grant) as ?" + QueryFieldLabels.GRANT_URL + ") "
+ " (str(?GrantLabel) as ?" + QueryFieldLabels.GRANT_LABEL + ") "
+ " (str(?GrantStartDate) as ?" + QueryFieldLabels.GRANT_START_DATE + ") "
+ " (str(?GrantEndDate) as ?" + QueryFieldLabels.GRANT_END_DATE + ") "
+ " (str(?CoPI) as ?" + QueryFieldLabels.CO_PI_URL + ") "
+ " (str(?CoPILabel) as ?" + QueryFieldLabels.CO_PI_LABEL + ") "
+ "WHERE { "
+ "<" + queryURI + "> rdfs:label ?PILabel ;"
+ " core:hasCo-PrincipalInvestigatorRole ?Role . "
+ "?Role core:roleIn ?Grant . "
+ "?Grant rdfs:label ?GrantLabel ; "
+ "core:startDate ?GrantStartDate ; "
+ "core:endDate ?GrantEndDate ;"
+ "core:relatedRole ?RelatedRole . "
+ "?RelatedRole core:co-PrincipalInvestigatorRoleOf ?CoPI . "
+ "?CoPI rdfs:label ?CoPILabel . "
+ " }";
System.out.println("COPI QUERY - " + sparqlQuery);
return sparqlQuery;
}
private ResultSet executeQuery(String queryText, DataSource dataSource) {
QueryExecution queryExecution = null;
try {
Query query = QueryFactory.create(queryText, SYNTAX);
queryExecution = QueryExecutionFactory.create(query, dataSource);
if (query.isSelectType()) {
return queryExecution.execSelect();
}
} finally {
if (queryExecution != null) {
queryExecution.close();
}
}
return null;
}
public CoPIData getQueryResult()
throws MalformedQueryParametersException {
if (StringUtils.isNotBlank(this.egoURI)) {
/*
* To test for the validity of the URI submitted.
* */
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
IRI iri = iRIFactory.create(this.egoURI);
if (iri.hasViolation(false)) {
String errorMsg = ((Violation) iri.violations(false).next()).getShortMessage();
log.error("Ego Co-PI Vis Query " + errorMsg);
throw new MalformedQueryParametersException(
"URI provided for an individual is malformed.");
}
} else {
throw new MalformedQueryParametersException("URI parameter is either null or empty.");
}
ResultSet resultSet = executeQuery(generateEgoCoPIquery(this.egoURI),
this.dataSource);
return createQueryResult(resultSet);
}
private CoPIEdge getExistingEdge(
CoPINode collaboratingNode1,
CoPINode collaboratingNode2,
Map<String, CoPIEdge> edgeUniqueIdentifierToVO) {
String edgeUniqueIdentifier = getEdgeUniqueIdentifier(collaboratingNode1.getNodeID(),
collaboratingNode2.getNodeID());
return edgeUniqueIdentifierToVO.get(edgeUniqueIdentifier);
}
private String getEdgeUniqueIdentifier(int nodeID1, int nodeID2) {
String separator = "*";
if (nodeID1 < nodeID2) {
return nodeID1 + separator + nodeID2;
} else {
return nodeID2 + separator + nodeID1;
}
}
private CoPIData createQueryResult(ResultSet resultSet) {
Set<CoPINode> nodes = new HashSet<CoPINode>();
Map<String, Grant> grantURLToVO = new HashMap<String, Grant>();
Map<String, Set<CoPINode>> grantURLToCoPIs = new HashMap<String, Set<CoPINode>>();
Map<String, CoPINode> nodeURLToVO = new HashMap<String, CoPINode>();
Map<String, CoPIEdge> edgeUniqueIdentifierToVO = new HashMap<String, CoPIEdge>();
CoPINode egoNode = null;
Set<CoPIEdge> edges = new HashSet<CoPIEdge>();
while (resultSet.hasNext()) {
QuerySolution solution = resultSet.nextSolution();
/*
* We only want to create only ONE ego node.
* */
RDFNode egoPIURLNode = solution.get(QueryFieldLabels.PI_URL);
if (nodeURLToVO.containsKey(egoPIURLNode.toString())) {
egoNode = nodeURLToVO.get(egoPIURLNode.toString());
} else {
egoNode = new CoPINode(egoPIURLNode.toString(), nodeIDGenerator);
nodes.add(egoNode);
nodeURLToVO.put(egoPIURLNode.toString(), egoNode);
RDFNode authorLabelNode = solution.get(QueryFieldLabels.PI_LABEL);
if (authorLabelNode != null) {
egoNode.setNodeName(authorLabelNode.toString());
}
}
RDFNode grantNode = solution.get(QueryFieldLabels.GRANT_URL);
Grant grant;
if (grantURLToVO.containsKey(grantNode.toString())) {
grant = grantURLToVO.get(grantNode.toString());
} else {
grant = createGrantVO(solution, grantNode.toString());
grantURLToVO.put(grantNode.toString(), grant);
}
egoNode.addGrant(grant);
/*
* After some discussion we concluded that for the purpose of this visualization
* we do not want a co-pi node or edge if the grant has only one
* pi and that happens to be the ego.
* */
if (solution.get(QueryFieldLabels.PI_URL).toString().equalsIgnoreCase(
solution.get(QueryFieldLabels.CO_PI_URL).toString())) {
continue;
}
CoPINode coPINode;
RDFNode coPIURLNode = solution.get(QueryFieldLabels.CO_PI_URL);
if (nodeURLToVO.containsKey(coPIURLNode.toString())) {
coPINode = nodeURLToVO.get(coPIURLNode.toString());
} else {
coPINode = new CoPINode(coPIURLNode.toString(), nodeIDGenerator);
nodes.add(coPINode);
nodeURLToVO.put(coPIURLNode.toString(), coPINode);
RDFNode coPILabelNode = solution.get(QueryFieldLabels.CO_PI_LABEL);
if (coPILabelNode != null) {
coPINode.setNodeName(coPILabelNode.toString());
}
}
coPINode.addGrant(grant);
Set<CoPINode> coPIsForCurrentGrant;
if (grantURLToCoPIs.containsKey(grant.getGrantURL())) {
coPIsForCurrentGrant = grantURLToCoPIs
.get(grant.getGrantURL());
} else {
coPIsForCurrentGrant = new HashSet<CoPINode>();
grantURLToCoPIs.put(grant.getGrantURL(),
coPIsForCurrentGrant);
}
coPIsForCurrentGrant.add(coPINode);
CoPIEdge egoCoPIEdge = getExistingEdge(egoNode, coPINode, edgeUniqueIdentifierToVO);
/*
* If "egoCoPIEdge" is null it means that no edge exists in between the egoNode
* & current coPINode. Else create a new edge, add it to the edges set & add
* the collaborator grant to it.
* */
if (egoCoPIEdge != null) {
egoCoPIEdge.addCollaboratorGrant(grant);
} else {
egoCoPIEdge = new CoPIEdge(egoNode, coPINode, grant, edgeIDGenerator);
edges.add(egoCoPIEdge);
edgeUniqueIdentifierToVO.put(
getEdgeUniqueIdentifier(egoNode.getNodeID(),
coPINode.getNodeID()),
egoCoPIEdge);
}
}
/*
* This method takes out all the PIs & edges between PIs that belong to grants
* that have more than 100 PIs. We conjecture that these grants do not provide much
* insight. However, we have left the grants be.
*
* This method side-effects "nodes" & "edges".
* */
removeLowQualityNodesAndEdges(nodes,
grantURLToVO,
grantURLToCoPIs,
edges);
/*
* We need to create edges between 2 co-PIs. E.g. On a grant there were 3 PI
* ego, A & B then we have already created edges like,
* ego - A
* ego - B
* The below sub-routine will take care of,
* A - B
*
* We are side-effecting "edges" here. The only reason to do this is because we are adding
* edges en masse for all the co-PIs on all the grants considered so far. The
* other reason being we dont want to compare against 2 sets of edges (edges created before
* & co-PI edges created during the course of this method) when we are creating a new
* edge.
* */
createCoPIEdges(grantURLToVO,
grantURLToCoPIs,
edges,
edgeUniqueIdentifierToVO);
return new CoPIData(egoNode, nodes, edges);
}
private void createCoPIEdges(Map<String, Grant> grantURLToVO,
Map<String, Set<CoPINode>> grantURLToCoPIs, Set<CoPIEdge> edges,
Map<String, CoPIEdge> edgeUniqueIdentifierToVO) {
for (Map.Entry<String, Set<CoPINode>> currentGrantEntry
: grantURLToCoPIs.entrySet()) {
/*
* If there was only one co-PI (other than ego) then we dont have to create any
* edges. so the below condition will take care of that.
*
* We are restricting edges between co-PI if a particular grant has more than
* 100 co-PIs. Our conjecture is that such edges do not provide any good insight
* & causes unnecessary computations causing the server to time-out.
* */
if (currentGrantEntry.getValue().size() > 1
&& currentGrantEntry.getValue().size()
<= MAX_PI_PER_GRANT_ALLOWED) {
Set<CoPIEdge> newlyAddedEdges = new HashSet<CoPIEdge>();
/*
* In order to leverage the nested "for loop" for making edges between all the
* co-PIs we need to create a list out of the set first.
* */
List<CoPINode> coPINodes = new ArrayList<CoPINode>(currentGrantEntry.getValue());
Collections.sort(coPINodes, new CoPINodeComparator());
int numOfCoPIs = coPINodes.size();
for (int ii = 0; ii < numOfCoPIs - 1; ii++) {
for (int jj = ii + 1; jj < numOfCoPIs; jj++) {
CoPINode coPI1 = coPINodes.get(ii);
CoPINode coPI2 = coPINodes.get(jj);
CoPIEdge coPI1_2Edge = getExistingEdge(coPI1,
coPI2,
edgeUniqueIdentifierToVO);
Grant currentGrant = grantURLToVO.get(currentGrantEntry.getKey());
if (coPI1_2Edge != null) {
coPI1_2Edge.addCollaboratorGrant(currentGrant);
} else {
coPI1_2Edge = new CoPIEdge(coPI1,
coPI2,
currentGrant,
edgeIDGenerator);
newlyAddedEdges.add(coPI1_2Edge);
edgeUniqueIdentifierToVO.put(
getEdgeUniqueIdentifier(coPI1.getNodeID(),
coPI2.getNodeID()),
coPI1_2Edge);
}
}
}
edges.addAll(newlyAddedEdges);
}
}
}
private void removeLowQualityNodesAndEdges(Set<CoPINode> nodes,
Map<String, Grant> grantURLToVO,
Map<String, Set<CoPINode>> grantURLToCoPIs, Set<CoPIEdge> edges) {
Set<CoPINode> nodesToBeRemoved = new HashSet<CoPINode>();
for (Map.Entry<String, Set<CoPINode>> currentGrantEntry
: grantURLToCoPIs.entrySet()) {
if (currentGrantEntry.getValue().size() > MAX_PI_PER_GRANT_ALLOWED) {
Grant currentGrant = grantURLToVO.get(currentGrantEntry.getKey());
Set<CoPIEdge> edgesToBeRemoved = new HashSet<CoPIEdge>();
for (CoPIEdge currentEdge : edges) {
Set<Grant> currentCollaboratorGrants =
currentEdge.getCollaboratorGrants();
if (currentCollaboratorGrants.contains(currentGrant)) {
currentCollaboratorGrants.remove(currentGrant);
if (currentCollaboratorGrants.isEmpty()) {
edgesToBeRemoved.add(currentEdge);
}
}
}
edges.removeAll(edgesToBeRemoved);
for (CoPINode currentCoPI : currentGrantEntry.getValue()) {
currentCoPI.getInvestigatedGrants().remove(currentGrant);
if (currentCoPI.getInvestigatedGrants().isEmpty()) {
nodesToBeRemoved.add(currentCoPI);
}
}
}
}
nodes.removeAll(nodesToBeRemoved);
}
private Grant createGrantVO(QuerySolution solution, String grantURL) {
Grant grant = new Grant(grantURL);
RDFNode grantLabelNode = solution.get(QueryFieldLabels.GRANT_LABEL);
if (grantLabelNode != null) {
grant.setIndividualLabel(grantLabelNode.toString());
}
RDFNode grantStartYear = solution.get(QueryFieldLabels.GRANT_START_DATE);
if (grantStartYear != null) {
grant.setGrantStartDate(grantStartYear.toString());
}
RDFNode grantEndDate = solution.get(QueryFieldLabels
.GRANT_END_DATE);
if (grantEndDate != null) {
grant.setGrantEndDate(grantEndDate.toString());
}
return grant;
}
}

View file

@ -0,0 +1,240 @@
package edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
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.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPINode;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler;
public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler{
public void generateVisualization(VitroRequest vitroRequest, HttpServletRequest request, HttpServletResponse response, Log log, DataSource dataSource){
String egoURI = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_KEY);
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_KEY);
QueryRunner<CoPIData> queryManager = new CoPIGrantCountQueryRunner(egoURI, dataSource, log);
try{
CoPIData PINodesAndEdges = queryManager.getQueryResult();
if (VisualizationFrameworkConstants.DATA_RENDER_MODE
.equalsIgnoreCase(renderMode)) {
if (VisualizationFrameworkConstants.COPI_VIS_MODE
.equalsIgnoreCase(visMode)) {
prepareCoPIDataResponse(PINodesAndEdges, response);
return;
} else {
/*
* When the graphML file is required - based on which copi network
* visualization will be rendered.
* */
prepareNetworkDataResponse(PINodesAndEdges, response);
return;
}
}else {
RequestDispatcher requestDispatcher = null;
prepareStandaloneResponse(
egoURI,
PINodesAndEdges,
vitroRequest,
request);
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_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 {
UtilityFunctions.handleMalformedParameters(
e.getMessage(),
"Visualization Query Error - Co-authorship Network",
vitroRequest,
request,
response,
log);
} catch (ServletException e1) {
log.error(e1.getStackTrace());
} catch (IOException e1) {
log.error(e1.getStackTrace());
}
return;
}
}
/**
* When the page for person level visualization is requested.
* @param egoURI
* @param coPIVO
* @param vitroRequest
* @param request
*/
private void prepareStandaloneResponse(String egoURI,
CoPIData pINodesAndEdges, VitroRequest vitroRequest,
HttpServletRequest request) {
Portal portal = vitroRequest.getPortal();
request.setAttribute("egoURIParam", egoURI);
String title = "";
if (pINodesAndEdges.getNodes() != null
&& pINodesAndEdges.getNodes().size() > 0) {
request.setAttribute("numOfAuthors", pINodesAndEdges.getNodes()
.size());
title = pINodesAndEdges.getEgoNode().getNodeName() + " - ";
}
if (pINodesAndEdges.getEdges() != null
&& pINodesAndEdges.getEdges().size() > 0) {
request.setAttribute("numOfCoPIs", pINodesAndEdges
.getEdges().size());
}
request.setAttribute("title", title + "Co-PI Visualization");
request.setAttribute("portalBean", portal);
request.setAttribute("scripts",
"/templates/visualization/person_level_inject_head.jsp");
request.setAttribute("bodyJsp",
"/templates/visualization/co_authorship.jsp");
}
/**
* Provides a response when graphml formatted co-pi network is requested, typically by
* the flash vis.
* @param pINodesAndEdges
* @param response
*/
private void prepareNetworkDataResponse(CoPIData pINodesAndEdges,
HttpServletResponse response) {
response.setContentType("text/xml");
try {
PrintWriter responseWriter = response.getWriter();
/*
* We are side-effecting responseWriter since we are directly manipulating the response
* object of the servlet.
* */
CoPIGraphMLWriter coPIGraphMLWriter =
new CoPIGraphMLWriter(pINodesAndEdges);
responseWriter.append(coPIGraphMLWriter.getCoPIGraphMLContent());
responseWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Provides response when a csv file containing number & names of unique co-pis per
* year is requested.
* @param pINodesAndEdges
* @param response
*/
private void prepareCoPIDataResponse(CoPIData pINodesAndEdges,
HttpServletResponse response) {
String outputFileName;
Map<String, Set<CoPINode>> yearToCoPI = new TreeMap<String, Set<CoPINode>>();
if (pINodesAndEdges.getNodes() != null && pINodesAndEdges.getNodes().size() > 0) {
outputFileName = UtilityFunctions.slugify(pINodesAndEdges
.getEgoNode().getNodeName())
+ "_copis-per-year" + ".csv";
yearToCoPI = UtilityFunctions.getGrantYearToCoPI(pINodesAndEdges);
} else {
outputFileName = "no_copis-per-year" + ".csv";
}
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.
* */
writeCoPIsPerYearCSV(yearToCoPI, responseWriter);
responseWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeCoPIsPerYearCSV(Map<String, Set<CoPINode>> yearToCoPI,
PrintWriter responseWriter) {
responseWriter.append("Year, Count, Co-PI(s)\n");
for (Map.Entry<String, Set<CoPINode>> currentEntry : yearToCoPI.entrySet()) {
responseWriter.append("\"" + currentEntry.getKey() + "\","
+ "\"" + currentEntry.getValue().size() + "\","
+ "\"" + getCoPINamesAsString(currentEntry.getValue())
+ "\"\n");
}
}
private String getCoPINamesAsString(Set<CoPINode> CoPIs) {
StringBuilder coPIsMerged = new StringBuilder();
String coPISeparator = ";";
for(CoPINode currentCoPI : CoPIs){
coPIsMerged.append(currentCoPI.getNodeName() + coPISeparator);
}
return StringUtils.removeEnd(coPIsMerged.toString(), coPISeparator);
}
}

View file

@ -0,0 +1,324 @@
package edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator;
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.valueobjects.CoPIData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIEdge;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPINode;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.Map;
public class CoPIGraphMLWriter {
private StringBuilder coPIGraphMLContent;
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"
+ " http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n\n";
private final String GRAPHML_FOOTER = "</graphml>";
public CoPIGraphMLWriter(CoPIData coPIData){
coPIGraphMLContent = createCoPIGraphMLContent(coPIData);
}
private StringBuilder createCoPIGraphMLContent(CoPIData coPIData) {
StringBuilder graphMLContent = new StringBuilder();
graphMLContent.append(GRAPHML_HEADER);
/*
* We are side-effecting "graphMLContent" object in this method since creating
* another String object to hold key definition data will be redundant & will
* not serve the purpose.
* */
generateKeyDefinitionContent(coPIData, graphMLContent);
/*
* Used to generate graph content. It will contain both the nodes & edge information.
* We are side-effecting "graphMLContent".
* */
generateGraphContent(coPIData, graphMLContent);
graphMLContent.append(GRAPHML_FOOTER);
return graphMLContent;
}
public StringBuilder getCoPIGraphMLContent(){
return coPIGraphMLContent;
}
private void generateGraphContent(CoPIData coPIData,
StringBuilder graphMLContent) {
graphMLContent.append("\n<graph edgedefault=\"undirected\">\n");
if (coPIData.getNodes() != null & coPIData.getNodes().size() > 0) {
generateNodeSectionContent(coPIData, graphMLContent);
}
if (coPIData.getEdges() != null & coPIData.getEdges().size() > 0) {
generateEdgeSectionContent(coPIData, graphMLContent);
}
graphMLContent.append("</graph>\n");
}
private void generateEdgeSectionContent(CoPIData coPIData,
StringBuilder graphMLContent) {
graphMLContent.append("<!-- edges -->\n");
Set<CoPIEdge> edges = coPIData.getEdges();
List<CoPIEdge> orderedEdges = new ArrayList<CoPIEdge>(edges);
Collections.sort(orderedEdges, new CoPIEdgeComparator());
for (CoPIEdge currentEdge : orderedEdges) {
/*
* This method actually creates the XML code for a single edge. "graphMLContent"
* is being side-effected.
* */
getEdgeContent(graphMLContent, currentEdge);
}
}
private void getEdgeContent(StringBuilder graphMLContent, CoPIEdge currentEdge) {
graphMLContent.append("<edge "
+ "id=\"" + currentEdge.getEdgeID() + "\" "
+ "source=\"" + currentEdge.getSourceNode().getNodeID() + "\" "
+ "target=\"" + currentEdge.getTargetNode().getNodeID() + "\" "
+ ">\n");
graphMLContent.append("\t<data key=\"collaborator1\">"
+ currentEdge.getSourceNode().getNodeName()
+ "</data>\n");
graphMLContent.append("\t<data key=\"collaborator2\">"
+ currentEdge.getTargetNode().getNodeName()
+ "</data>\n");
graphMLContent.append("\t<data key=\"number_of_coinvestigated_grants\">"
+ currentEdge.getNumberOfCoInvestigatedGrants()
+ "</data>\n");
if (currentEdge.getEarliestCollaborationYearCount() != null) {
/*
* There is no clean way of getting the map contents in java even though
* we are sure to have only one entry on the map. So using the for loop.
* */
for (Map.Entry<String, Integer> publicationInfo
: currentEdge.getEarliestCollaborationYearCount().entrySet()) {
graphMLContent.append("\t<data key=\"earliest_collaboration\">"
+ publicationInfo.getKey()
+ "</data>\n");
graphMLContent.append("\t<data key=\"num_earliest_collaboration\">"
+ publicationInfo.getValue()
+ "</data>\n");
}
}
if (currentEdge.getLatestCollaborationYearCount() != null) {
for (Map.Entry<String, Integer> publicationInfo
: currentEdge.getLatestCollaborationYearCount().entrySet()) {
graphMLContent.append("\t<data key=\"latest_collaboration\">"
+ publicationInfo.getKey()
+ "</data>\n");
graphMLContent.append("\t<data key=\"num_latest_collaboration\">"
+ publicationInfo.getValue()
+ "</data>\n");
}
}
if (currentEdge.getUnknownCollaborationYearCount() != null) {
graphMLContent.append("\t<data key=\"num_unknown_collaboration\">"
+ currentEdge.getUnknownCollaborationYearCount()
+ "</data>\n");
}
graphMLContent.append("</edge>\n");
}
private void generateNodeSectionContent(CoPIData coPIData,
StringBuilder graphMLContent) {
graphMLContent.append("<!-- nodes -->\n");
CoPINode egoNode = coPIData.getEgoNode();
Set<CoPINode> piNodes = coPIData.getNodes();
/*
* This method actually creates the XML code for a single node. "graphMLContent"
* is being side-effected. The egoNode is added first because this is the "requirement"
* of the co-pi vis. Ego should always come first.
*
* */
getNodeContent(graphMLContent, egoNode);
List<CoPINode> orderedPINodes = new ArrayList<CoPINode>(piNodes);
orderedPINodes.remove(egoNode);
Collections.sort(orderedPINodes, new CoPINodeComparator());
for (CoPINode currNode : orderedPINodes) {
/*
* We have already printed the Ego Node info.
* */
if (currNode != egoNode) {
getNodeContent(graphMLContent, currNode);
}
}
}
private void getNodeContent(StringBuilder graphMLContent, CoPINode node) {
String profileURL = null;
try {
profileURL = VisualizationFrameworkConstants.INDIVIDUAL_URL_PREFIX + "?"
+ VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY
+ "=" + URLEncoder.encode(node.getNodeURI(),
VisualizationController
.URL_ENCODING_SCHEME).toString();
} catch (UnsupportedEncodingException e) {
System.err.println("URL Encoding Error. Move this to use log.error ASAP");
}
graphMLContent.append("<node id=\"" + node.getNodeID() + "\">\n");
graphMLContent.append("\t<data key=\"url\">" + node.getNodeURI() + "</data>\n");
graphMLContent.append("\t<data key=\"label\">" + node.getNodeName() + "</data>\n");
if (profileURL != null) {
graphMLContent.append("\t<data key=\"profile_url\">" + profileURL + "</data>\n");
}
graphMLContent.append("\t<data key=\"number_of_investigated_grants\">"
+ node.getNumberOfInvestigatedGrants()
+ "</data>\n");
if (node.getEarliestGrantYearCount() != null) {
/*
* There is no clean way of getting the map contents in java even though
* we are sure to have only one entry on the map. So using the for loop.
* I am feeling dirty just about now.
* */
for (Map.Entry<String, Integer> publicationInfo
: node.getEarliestGrantYearCount().entrySet()) {
graphMLContent.append("\t<data key=\"earliest_grant\">"
+ publicationInfo.getKey()
+ "</data>\n");
graphMLContent.append("\t<data key=\"num_earliest_grant\">"
+ publicationInfo.getValue()
+ "</data>\n");
}
}
if (node.getLatestGrantYearCount() != null) {
for (Map.Entry<String, Integer> publicationInfo
: node.getLatestGrantYearCount().entrySet()) {
graphMLContent.append("\t<data key=\"latest_grant\">"
+ publicationInfo.getKey()
+ "</data>\n");
graphMLContent.append("\t<data key=\"num_latest_grant\">"
+ publicationInfo.getValue()
+ "</data>\n");
}
}
if (node.getUnknownGrantYearCount() != null) {
graphMLContent.append("\t<data key=\"num_unknown_grant\">"
+ node.getUnknownGrantYearCount()
+ "</data>\n");
}
graphMLContent.append("</node>\n");
}
private void generateKeyDefinitionContent(CoPIData coPIData,
StringBuilder graphMLContent) {
/*
* Generate the key definition content for node.
* */
getKeyDefinitionFromSchema(coPIData.getNodeSchema(), graphMLContent);
/*
* Generate the key definition content for edge.
* */
getKeyDefinitionFromSchema(coPIData.getEdgeSchema(), graphMLContent);
}
private void getKeyDefinitionFromSchema(Set<Map<String, String>> schema,
StringBuilder graphMLContent) {
for (Map<String, String> currentNodeSchemaAttribute : schema) {
graphMLContent.append("\n<key ");
for (Map.Entry<String, String> currentAttributeKey
: currentNodeSchemaAttribute.entrySet()) {
graphMLContent.append(currentAttributeKey.getKey()
+ "=\"" + currentAttributeKey.getValue()
+ "\" ");
}
if (currentNodeSchemaAttribute.containsKey("default")) {
graphMLContent.append(">\n");
graphMLContent.append("<default>");
graphMLContent.append(currentNodeSchemaAttribute.get("default"));
graphMLContent.append("</default>\n");
graphMLContent.append("</key>\n");
} else {
graphMLContent.append("/>\n");
}
}
}
}

View file

@ -0,0 +1,17 @@
package edu.cornell.mannlib.vitro.webapp.visualization.coprincipalinvestigator;
import java.util.Comparator;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPINode;
/**
* This Comparator is used to sort the CoPINodes based on their IDs in ascending order.
* @author bkoniden
*/
public class CoPINodeComparator implements Comparator<CoPINode>{
@Override
public int compare(CoPINode arg0, CoPINode arg1) {
return arg0.getNodeID() - arg1.getNodeID();
}
}

View file

@ -0,0 +1,280 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.entitycomparison;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.hp.hpl.jena.iri.IRI;
import com.hp.hpl.jena.iri.IRIFactory;
import com.hp.hpl.jena.iri.Violation;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
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.Entity;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.SubEntity;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
/**
* This query runner is used to execute a sparql query that will fetch all the
* publications defined by bibo:Document property for a particular
* department/school/university.
*
* @author bkoniden
*/
public class EntityPublicationCountQueryRunner implements QueryRunner<Entity> {
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
private String entityURI;
private DataSource dataSource;
private Log log;
private String visMode;
private static final String SPARQL_QUERY_COMMON_SELECT_CLAUSE = ""
+ " (str(?Person) as ?personLit) "
+ " (str(?PersonLabel) as ?personLabelLit) "
+ " (str(?SecondaryPositionLabel) as ?SecondaryPositionLabelLit)"
+ " (str(?Document) as ?documentLit) "
+ " (str(?DocumentLabel) as ?documentLabelLit) "
+ " (str(?publicationYear) as ?publicationYearLit) "
+ " (str(?publicationYearMonth) as ?publicationYearMonthLit) "
+ " (str(?publicationDate) as ?publicationDateLit) "
+ " (str(?StartYear) as ?StartYearLit)";
private static final String SPARQL_QUERY_COMMON_WHERE_CLAUSE = ""
+ "?Document rdf:type bibo:Document ;"
+ " rdfs:label ?DocumentLabel ."
+ "OPTIONAL { ?Document core:year ?publicationYear } ."
+ "OPTIONAL { ?Document core:yearMonth ?publicationYearMonth } ."
+ "OPTIONAL { ?Document core:date ?publicationDate } ."
+ "OPTIONAL { ?SecondaryPosition core:startYear ?StartYear } .";
private static String ENTITY_LABEL;
private static String ENTITY_URL;
private static String SUBENTITY_LABEL;
private static String SUBENTITY_URL;
public EntityPublicationCountQueryRunner(String entityURI,
DataSource dataSource, Log log, String visMode) {
this.entityURI = entityURI;
this.dataSource = dataSource;
this.log = log;
this.visMode = visMode;
}
private Entity createJavaValueObjects(ResultSet resultSet) {
Entity entity = null;
Map<String, BiboDocument> biboDocumentURLToVO = new HashMap<String, BiboDocument>();
Map<String, SubEntity> subentityURLToVO = new HashMap<String, SubEntity>();
while (resultSet.hasNext()) {
QuerySolution solution = resultSet.nextSolution();
if (entity == null) {
entity = new Entity(solution.get(ENTITY_URL).toString(),
solution.get(ENTITY_LABEL).toString());
}
RDFNode documentNode = solution.get(QueryFieldLabels.DOCUMENT_URL);
BiboDocument biboDocument;
if (biboDocumentURLToVO.containsKey(documentNode.toString())) {
biboDocument = biboDocumentURLToVO.get(documentNode.toString());
} else {
biboDocument = new BiboDocument(documentNode.toString());
biboDocumentURLToVO.put(documentNode.toString(), biboDocument);
RDFNode documentLabelNode = solution
.get(QueryFieldLabels.DOCUMENT_LABEL);
if (documentLabelNode != null) {
biboDocument.setDocumentLabel(documentLabelNode.toString());
}
RDFNode publicationYearNode = solution
.get(QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR);
if (publicationYearNode != null) {
biboDocument.setPublicationYear(publicationYearNode
.toString());
}
RDFNode publicationYearMonthNode = solution
.get(QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR_MONTH);
if (publicationYearMonthNode != null) {
biboDocument
.setPublicationYearMonth(publicationYearMonthNode
.toString());
}
RDFNode publicationDateNode = solution
.get(QueryFieldLabels.DOCUMENT_PUBLICATION_DATE);
if (publicationDateNode != null) {
biboDocument.setPublicationDate(publicationDateNode
.toString());
}
}
RDFNode subEntityURLNode = solution.get(SUBENTITY_URL);
if (subEntityURLNode != null) {
SubEntity subEntity;
if (subentityURLToVO.containsKey(subEntityURLNode.toString())) {
subEntity = subentityURLToVO.get(subEntityURLNode
.toString());
} else {
subEntity = new SubEntity(subEntityURLNode.toString());
subentityURLToVO
.put(subEntityURLNode.toString(), subEntity);
}
RDFNode subEntityLabelNode = solution.get(SUBENTITY_LABEL);
if (subEntityLabelNode != null) {
subEntity.setIndividualLabel(subEntityLabelNode.toString());
}
entity.addSubEntity(subEntity);
subEntity.addPublications(biboDocument);
}
entity.addPublications(biboDocument);
}
return entity;
}
private ResultSet executeQuery(String queryURI, DataSource dataSource) {
QueryExecution queryExecution = null;
try {
Query query = QueryFactory.create(
getSparqlQuery(queryURI, this.visMode), SYNTAX);
queryExecution = QueryExecutionFactory.create(query, dataSource);
if (query.isSelectType()) {
return queryExecution.execSelect();
}
} finally {
if (queryExecution != null) {
queryExecution.close();
}
}
return null;
}
private String getSparqlQuery(String queryURI, String visMode) {
String result = "";
if (visMode.equals("DEPARTMENT")) {
result = getSparqlQueryForDepartment(queryURI);
ENTITY_URL = QueryFieldLabels.DEPARTMENT_URL;
ENTITY_LABEL = QueryFieldLabels.DEPARTMENT_LABEL;
SUBENTITY_URL = QueryFieldLabels.PERSON_URL;
SUBENTITY_LABEL = QueryFieldLabels.PERSON_LABEL;
} else {
result = getSparqlQueryForOrganization(queryURI);
ENTITY_URL = QueryFieldLabels.ORGANIZATION_URL;
ENTITY_LABEL = QueryFieldLabels.ORGANIZATION_LABEL;
SUBENTITY_URL = QueryFieldLabels.SUBORGANIZATION_URL;
SUBENTITY_LABEL = QueryFieldLabels.SUBORGANIZATION_LABEL;
}
return result;
}
private String getSparqlQueryForDepartment(String queryURI) {
String sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT (str(?DepartmentLabel) as ?departmentLabelLit) "
+ SPARQL_QUERY_COMMON_SELECT_CLAUSE + " (str(<" + queryURI
+ ">) as ?" + QueryFieldLabels.DEPARTMENT_URL + ") "
+ "WHERE { " + "<" + queryURI + "> rdf:type core:Department ;"
+ " rdfs:label ?DepartmentLabel ;"
+ " core:organizationForPosition ?Position . "
+ " ?Position rdf:type core:Position ;"
+ " core:positionForPerson ?Person . "
+ " ?Person core:authorInAuthorship ?Resource ; "
+ " rdfs:label ?PersonLabel ; core:personInPosition ?SecondaryPosition . "
+ " ?Resource core:linkedInformationResource ?Document ."
+ " ?SecondaryPosition rdfs:label ?SecondaryPositionLabel ."
+ SPARQL_QUERY_COMMON_WHERE_CLAUSE + "}"
+ " ORDER BY ?DocumentLabel";
System.out.println("\nThe sparql query is :\n" + sparqlQuery);
return sparqlQuery;
}
private String getSparqlQueryForOrganization(String queryURI) {
String sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT (str(?organizationLabel) as ?organizationLabelLit) "
+ " (str(?subOrganization) as ?subOrganizationLit) "
+ " (str(?subOrganizationLabel) as ?subOrganizationLabelLit) "
+ SPARQL_QUERY_COMMON_SELECT_CLAUSE + " (str(<" + queryURI
+ ">) as ?" + QueryFieldLabels.ORGANIZATION_URL + ") "
+ "WHERE { " + "<" + queryURI + "> rdf:type foaf:Organization ;"
+ " rdfs:label ?organizationLabel ;"
+ " core:hasSubOrganization ?subOrganization ."
+ " ?subOrganization rdfs:label ?subOrganizationLabel ;"
+ " core:organizationForPosition ?Position . "
+ " ?Position rdf:type core:Position ;"
+ " core:positionForPerson ?Person . "
+ " ?Person core:authorInAuthorship ?Resource ; "
+ " rdfs:label ?PersonLabel ; core:personInPosition ?SecondaryPosition . "
+ " ?Resource core:linkedInformationResource ?Document ."
+ " ?SecondaryPosition rdfs:label ?SecondaryPositionLabel ."
+ SPARQL_QUERY_COMMON_WHERE_CLAUSE + "}"
+ " ORDER BY ?DocumentLabel";
System.out.println("\nThe sparql query is :\n" + sparqlQuery);
return sparqlQuery;
}
public Entity getQueryResult() throws MalformedQueryParametersException {
if (StringUtils.isNotBlank(this.entityURI)) {
/*
* To test for the validity of the URI submitted.
*/
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
IRI iri = iRIFactory.create(this.entityURI);
if (iri.hasViolation(false)) {
String errorMsg = ((Violation) iri.violations(false).next())
.getShortMessage();
log.error("Entity Comparison vis Query " + errorMsg);
throw new MalformedQueryParametersException(
"URI provided for an entity is malformed.");
}
} else {
throw new MalformedQueryParametersException(
"URL parameter is either null or empty.");
}
ResultSet resultSet = executeQuery(this.entityURI, this.dataSource);
return createJavaValueObjects(resultSet);
}
}

View file

@ -0,0 +1,304 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.entitycomparison;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
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.google.gson.Gson;
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.visualization.constants.VOConstants;
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.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Entity;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.JsonObject;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.SubEntity;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler;
public class EntityPublicationCountRequestHandler implements
VisualizationRequestHandler {
/*
* Vis container holds the "id" of the div on the final response html page
* that the visualization actually appears on.
*/
public static String ENTITY_VIS_MODE;
public static String SUB_ENTITY_VIS_MODE;
@SuppressWarnings("null")
public void generateVisualization(VitroRequest vitroRequest,
HttpServletRequest request, HttpServletResponse response, Log log,
DataSource dataSource) {
String entityURI = vitroRequest
.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
String renderMode = vitroRequest
.getParameter(VisualizationFrameworkConstants.RENDER_MODE_KEY);
ENTITY_VIS_MODE = vitroRequest
.getParameter(VisualizationFrameworkConstants.VIS_MODE_KEY);
String visContainer = vitroRequest
.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_KEY);
System.out
.println("\nInside EntityPublicationCountRequestHandler! \n----------------------------------------- ");
System.out.println("\nEntity URI: " + entityURI + "\nRender Mode: "
+ renderMode + "\nVis Mode: " + ENTITY_VIS_MODE
+ "\nVis Containter: " + visContainer);
QueryRunner<Entity> queryManager = new EntityPublicationCountQueryRunner(
entityURI, dataSource, log, ENTITY_VIS_MODE);
try {
Entity entity = queryManager.getQueryResult();
if (ENTITY_VIS_MODE.equals("DEPARTMENT")) {
SUB_ENTITY_VIS_MODE = "PERSON";
// System.out
// .println("\n\nDocuments within the Entity\n---------------------------------------------");
// for (BiboDocument document : entity.getPublications()) {
// System.out.println(document.getDocumentLabel() + " > "
// + document.getDocumentURL());
// }
//
// System.out
// .println("\n\nSubEntities within the Entity\n---------------------------------------------");
//
// for (SubEntity person : entity.getSubEntities()) {
// System.out.println(person.getIndividualLabel());
// }
}else if (ENTITY_VIS_MODE.equals("SCHOOL")) {
SUB_ENTITY_VIS_MODE = "DEPARTMENT";
// System.out
// .println("\nDocuments within the Entity\n---------------------------------------------");
// for (BiboDocument document : entity.getPublications()) {
// System.out.println(document.getDocumentLabel() + " > "
// + document.getDocumentURL());
// }
//
// System.out
// .println("\n\nSubEntities within the Entity\n---------------------------------------------");
// for (SubEntity department : entity.getSubEntities()) {
// System.out.println(department.getIndividualLabel());
// }
}else {
SUB_ENTITY_VIS_MODE = "SCHOOL";
// System.out
// .println("\nDocuments within the Entity\n---------------------------------------------");
// for (BiboDocument document : entity.getPublications()) {
// System.out.println(document.getDocumentLabel() + " > "
// + document.getDocumentURL());
// }
//
// System.out
// .println("\n\nSubEntities within the Entity\n---------------------------------------------");
//
// for (SubEntity school : entity.getSubEntities()) {
// System.out.println(school.getIndividualLabel());
//
// }
}
QueryRunner<Map<String, Set<String>>> queryManagerForsubOrganisationTypes = new EntitySubOrganizationTypesQueryRunner(
entityURI, dataSource, log, ENTITY_VIS_MODE);
Map<String, Set<String>> subOrganizationTypesResult = queryManagerForsubOrganisationTypes.getQueryResult();
System.out.println("Sub Organization Types With Their Labels \n------------------");
for(String label: subOrganizationTypesResult.keySet()){
System.out.println("Label :"+ label);
for(String type : subOrganizationTypesResult.get(label)){
System.out.println("type: "+ type);
}
System.out.println();
}
RequestDispatcher requestDispatcher = null;
if (VisualizationFrameworkConstants.DATA_RENDER_MODE
.equalsIgnoreCase(renderMode)) {
prepareDataResponse(entity, entity.getSubEntities(),subOrganizationTypesResult, response);
} else if (VisualizationFrameworkConstants.STANDALONE_RENDER_MODE
.equalsIgnoreCase(renderMode)) {
prepareStandaloneResponse(request, response, vitroRequest,
entity, subOrganizationTypesResult);
requestDispatcher = request
.getRequestDispatcher(Controllers.BASIC_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 {
UtilityFunctions
.handleMalformedParameters(
e.getMessage(),
"Visualization Query Error - Individual Publication Count",
vitroRequest, request, response, log);
} catch (ServletException e1) {
log.error(e1.getStackTrace());
} catch (IOException e1) {
log.error(e1.getStackTrace());
}
return;
}
}
/**
* Provides response when csv file containing the publication count over the
* years is requested.
*
* @param author
* @param subentities
* @param subOrganizationTypesResult
* @param yearToPublicationCount
* @param response
*/
private void prepareDataResponse(Entity entity, Set<SubEntity> subentities,
Map<String, Set<String>> subOrganizationTypesResult, HttpServletResponse response) {
String entityLabel = entity.getEntityLabel();
String outputFileName = UtilityFunctions.slugify(entityLabel)
+ "_publications-per-year" + ".json";
response.setContentType("text/plain");
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.
*/
responseWriter.append(writePublicationsOverTimeJSON(subentities, subOrganizationTypesResult));
responseWriter.flush();
responseWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Provides response when an entire page dedicated to publication sparkline
* is requested.
*
* @param request
* @param response
* @param vreq
* @param entity
* @param subOrganizationTypesResult
*/
private void prepareStandaloneResponse(HttpServletRequest request,
HttpServletResponse response, VitroRequest vreq, Entity entity, Map<String, Set<String>> subOrganizationTypesResult) {
Portal portal = vreq.getPortal();
String jsonContent = "";
/*
* We are side-effecting responseWriter since we are directly
* manipulating the response object of the servlet.
*/
jsonContent = writePublicationsOverTimeJSON(entity.getSubEntities(), subOrganizationTypesResult);
request.setAttribute("JsonContent", jsonContent);
request.setAttribute("bodyJsp",
"/templates/visualization/entity_comparison.jsp");
request.setAttribute("portalBean", portal);
request.setAttribute("title", "Entity Comparison visualization");
request.setAttribute("scripts",
"/templates/visualization/entity_comparison_inject_head.jsp");
}
/**
* function to generate a json file for year <-> publication count mapping
* @param subOrganizationTypesResult
*
* @param yearToPublicationCount
* @param responseWriter
* @param visMode
*/
private String writePublicationsOverTimeJSON(Set<SubEntity> subentities, Map<String, Set<String>> subOrganizationTypesResult) {
// System.out.println("\nsub entity vis mode ------>"
// + SUB_ENTITY_VIS_MODE + "\n");
System.out.println("Creating JSONObject \n-----------------------");
Gson json = new Gson();
Set<JsonObject> subEntitiesJson = new HashSet<JsonObject>();
for (SubEntity subentity : subentities) {
JsonObject entityJson = new JsonObject(
subentity.getIndividualLabel());
List<List<Integer>> yearPubCount = new ArrayList<List<Integer>>();
for (Map.Entry<String, Integer> pubEntry : UtilityFunctions
.getYearToPublicationCount(subentity.getDocuments())
.entrySet()) {
List<Integer> currentPubYear = new ArrayList<Integer>();
if (pubEntry.getKey().equals(
VOConstants.DEFAULT_PUBLICATION_YEAR))
currentPubYear.add(-1);
else
currentPubYear.add(Integer.parseInt(pubEntry.getKey()));
currentPubYear.add(pubEntry.getValue());
yearPubCount.add(currentPubYear);
}
entityJson.setYearToPublicationCount(yearPubCount);
entityJson.getOrganizationType().addAll(subOrganizationTypesResult.get(entityJson.getLabel()));
entityJson.setEntityURI(subentity.getIndividualURI());
entityJson.setVisMode(SUB_ENTITY_VIS_MODE);
System.out.println("Adding object with uri: "
+ entityJson.getEntityURI() + " vismode: "
+ entityJson.getVisMode() + " label: "
+ entityJson.getLabel() + " type: "
+ entityJson.getOrganizationType().toString());
subEntitiesJson.add(entityJson);
}
// System.out.println("\nStopWords are "+ EntitySubOrganizationTypesQueryRunner.stopWords.toString() + "\n");
return json.toJson(subEntitiesJson);
}
}

View file

@ -0,0 +1,216 @@
package edu.cornell.mannlib.vitro.webapp.visualization.entitycomparison;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.hp.hpl.jena.iri.IRI;
import com.hp.hpl.jena.iri.IRIFactory;
import com.hp.hpl.jena.iri.Violation;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner;
import java.util.Set;
import java.util.HashSet;
public class EntitySubOrganizationTypesQueryRunner implements QueryRunner<Map<String, Set<String>>> {
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
private String entityURI;
private DataSource dataSource;
private Log log;
private String visMode;
static String SUBORGANISATION_LABEL;
static String SUBORGANISATION_TYPE_LABEL;
// public static Map<String, Integer> subOrganizationTypesToCount = new HashMap<String, Integer>();
// public static Set<String> stopWords = new HashSet<String>();
// public static Set<String> subOrganizations = new HashSet<String>();
// public static Set<String> STOP_WORDS = new HashSet<String>() {
// {
// add("Person");
// add("Organization");
// }
// };
private static final String SPARQL_QUERY_SELECT_CLAUSE = ""
+ " (str(?organizationLabel) as ?"+QueryFieldLabels.ORGANIZATION_LABEL+") "
+ " (str(?subOrganizationLabel) as ?"+QueryFieldLabels.SUBORGANIZATION_LABEL+") "
+ " (str(?subOrganizationType) as ?"+QueryFieldLabels.SUBORGANIZATION_TYPE +")"
+ " (str(?subOrganizationTypeLabel) as ?"+QueryFieldLabels.SUBORGANIZATION_TYPE_LABEL+") ";
public EntitySubOrganizationTypesQueryRunner(String entityURI,
DataSource dataSource, Log log, String visMode){
this.entityURI = entityURI;
this.dataSource = dataSource;
this.log = log;
this.visMode = visMode;
// stopWords.clear();
// subOrganizations.clear();
// subOrganizationTypesToCount.clear();
}
private ResultSet executeQuery(String queryURI, DataSource dataSource) {
QueryExecution queryExecution = null;
try {
Query query = QueryFactory.create(
getSparqlQuery(queryURI), SYNTAX);
queryExecution = QueryExecutionFactory.create(query, dataSource);
if (query.isSelectType()) {
return queryExecution.execSelect();
}
} finally {
if (queryExecution != null) {
queryExecution.close();
}
}
return null;
}
private String getSparqlQuery(String queryURI) {
String sparqlQuery = "";
if (!this.visMode.equals("DEPARTMENT")) {
SUBORGANISATION_LABEL = QueryFieldLabels.SUBORGANIZATION_LABEL;
SUBORGANISATION_TYPE_LABEL = QueryFieldLabels.SUBORGANIZATION_TYPE_LABEL;
sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT "
+ SPARQL_QUERY_SELECT_CLAUSE
+ " WHERE { "
+ "<"
+ queryURI
+ "> rdf:type foaf:Organization ;"
+ " rdfs:label ?organizationLabel ;"
+ " core:hasSubOrganization ?subOrganization . "
+ " ?subOrganization rdfs:label ?subOrganizationLabel ;"
+ " rdf:type ?subOrganizationType . "
+ " ?subOrganizationType rdfs:label ?subOrganizationTypeLabel ."
+ "}";
System.out.println("\nThe sparql query is :\n" + sparqlQuery);
} else{
SUBORGANISATION_LABEL = QueryFieldLabels.PERSON_LABEL;
SUBORGANISATION_TYPE_LABEL = QueryFieldLabels.PERSON_TYPE_LABEL;
sparqlQuery = QueryConstants.getSparqlPrefixQuery()
+ "SELECT "
+ " (str(?departmentLabel) as ?"+QueryFieldLabels.DEPARTMENT_LABEL+") "
+ " (str(?personLabel) as ?"+QueryFieldLabels.PERSON_LABEL+") "
+ " (str(?personType) as ?"+QueryFieldLabels.PERSON_TYPE +")"
+ " (str(?personTypeLabel) as ?"+QueryFieldLabels.PERSON_TYPE_LABEL+") "
+ " WHERE { "
+ "<"
+ queryURI
+ "> rdf:type core:Department ;"
+ " rdfs:label ?departmentLabel ;"
+ " core:organizationForPosition ?position . "
+ " ?position rdf:type core:Position ; core:positionForPerson ?person . "
+ " ?person rdfs:label ?personLabel ;"
+ " rdf:type ?personType . "
+ " ?personType rdfs:label ?personTypeLabel ."
+ "}";;
}
return sparqlQuery;
}
private Map<String, Set<String>> createJavaValueObjects(ResultSet resultSet) {
Map<String, Set<String>> subOrganizationLabelToTypes = new HashMap<String, Set<String>>();
while(resultSet.hasNext()){
QuerySolution solution = resultSet.nextSolution();
RDFNode subOrganizationLabel = solution.get(SUBORGANISATION_LABEL);
if(subOrganizationLabelToTypes.containsKey(subOrganizationLabel.toString())){
RDFNode subOrganizationType = solution.get(SUBORGANISATION_TYPE_LABEL);
if(subOrganizationType != null){
subOrganizationLabelToTypes.get(subOrganizationLabel.toString()).add(subOrganizationType.toString());
// updateSubOrganizationTypesToCount(subOrganizationType.toString());
// subOrganizations.add(subOrganizationLabel.toString());
}
}else{
RDFNode subOrganizationType = solution.get(SUBORGANISATION_TYPE_LABEL);
if(subOrganizationType != null){
subOrganizationLabelToTypes.put(subOrganizationLabel.toString(), new HashSet<String>());
subOrganizationLabelToTypes.get(subOrganizationLabel.toString()).add(subOrganizationType.toString());
// updateSubOrganizationTypesToCount(subOrganizationType.toString());
// subOrganizations.add(subOrganizationLabel.toString());
}
}
}
// collectStopWords();
return subOrganizationLabelToTypes;
}
// private void collectStopWords() {
// System.out.println("Inside collectStopWords \n-----------------------------\n");
// for(Map.Entry<String, Integer> typesCount : subOrganizationTypesToCount.entrySet()){
// System.out.println(typesCount.getKey() + ": "+ typesCount.getValue());
// if(typesCount.getValue() >= subOrganizations.size()){
// stopWords.add(typesCount.getKey());
// }
// }
// }
//
// private void updateSubOrganizationTypesToCount(String typeLabel) {
// int count = 0;
// if(subOrganizationTypesToCount.containsKey(typeLabel)){
// count = subOrganizationTypesToCount.get(typeLabel);
// subOrganizationTypesToCount.put(typeLabel, ++count);
// }else{
// subOrganizationTypesToCount.put(typeLabel, 1);
// }
// }
public Map<String, Set<String>> getQueryResult() throws MalformedQueryParametersException {
if (StringUtils.isNotBlank(this.entityURI)) {
/*
* To test for the validity of the URI submitted.
*/
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
IRI iri = iRIFactory.create(this.entityURI);
if (iri.hasViolation(false)) {
String errorMsg = ((Violation) iri.violations(false).next())
.getShortMessage();
log.error("Entity Comparison sub organization types query " + errorMsg);
throw new MalformedQueryParametersException(
"URI provided for an entity is malformed.");
}
} else {
throw new MalformedQueryParametersException(
"URL parameter is either null or empty.");
}
ResultSet resultSet = executeQuery(this.entityURI, this.dataSource);
return createJavaValueObjects(resultSet);
}
}

View file

@ -0,0 +1,53 @@
package edu.cornell.mannlib.vitro.webapp.visualization.freemarker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler;
public class VisTestController extends FreemarkerHttpServlet implements VisualizationRequestHandler {
private static final String TEMPLATE_DEFAULT = "vistest.ftl";
public void generateVisualization(VitroRequest vitroRequest, HttpServletRequest request, HttpServletResponse response, Log log, DataSource dataSource){
return;
}
@Override
protected ResponseValues processRequest(VitroRequest vitroRequest){
Portal portal = vitroRequest.getPortal();
Map<String, Object> body = new HashMap<String, Object>();
String egoURI = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_KEY);
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_KEY);
List<String> parameters = new ArrayList<String>();
parameters.add(egoURI);
parameters.add(renderMode);
parameters.add(visMode);
body.put("parameters", parameters);
body.put("title", getTitle("VIVO Vis"));
return new TemplateResponseValues(TEMPLATE_DEFAULT, body);
}
}

View file

@ -4,6 +4,8 @@ package edu.cornell.mannlib.vitro.webapp.visualization.personlevel;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
@ -332,7 +334,8 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
String uniqueCoauthorsSparklineVisContainer, String uniqueCoauthorsSparklineVisContainer,
VitroRequest vitroRequest, VitroRequest vitroRequest,
HttpServletRequest request) { HttpServletRequest request) {
String completeURL = "";
Portal portal = vitroRequest.getPortal(); Portal portal = vitroRequest.getPortal();
request.setAttribute("egoURIParam", egoURI); request.setAttribute("egoURIParam", egoURI);
@ -348,7 +351,14 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
} }
request.setAttribute("egoPubSparklineVO", egoPubSparklineVO); try {
completeURL = getCompleteURL(request);
} catch (MalformedURLException e) {
e.printStackTrace();
}
request.setAttribute("completeURL", completeURL);
request.setAttribute("egoPubSparklineVO", egoPubSparklineVO);
request.setAttribute("uniqueCoauthorsSparklineVO", uniqueCoauthorsSparklineVO); request.setAttribute("uniqueCoauthorsSparklineVO", uniqueCoauthorsSparklineVO);
request.setAttribute("egoPubSparklineContainerID", egoPubSparklineVisContainer); request.setAttribute("egoPubSparklineContainerID", egoPubSparklineVisContainer);
@ -360,4 +370,16 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
request.setAttribute("scripts", "/templates/visualization/person_level_inject_head.jsp"); request.setAttribute("scripts", "/templates/visualization/person_level_inject_head.jsp");
request.setAttribute("bodyJsp", "/templates/visualization/person_level.jsp"); request.setAttribute("bodyJsp", "/templates/visualization/person_level.jsp");
} }
private String getCompleteURL(HttpServletRequest request) throws MalformedURLException {
String file = request.getRequestURI();
System.out.println("getRequestURI() = "+ file + "getQueryString() ="+request.getQueryString()+ "getScheme() = "+ request.getScheme());
System.out.println("getServerName() = "+ request.getServerName() + "getServerPort() ="+request.getServerPort());
URL reconstructedURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), file);
return reconstructedURL.toString();
}
} }

View file

@ -0,0 +1,37 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.Set;
import java.util.HashSet;
public class Child extends Individual {
Set<BiboDocument> documents = new HashSet<BiboDocument>();
public Child(String individualURI) {
super(individualURI);
}
public Set<BiboDocument> getDocuments() {
return documents;
}
public Child(String individualURI, String individualLabel) {
super(individualURI, individualLabel);
}
@Override
public boolean equals(Object other){
boolean result = false;
if (other instanceof Child){
Child person = (Child) other;
result = (this.getIndividualLabel().equals(person.getIndividualLabel())
&& this.getIndividualURI().equals(person.getIndividualURI()));
}
return result;
}
@Override
public int hashCode(){
return(41*(getIndividualLabel().hashCode() + 41*(getIndividualURI().hashCode())));
}
}

View file

@ -0,0 +1,229 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class CoPIData {
private Set<CoPINode> nodes;
private Set<CoPIEdge> edges;
private CoPINode egoNode;
private Set<Map<String, String>> NODE_SCHEMA;
private Set<Map<String, String>> EDGE_SCHEMA;
public CoPIData(CoPINode egoNode, Set<CoPINode> nodes, Set<CoPIEdge> edges) {
this.egoNode = egoNode;
this.nodes = nodes;
this.edges = edges;
}
public Set<CoPINode> getNodes() {
return nodes;
}
public Set<CoPIEdge> getEdges() {
return edges;
}
public CoPINode getEgoNode() {
return egoNode;
}
/*
* Node Schema for graphML
* */
public Set<Map<String, String>> getNodeSchema() {
if (NODE_SCHEMA == null) {
NODE_SCHEMA = initializeNodeSchema();
}
return NODE_SCHEMA;
}
/*
* Edge Schema for graphML
* */
public Set<Map<String, String>> getEdgeSchema() {
if (EDGE_SCHEMA == null) {
EDGE_SCHEMA = initializeEdgeSchema();
}
return EDGE_SCHEMA;
}
private Set<Map<String, String>> initializeEdgeSchema() {
Set<Map<String, String>> edgeSchema = new HashSet<Map<String, String>>();
Map<String, String> schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "collaborator1");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "collaborator1");
schemaAttributes.put("attr.type", "string");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "collaborator2");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "collaborator2");
schemaAttributes.put("attr.type", "string");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "number_of_coinvestigated_grants");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "number_of_coinvestigated_grants");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "earliest_collaboration");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "earliest_collaboration");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_earliest_collaboration");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "num_earliest_collaboration");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "latest_collaboration");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "latest_collaboration");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_latest_collaboration");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "num_latest_collaboration");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_unknown_collaboration");
schemaAttributes.put("for", "edge");
schemaAttributes.put("attr.name", "num_unknown_collaboration");
schemaAttributes.put("attr.type", "int");
edgeSchema.add(schemaAttributes);
return edgeSchema;
}
private Set<Map<String, String>> initializeNodeSchema() {
Set<Map<String, String>> nodeSchema = new HashSet<Map<String, String>>();
Map<String, String> schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "url");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "url");
schemaAttributes.put("attr.type", "string");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "label");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "label");
schemaAttributes.put("attr.type", "string");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "profile_url");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "profile_url");
schemaAttributes.put("attr.type", "string");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "number_of_investigated_grants");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "number_of_investigated_grants");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "earliest_grant");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "earliest_grant");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_earliest_grant");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "num_earliest_grant");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "latest_grant");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "latest_grant");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_latest_grant");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "num_latest_grant");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
schemaAttributes = new LinkedHashMap<String, String>();
schemaAttributes.put("id", "num_unknown_grant");
schemaAttributes.put("for", "node");
schemaAttributes.put("attr.name", "num_unknown_grant");
schemaAttributes.put("attr.type", "int");
nodeSchema.add(schemaAttributes);
return nodeSchema;
}
}

View file

@ -0,0 +1,143 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
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.UtilityFunctions;
/**
* This stores edge information for Co-PI vis.
* @author bkoniden
*
*/
public class CoPIEdge {
private int edgeID;
private Map<String, Integer> yearToGrantCount;
private Set<Grant> collaboratorGrants = new HashSet<Grant>();
private CoPINode sourceNode;
private CoPINode targetNode;
public CoPIEdge(CoPINode sourceNode, CoPINode targetNode, Grant seedCoPIedGrant, UniqueIDGenerator uniqueIDGenerator){
edgeID = uniqueIDGenerator.getNextNumericID();
this.sourceNode = sourceNode;
this.targetNode = targetNode;
this.collaboratorGrants.add(seedCoPIedGrant);
}
public int getEdgeID() {
return edgeID;
}
public Set<Grant> getCollaboratorGrants() {
return collaboratorGrants;
}
public CoPINode getSourceNode() {
return sourceNode;
}
public CoPINode getTargetNode() {
return targetNode;
}
public int getNumberOfCoInvestigatedGrants(){
return collaboratorGrants.size();
}
public void addCollaboratorGrant(Grant grant){
this.collaboratorGrants.add(grant);
}
/*
* getEarliest, Latest & Unknown Grant YearCount should only be used after
* the parsing of the entire sparql is done. Else it will give results based on
* incomplete dataset.
* */
@SuppressWarnings("serial")
public Map<String, Integer> getEarliestCollaborationYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(collaboratorGrants);
}
/*
* We do not want to consider the default grant year when we are checking
* for the min or max grant year.
* */
Set<String> yearsToBeConsidered = new HashSet<String>(yearToGrantCount.keySet());
yearsToBeConsidered.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* There can be a case when the only publication the author has no attached year to it
* so essentially an "Unknown". In that case Collections.max or min will throw an
* NoSuchElementException.
*
* If there is no maximum year available then we should imply so by returning a "null".
* */
if (yearsToBeConsidered.size() > 0) {
final String earliestYear = Collections.min(yearsToBeConsidered);
final Integer earliestYearGrantCount = yearToGrantCount.get(earliestYear);
return new HashMap<String, Integer>() { {
put(earliestYear, earliestYearGrantCount);
} };
} else {
return null;
}
}
@SuppressWarnings("serial")
public Map<String, Integer> getLatestCollaborationYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(collaboratorGrants);
}
/*
* We do not want to consider the default grant year when we are checking
* for the min or max grant year.
* */
Set<String> yearsToBeConsidered = new HashSet<String>(yearToGrantCount.keySet());
yearsToBeConsidered.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* There can be a case when the only grant the PI has no attached year to it
* so essentially an "Unknown". In that case Collections.max or min will throw an
* NoSuchElementException.
*
* If there is no maximum year available then we should imply so by returning a "null".
* */
if (yearsToBeConsidered.size() > 0) {
final String latestYear = Collections.max(yearsToBeConsidered);
final Integer latestYearGrantCount = yearToGrantCount.get(latestYear);
return new HashMap<String, Integer>() { {
put(latestYear, latestYearGrantCount);
} };
} else {
return null;
}
}
public Integer getUnknownCollaborationYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(collaboratorGrants);
}
Integer unknownYearGrantCount = yearToGrantCount
.get(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* If there is no unknown year available then we should imply so by returning a "null".
* */
if (unknownYearGrantCount != null) {
return unknownYearGrantCount;
} else {
return null;
}
}
}

View file

@ -0,0 +1,152 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
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.UtilityFunctions;
/**
* CoPINode is the node in a CoPI vis.
* @author bkoniden
*/
public class CoPINode extends Individual {
private int nodeID;
private Map<String, Integer> yearToGrantCount;
private Set<Grant> pIGrants = new HashSet<Grant>();
public CoPINode(String nodeURI, UniqueIDGenerator uniqueIDGenerator){
super(nodeURI);
nodeID = uniqueIDGenerator.getNextNumericID();
}
public int getNodeID(){
return nodeID;
}
public String getNodeURI(){
return this.getIndividualURI();
}
public String getNodeName(){
return this.getIndividualLabel();
}
public void setNodeName(String nodeName) {
this.setIndividualLabel(nodeName);
}
public Set<Grant> getInvestigatedGrants(){
return pIGrants;
}
public int getNumberOfInvestigatedGrants(){
return pIGrants.size();
}
public void addGrant(Grant grant){
this.pIGrants.add(grant);
}
public Map<String, Integer> getYearToGrantCount(){
if(yearToGrantCount == null){
yearToGrantCount = UtilityFunctions.getYearToGrantCount(pIGrants);
}
return yearToGrantCount;
}
/*
* getEarliest, Latest & Unknown Grant YearCount should only be used after
* the parsing of the entire sparql is done. Else it will give results based on
* incomplete dataset.
* */
@SuppressWarnings("serial")
public Map<String, Integer> getEarliestGrantYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(pIGrants);
}
/*
* We do not want to consider the default grant year when we are checking
* for the min or max grant year.
* */
Set<String> yearsToBeConsidered = new HashSet<String>(yearToGrantCount.keySet());
yearsToBeConsidered.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* There can be a case when the only publication the author has no attached year to it
* so essentially an "Unknown". In that case Collections.max or min will throw an
* NoSuchElementException.
*
* If there is no maximum year available then we should imply so by returning a "null".
* */
if (yearsToBeConsidered.size() > 0) {
final String earliestYear = Collections.min(yearsToBeConsidered);
final Integer earliestYearGrantCount = yearToGrantCount.get(earliestYear);
return new HashMap<String, Integer>() { {
put(earliestYear, earliestYearGrantCount);
} };
} else {
return null;
}
}
@SuppressWarnings("serial")
public Map<String, Integer> getLatestGrantYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(pIGrants);
}
/*
* We do not want to consider the default grant year when we are checking
* for the min or max grant year.
* */
Set<String> yearsToBeConsidered = new HashSet<String>(yearToGrantCount.keySet());
yearsToBeConsidered.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* There can be a case when the only grant the PI has no attached year to it
* so essentially an "Unknown". In that case Collections.max or min will throw an
* NoSuchElementException.
*
* If there is no maximum year available then we should imply so by returning a "null".
* */
if (yearsToBeConsidered.size() > 0) {
final String latestYear = Collections.max(yearsToBeConsidered);
final Integer latestYearGrantCount = yearToGrantCount.get(latestYear);
return new HashMap<String, Integer>() { {
put(latestYear, latestYearGrantCount);
} };
} else {
return null;
}
}
public Integer getUnknownGrantYearCount() {
if (yearToGrantCount == null) {
yearToGrantCount = UtilityFunctions.getYearToGrantCount(pIGrants);
}
Integer unknownYearGrantCount = yearToGrantCount
.get(VOConstants.DEFAULT_PUBLICATION_YEAR);
/*
* If there is no unknown year available then we should imply so by returning a "null".
* */
if (unknownYearGrantCount != null) {
return unknownYearGrantCount;
} else {
return null;
}
}
}

View file

@ -0,0 +1,48 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.Set;
public class Department extends Individual{
Set<BiboDocument> publication;
Set<Person> person;
public Department(String departmentURI, String departmentLabel){
super(departmentURI, departmentLabel);
}
public void setDepartmentLabel(String departmentURI){
this.setIndividualLabel(departmentURI);
}
public String getDepartmentURI(){
return this.getIndividualURI();
}
public Set<BiboDocument> getPublication() {
return publication;
}
public String getDepartmentLabel(){
return this.getIndividualLabel();
}
public Set<Person> getPerson() {
return person;
}
public void addPublication(BiboDocument biboDocument) {
this.publication.add(biboDocument);
}
public void addPersons(Person person) {
this.person.add(person);
}
public void addPerson(Person person) {
this.person.add(person);
}
}

View file

@ -0,0 +1,45 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashSet;
import java.util.Set;
import java.util.LinkedHashSet;
public class Entity extends Individual{
Set<BiboDocument> publications = new HashSet<BiboDocument>();
Set<SubEntity> children = new LinkedHashSet<SubEntity>();
public Entity(String departmentURI, String departmentLabel){
super(departmentURI, departmentLabel);
}
public void setDepartmentLabel(String departmentURI){
this.setIndividualLabel(departmentURI);
}
public String getEntityURI(){
return this.getIndividualURI();
}
public Set<BiboDocument> getPublications() {
return publications;
}
public String getEntityLabel(){
return this.getIndividualLabel();
}
public Set<SubEntity> getSubEntities() {
return children;
}
public void addPublications(BiboDocument biboDocument) {
this.publications.add(biboDocument);
}
public void addSubEntity(SubEntity subEntity) {
this.children.add(subEntity);
}
}

View file

@ -0,0 +1,127 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
public class Grant extends Individual {
private String grantStartYear;
private String grantStartYearMonth;
private String grantStartDate;
private String grantEndYear;
private String grantEndYearMonth;
private String grantEndDate;
public Grant(String grantURL, String grantLabel){
super(grantURL, grantLabel);
}
public Grant(String grantURL){
super(grantURL);
}
public String getGrantURL() {
return this.getIndividualURI();
}
public String getGrantLabel(){
return this.getIndividualLabel();
}
/**
* This method will be called when there is no usable core:year value found
* for the bibo:Document. It will first check & parse core:yearMonth failing
* which it will try core:date
* @return
*/
public String getParsedGrantStartYear() {
/*
* We are assuming that core:yearMonth has "YYYY-MM-DD" format. This is based
* off of http://www.w3.org/TR/xmlschema-2/#gYearMonth , which is what
* core:yearMonth points to internally.
* */
if (grantStartYearMonth != null
&& grantStartYearMonth.length() >= VOConstants.NUM_CHARS_IN_YEAR_FORMAT
&& isValidPublicationYear(grantStartYearMonth.substring(
0,
VOConstants.NUM_CHARS_IN_YEAR_FORMAT))) {
return grantStartYearMonth.substring(0, VOConstants.NUM_CHARS_IN_YEAR_FORMAT);
}
if (grantStartDate != null
&& grantStartDate.length() >= VOConstants.NUM_CHARS_IN_YEAR_FORMAT
&& isValidPublicationYear(grantStartDate
.substring(0,
VOConstants.NUM_CHARS_IN_YEAR_FORMAT))) {
return grantStartDate.substring(0, VOConstants.NUM_CHARS_IN_YEAR_FORMAT);
}
/*
* If all else fails return default unknown year identifier
* */
return VOConstants.DEFAULT_GRANT_YEAR;
}
public String getGrantStartYear() {
return grantStartYear;
}
public void setGrantStartYear(String grantStartYear) {
this.grantStartYear = grantStartYear;
}
public String getGrantStartYearMonth() {
return grantStartYearMonth;
}
public void setGrantStartYearMonth(String grantStartYearMonth) {
this.grantStartYearMonth = grantStartYearMonth;
}
public String getGrantStartDate() {
return grantStartDate;
}
public void setGrantStartDate(String grantStartDate) {
this.grantStartDate = grantStartDate;
}
public String getGrantEndYear() {
return grantEndYear;
}
public void setGrantEndYear(String grantEndYear) {
this.grantEndYear = grantEndYear;
}
public String getGrantEndYearMonth() {
return grantEndYearMonth;
}
public void setGrantEndYearMonth(String grantEndYearMonth) {
this.grantEndYearMonth = grantEndYearMonth;
}
public String getGrantEndDate() {
return grantEndDate;
}
public void setGrantEndDate(String grantEndDate) {
this.grantEndDate = grantEndDate;
}
private boolean isValidPublicationYear(String testGrantYear) {
if (testGrantYear.length() != 0
&& testGrantYear.trim().length() == VOConstants.NUM_CHARS_IN_YEAR_FORMAT
&& testGrantYear.matches("\\d+")
&& Integer.parseInt(testGrantYear) >= VOConstants.MINIMUM_PUBLICATION_YEAR) {
return true;
}
return false;
}
}

View file

@ -0,0 +1,75 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.ArrayList;
import java.util.List;
/**
* JsonObject is used for creating data in JSON format,
* by just using the fields that are required to be included.
* @author bkoniden
*
*/
public class JsonObject {
private String label;
private List<List<Integer>> data = new ArrayList<List<Integer>>();
private String entityURI;
private String visMode;
private List<String> organizationType = new ArrayList<String>();
private List<String> stopWords = new ArrayList<String>();
public List<String> getStopWords() {
return stopWords;
}
public void setStopWords(List<String> stopWords) {
this.stopWords = stopWords;
}
public List<String> getOrganizationType() {
return organizationType;
}
public void setOrganizationType(List<String> organizationType) {
this.organizationType = organizationType;
}
public String getEntityURI() {
return entityURI;
}
public void setEntityURI(String entityURI) {
this.entityURI = entityURI;
}
public String getVisMode() {
return visMode;
}
public void setVisMode(String visMode) {
this.visMode = visMode;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public List<List<Integer>> getYearToPublicationCount() {
return data;
}
public JsonObject(String label){
this.label = label;
}
public void setYearToPublicationCount(List<List<Integer>> yearToPublicationCount){
this.data = yearToPublicationCount;
}
}

View file

@ -0,0 +1,22 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.Set;
import java.util.HashSet;
public class Person extends Individual {
Set<BiboDocument> documents = new HashSet<BiboDocument>();
public Person(String individualURI) {
super(individualURI);
}
public Set<BiboDocument> getDocuments() {
return documents;
}
public Person(String individualURI, String individualLabel) {
super(individualURI, individualLabel);
}
}

View file

@ -0,0 +1,54 @@
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
public class SubEntity extends Individual {
Set<BiboDocument> publications = new HashSet<BiboDocument>();
Map<String, Map<String, String>> personToPositionAndStartYear = new HashMap<String, Map<String, String>>();
public SubEntity(String individualURI) {
super(individualURI);
}
public Map<String, Map<String, String>> getPersonToPositionAndStartYear() {
return personToPositionAndStartYear;
}
public void setPersonToPositionAndStartYear(
Map<String, Map<String, String>> personToPositionAndStartYear) {
this.personToPositionAndStartYear = personToPositionAndStartYear;
}
public Set<BiboDocument> getDocuments() {
return publications;
}
public SubEntity(String individualURI, String individualLabel) {
super(individualURI, individualLabel);
}
@Override
public boolean equals(Object other){
boolean result = false;
if (other instanceof SubEntity){
SubEntity person = (SubEntity) other;
result = (this.getIndividualLabel().equals(person.getIndividualLabel())
&& this.getIndividualURI().equals(person.getIndividualURI()));
}
return result;
}
@Override
public int hashCode(){
return(41*(getIndividualLabel().hashCode() + 41*(getIndividualURI().hashCode())));
}
public void addPublications(BiboDocument biboDocument) {
this.publications.add(biboDocument);
}
}

View file

@ -1,42 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashSet;
import java.util.Set;
/**
*
* This is equivalent for vivo:CollegeOrSchoolWithinUniversity object type.
*
* @author cdtank
*/
public class VivoCollegeOrSchool extends Individual {
private Set<VivoDepartmentOrDivision> departments = new HashSet<VivoDepartmentOrDivision>();
public VivoCollegeOrSchool(String collegeURI) {
super(collegeURI);
}
public Set<VivoDepartmentOrDivision> getDepartments() {
return departments;
}
public void addDepartment(VivoDepartmentOrDivision department) {
this.departments.add(department);
}
public String getCollegeURI() {
return this.getIndividualURI();
}
public String getCollegeLabel() {
return this.getIndividualLabel();
}
public void setCollegeLabel(String collegeLabel) {
this.setIndividualLabel(collegeLabel);
}
}

View file

@ -1,43 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashSet;
import java.util.Set;
/**
*
* This is equivalent for vivo:AcademicDepartmentOrDivision object type.
*
* @author cdtank
*/
public class VivoDepartmentOrDivision extends Individual {
private Set<VivoCollegeOrSchool> parentColleges = new HashSet<VivoCollegeOrSchool>();
public VivoDepartmentOrDivision(String departmentURI, VivoCollegeOrSchool parentCollege) {
super(departmentURI);
addParentCollege(parentCollege);
}
public Set<VivoCollegeOrSchool> getParentCollege() {
return parentColleges;
}
public void addParentCollege(VivoCollegeOrSchool parentCollege) {
this.parentColleges.add(parentCollege);
}
public String getDepartmentURI() {
return this.getIndividualURI();
}
public String getDepartmentLabel() {
return this.getIndividualLabel();
}
public void setDepartmentLabel(String departmentLabel) {
this.setIndividualLabel(departmentLabel);
}
}

View file

@ -1,63 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashSet;
import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants.EmployeeType;
/**
*
* This is the equivalent for vivo's Employee object type.
*
* @author cdtank
*/
public class VivoEmployee extends Individual {
private EmployeeType employeeType;
private Set<VivoDepartmentOrDivision> parentDepartments =
new HashSet<VivoDepartmentOrDivision>();
private Set<BiboDocument> authorDocuments = new HashSet<BiboDocument>();
public VivoEmployee(String employeeURL,
EmployeeType employeeType,
VivoDepartmentOrDivision parentDepartment) {
super(employeeURL);
addParentDepartment(parentDepartment);
}
public String getEmployeeURI() {
return this.getIndividualURI();
}
public String getEmployeeName() {
return this.getIndividualLabel();
}
public EmployeeType getEmployeeType() {
return employeeType;
}
public void setEmployeeType(EmployeeType employeeType) {
this.employeeType = employeeType;
}
public Set<VivoDepartmentOrDivision> getParentDepartments() {
return parentDepartments;
}
public void addParentDepartment(VivoDepartmentOrDivision parentDepartment) {
this.parentDepartments.add(parentDepartment);
}
public Set<BiboDocument> getAuthorDocuments() {
return authorDocuments;
}
public void addAuthorDocument(BiboDocument authorDocument) {
this.authorDocuments.add(authorDocument);
}
}

View file

@ -22,8 +22,12 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants; import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoAuthorshipData; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoAuthorshipData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPIData;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Grant;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.CoPINode;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node;
public class UtilityFunctions { public class UtilityFunctions {
public static Map<String, Integer> getYearToPublicationCount( public static Map<String, Integer> getYearToPublicationCount(
@ -154,4 +158,86 @@ public class UtilityFunctions {
} }
} }
public static Map<String, Set<CoPINode>> getGrantYearToCoPI(
CoPIData pINodesAndEdges) {
Map<String, Set<CoPINode>> yearToCoPIs = new TreeMap<String, Set<CoPINode>>();
CoPINode egoNode = pINodesAndEdges.getEgoNode();
for (CoPINode currNode : pINodesAndEdges.getNodes()) {
/*
* We have already printed the Ego Node info.
* */
if (currNode != egoNode) {
for (String year : currNode.getYearToGrantCount().keySet()) {
Set<CoPINode> coPINodes;
if (yearToCoPIs.containsKey(year)) {
coPINodes = yearToCoPIs.get(year);
coPINodes.add(currNode);
} else {
coPINodes = new HashSet<CoPINode>();
coPINodes.add(currNode);
yearToCoPIs.put(year, coPINodes);
}
}
}
}
return yearToCoPIs;
}
public static Map<String, Integer> getYearToGrantCount(Set<Grant> pIGrants) {
/*
* Create a map from the year to number of grants. Use the Grant's
* parsedGrantStartYear to populate the data.
* */
Map<String, Integer> yearToGrantCount = new TreeMap<String, Integer>();
for (Grant curr : pIGrants) {
/*
* Increment the count because there is an entry already available for
* that particular year.
*
* I am pushing the logic to check for validity of year in "getGrantYear" itself
* because,
* 1. We will be using getGra... multiple times & this will save us duplication of code
* 2. If we change the logic of validity of a grant year we would not have to make
* changes all throughout the codebase.
* 3. We are asking for a grant year & we should get a proper one or NOT at all.
* */
String grantYear;
if (curr.getGrantStartYear() != null) {
grantYear = curr.getGrantStartYear();
} else {
grantYear = curr.getParsedGrantStartYear();
}
if (yearToGrantCount.containsKey(grantYear)) {
yearToGrantCount.put(grantYear,
yearToGrantCount
.get(grantYear) + 1);
} else {
yearToGrantCount.put(grantYear, 1);
}
}
return yearToGrantCount;
}
} }

2
startTomcat Executable file
View file

@ -0,0 +1,2 @@
sudo /usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/logs/catalina.out

View file

@ -0,0 +1,194 @@
@CHARSET "UTF-8";
head,#body {
font: 0.9em Helvetica;
}
#body {
background-color: #fff;
min-height: 800px;
width: 100%;
min-width: 900px;
margin: auto;
}
h1 {
padding-top: 10px;
font-size: 1.5em;
margin-left: 5%;
}
h2 {
font-size: 1.1em;
margin-top: 10px;
margin-bottom: 5px;
}
h3 {
font-size: 1.01em;
}
button{
margin-top: 10px;
float:right;
}
form{
margin-top:70px;
margin-bottom: -50px;
}
#yaxislabel{
font-size: 12px;
float:right;
background-color: white;
color:black;
display: block;
}
#xaxislabel{
font-size: 12px;
margin-top: -5px;
margin-left: 250px;
}
#functions{
margin-top: 20px;
margin-bottom: -40px;
}
#bar {
height: 20px;
float: left;
background-color: #fff;
width: 250px;
margin-left: 10px;
}
#checkbox{
float:left;
}
#label {
float: left;
font-size: 12px;
width: 160px;
text-align: right;
}
#searchresult {
margin-top: 50px;
}
#bottom,#graphContainer {
float: right;
}
#graphContainer {
margin-bottom: 15px;
}
#leftblock {
float: left;
margin-left: 5%;
width: 36%;
}
#text {
margin-left: 5px;
}
#searchresult a {
text-decoration: none;
color: black;
font-family: Helvetica;
font-size: 13px;
font-weight: normal;
}
#label a,#text {
text-decoration: none;
color: black;
font-family: Helvetica;
font-size: 1em;
}
#rightblock {
float:right;
margin-right:5%;
width:54%;
}
#counter,#total {
color: red;
}
#heading {
margin-top: 10px;
}
li{
padding: 5px;
list-style: none;
}
#paginatedTable{
margin-top: 10px;
}
.sDomSearchBar{
margin-bottom: 10px;
margin-left: 41%;
}
.datatablerowhighlight {
background-color: #ECFFB3 !important;
}
.metallic{
background-color: #212D34;
color: white;
margin-left: 20px;
}
#leftUpper{
border: 1px #3D454E solid;
border-top: 10px #3D454E solid;
background-color: #D9D9D9;
}
#leftLower{
border: 1px #3D454E solid;
border-top: 10px #3D454E solid;
}
#navcontainer{
background: none repeat scroll 0 0 #3D454E;
height: 1%;
padding: 8px 22em 8px 20px;
position: relative;
}
#navlist li
{
display: inline;
list-style-type: none;
padding: 20px;
}
#navlist li a{
color: white;
text-decoration: none;
}
#bottomButtons{
width: 50%;
float:right;
margin-right: 5%;
}
#stopwordsdiv{
margin-top: 10px;
}
p.displayCounter{
padding-bottom: 4px;
border-bottom: 1px solid gray;
}