1. Implemented the backend for accepting shorter urls for visualizations. This partially implements the feature described here http://issues.library.cornell.edu/browse/NIHVIVO-1097

2. Changed the IndividualTemplateModel to render shorter vis urls for temporal graph & ego-centric networks.
3. changed main toggle visualization links in ego-centric networks to use shorter vis urls.
This commit is contained in:
cdtank 2011-04-28 20:28:36 +00:00
parent 4bd69801ce
commit 29ca04f648
18 changed files with 488 additions and 45 deletions

View file

@ -63,6 +63,14 @@
<entry key="person_level"> <entry key="person_level">
<ref bean="person_level"></ref> <ref bean="person_level"></ref>
</entry> </entry>
<entry key="author-network">
<ref bean="person_level"></ref>
</entry>
<entry key="investigator-network">
<ref bean="person_level"></ref>
</entry>
<!-- <!--
<entry key="entity_comparison"> <entry key="entity_comparison">
@ -73,11 +81,14 @@
<entry key="entity_comparison"> <entry key="entity_comparison">
<ref bean="entity_comparison"></ref> <ref bean="entity_comparison"></ref>
</entry> </entry>
<entry key="pub_temporal"> <entry key="pub_temporal">
<ref bean="pub_temporal"></ref> <ref bean="pub_temporal"></ref>
</entry> </entry>
<entry key="publication-graph">
<ref bean="entity_comparison"></ref>
</entry>
<entry key="coprincipalinvestigator"> <entry key="coprincipalinvestigator">
<ref bean="coprincipalinvestigator"></ref> <ref bean="coprincipalinvestigator"></ref>
@ -89,7 +100,11 @@
<entry key="grant_temporal"> <entry key="grant_temporal">
<ref bean="grant_temporal"></ref> <ref bean="grant_temporal"></ref>
</entry> </entry>
<entry key="grant-graph">
<ref bean="entity_grant_count"></ref>
</entry>
</map> </map>
</property> </property>

View file

@ -1310,7 +1310,12 @@
<servlet> <servlet>
<servlet-name>StandardVisualizationController</servlet-name> <servlet-name>StandardVisualizationController</servlet-name>
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.StandardVisualizationController</servlet-class> <servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.StandardVisualizationController</servlet-class>
</servlet> </servlet>
<servlet>
<servlet-name>ShortURLVisualizationController</servlet-name>
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.ShortURLVisualizationController</servlet-class>
</servlet>
<servlet-mapping> <servlet-mapping>
<servlet-name>StandardVisualizationController</servlet-name> <servlet-name>StandardVisualizationController</servlet-name>
@ -1321,6 +1326,14 @@
<servlet-name>StandardVisualizationController</servlet-name> <servlet-name>StandardVisualizationController</servlet-name>
<url-pattern>/visualization</url-pattern> <url-pattern>/visualization</url-pattern>
</servlet-mapping> </servlet-mapping>
<!--
This mapping is done to facilitate shorter vis urls.
-->
<servlet-mapping>
<servlet-name>ShortURLVisualizationController</servlet-name>
<url-pattern>/vis/*</url-pattern>
</servlet-mapping>
<servlet> <servlet>
<servlet-name>AjaxVisualizationController</servlet-name> <servlet-name>AjaxVisualizationController</servlet-name>

View file

@ -1,13 +1,14 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#assign standardVisualizationURLRoot ="/visualization"> <#assign standardVisualizationURLRoot ="/visualization">
<#assign shortVisualizationURLRoot ="/vis">
<#assign ajaxVisualizationURLRoot ="/visualizationAjax"> <#assign ajaxVisualizationURLRoot ="/visualizationAjax">
<#assign dataVisualizationURLRoot ="/visualizationData"> <#assign dataVisualizationURLRoot ="/visualizationData">
<#assign egoURI ="${egoURIParam?url}"> <#assign egoURI ="${egoURIParam?url}">
<#assign egoCoAuthorshipDataFeederURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthor_network_stream&labelField=label'> <#assign egoCoAuthorshipDataFeederURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthor_network_stream&labelField=label'>
<#assign coprincipalinvestigatorURL = '${urls.base}${standardVisualizationURLRoot}?vis=person_level&uri=${egoURI}&vis_mode=copi'> <#assign coprincipalinvestigatorURL = '${urls.base}${shortVisualizationURLRoot}/investigator-network/?uri=${egoURI}'>
<#assign egoCoAuthorsListDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthors'> <#assign egoCoAuthorsListDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthors'>
<#assign egoCoAuthorshipNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthor_network_download'> <#assign egoCoAuthorshipNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthor_network_download'>

View file

@ -1,13 +1,14 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#assign standardVisualizationURLRoot ="/visualization"> <#assign standardVisualizationURLRoot ="/visualization">
<#assign shortVisualizationURLRoot ="/vis">
<#assign ajaxVisualizationURLRoot ="/visualizationAjax"> <#assign ajaxVisualizationURLRoot ="/visualizationAjax">
<#assign dataVisualizationURLRoot ="/visualizationData"> <#assign dataVisualizationURLRoot ="/visualizationData">
<#assign egoURI ="${egoURIParam?url}"> <#assign egoURI ="${egoURIParam?url}">
<#assign egoCoInvestigationDataFeederURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copi_network_stream&labelField=label'> <#assign egoCoInvestigationDataFeederURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copi_network_stream&labelField=label'>
<#assign coauthorshipURL = '${urls.base}${standardVisualizationURLRoot}?vis=person_level&uri=${egoURI}&vis_mode=coauthor'> <#assign coauthorshipURL = '${urls.base}${shortVisualizationURLRoot}/author-network/?uri=${egoURI}'>
<#assign egoCoInvestigatorsListDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copis'> <#assign egoCoInvestigatorsListDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copis'>
<#assign egoCoInvestigationNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copi_network_download'> <#assign egoCoInvestigationNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copi_network_download'>

View file

@ -0,0 +1,256 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import javax.servlet.ServletContext;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler;
/**
* Services a standard visualization request, which involves templates. This will return a simple
* error message and a 501 if there is no jena Model.
*
* @author cdtank
*/
@SuppressWarnings("serial")
public class ShortURLVisualizationController extends FreemarkerHttpServlet {
public static final String URL_ENCODING_SCHEME = "UTF-8";
private static final Log log = LogFactory.getLog(ShortURLVisualizationController.class.getName());
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static ServletContext servletContext;
@Override
protected ResponseValues processRequest(VitroRequest vreq) {
/*
* Based on the query parameters passed via URI get the appropriate visualization
* request handler.
* */
VisualizationRequestHandler visRequestHandler =
getVisualizationRequestHandler(vreq);
servletContext = getServletContext();
if (visRequestHandler != null) {
/*
* Pass the query to the selected visualization request handler & render the vis.
* Since the visualization content is directly added to the response object we are side-
* effecting this method.
* */
return renderVisualization(vreq, visRequestHandler);
} else {
return UtilityFunctions.handleMalformedParameters(
"Visualization Query Error",
"Inappropriate query parameters were submitted.",
vreq);
}
}
private ResponseValues renderVisualization(VitroRequest vitroRequest,
VisualizationRequestHandler visRequestHandler) {
Model model = vitroRequest.getJenaOntModel(); // getModel()
if (model == null) {
String errorMessage = "This service is not supporeted by the current "
+ "webapp configuration. A jena model is required in the "
+ "servlet context.";
log.error(errorMessage);
return UtilityFunctions.handleMalformedParameters("Visualization Query Error",
errorMessage,
vitroRequest);
}
Dataset dataset = setupJENADataSource(vitroRequest);
if (dataset != null && visRequestHandler != null) {
try {
List<String> matchedPatternGroups = extractShortURLParameters(vitroRequest);
Map<String, String> parametersForVis = getParamatersForVis(matchedPatternGroups, vitroRequest);
return visRequestHandler.generateVisualizationForShortURLRequests(
parametersForVis,
vitroRequest,
log,
dataset);
} catch (MalformedQueryParametersException e) {
return UtilityFunctions.handleMalformedParameters(
"Standard Visualization Query Error - Individual Publication Count",
e.getMessage(),
vitroRequest);
}
} else {
String errorMessage = "Data Model Empty &/or Inappropriate "
+ "query parameters were submitted. ";
log.error(errorMessage);
return UtilityFunctions.handleMalformedParameters("Visualization Query Error",
errorMessage,
vitroRequest);
}
}
private Map<String, String> getParamatersForVis(List<String> matchedPatternGroups,
VitroRequest vitroRequest) {
Map<String, String> parameters = new HashMap<String, String>();
/*
* We need to convert the short-form URI into a long form. So we use the
* default namespace to construct one.
* Since VIVO allows non-default namespaces, there are chances that short URLs
* will have a "uri" parameter instead of individual uri being part of the formal
* url.
* */
String subjectURI = null;
if (StringUtils.isBlank(matchedPatternGroups.get(1))) {
subjectURI = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
} else {
subjectURI = vitroRequest.getWebappDaoFactory().getDefaultNamespace()
+ matchedPatternGroups.get(1);
}
parameters.put(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY, subjectURI);
if (VisualizationFrameworkConstants.COAUTHORSHIP_VIS_SHORT_URL
.equalsIgnoreCase(matchedPatternGroups.get(0))) {
parameters.put(VisualizationFrameworkConstants.VIS_MODE_KEY,
VisualizationFrameworkConstants.COAUTHOR_VIS_MODE);
} else if (VisualizationFrameworkConstants.COINVESTIGATOR_VIS_SHORT_URL
.equalsIgnoreCase(matchedPatternGroups.get(0))) {
parameters.put(VisualizationFrameworkConstants.VIS_MODE_KEY,
VisualizationFrameworkConstants.COPI_VIS_MODE);
} else {
/*
* Currently temporal vis for both grants & publications do not require use of
* vis_modes in their request handlers, so no need to provide anything other than
* the URI.
* */
}
return parameters;
}
private VisualizationRequestHandler getVisualizationRequestHandler(
VitroRequest vitroRequest) {
String visType = null;
VisualizationRequestHandler visRequestHandler = null;
List<String> matchedPatternGroups = extractShortURLParameters(vitroRequest);
if (matchedPatternGroups.size() > 0) {
// System.out.println(matchedPatternGroups.get(0) + " --> " + matchedPatternGroups.get(1));
//
// System.out.println(vitroRequest.getRequestURI()
// + " -- " + vitroRequest.getContextPath()
// + " -- " + vitroRequest.getContextPath().length()
// + " -- " + vitroRequest.getRequestURI().substring(vitroRequest.getContextPath().length()));
visType = matchedPatternGroups.get(0);
try {
visRequestHandler = VisualizationsDependencyInjector
.getVisualizationIDsToClassMap(getServletContext())
.get(visType);
} catch (NullPointerException nullKeyException) {
/*
* Let the default flow take care of returning a null.
* */
}
}
return visRequestHandler;
}
/**
* An ideal short url request would mimic,
* vivo.com/vis/author-network/shortURI
* vivo.com/vis/grant-graph/shortURI
* etc. So first we obtain the request url which can be used to extract the requested visualization
* and the subject of the visualization. So the below pattern matcher will take "/vis/<vis-name>/<shortURI>"
* as an input.
*/
private List<String> extractShortURLParameters(VitroRequest vitroRequest) {
Matcher requestPatternMatcher = VisualizationFrameworkConstants
.SHORT_URL_REQUEST_PATTERN
.matcher(vitroRequest.getRequestURI()
.substring(vitroRequest.getContextPath().length()));
List<String> matchedGroups = new ArrayList<String>();
if(requestPatternMatcher.matches() && requestPatternMatcher.groupCount() >= 1) {
for (int ii=1; ii<=requestPatternMatcher.groupCount(); ii++) {
matchedGroups.add(requestPatternMatcher.group(ii));
}
}
return matchedGroups;
}
private Dataset setupJENADataSource(VitroRequest vreq) {
log.debug("rdfResultFormat was: " + VisConstants.RDF_RESULT_FORMAT_PARAM);
return vreq.getDataset();
}
}

View file

@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker; package edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker;
import java.util.regex.Pattern;
public class VisualizationFrameworkConstants { public class VisualizationFrameworkConstants {
/* /*
@ -24,11 +26,20 @@ public class VisualizationFrameworkConstants {
* Vis URL prefix that is seen by all the users * Vis URL prefix that is seen by all the users
*/ */
public static final String VISUALIZATION_URL_PREFIX = "/visualization"; public static final String VISUALIZATION_URL_PREFIX = "/visualization";
public static final String SHORT_URL_VISUALIZATION_REQUEST_PREFIX = "/vis";
public static final String FREEMARKERIZED_VISUALIZATION_URL_PREFIX = "/visualization"; public static final String FREEMARKERIZED_VISUALIZATION_URL_PREFIX = "/visualization";
public static final String AJAX_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationAjax"; public static final String AJAX_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationAjax";
public static final String DATA_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationData"; public static final String DATA_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationData";
public static final String INDIVIDUAL_URL_PREFIX = "/individual"; public static final String INDIVIDUAL_URL_PREFIX = "/individual";
public static final Pattern SHORT_URL_REQUEST_PATTERN = Pattern
.compile("^"
+ SHORT_URL_VISUALIZATION_REQUEST_PREFIX
+ "/([\\w-]+)/([^/]*)$");
/* /*
* These represent possible query keys in a URI for visualization purposes. * These represent possible query keys in a URI for visualization purposes.
@ -100,8 +111,12 @@ public class VisualizationFrameworkConstants {
public static final String COLLEGE_PUBLICATION_COUNT_VIS = "college_pub_count"; public static final String COLLEGE_PUBLICATION_COUNT_VIS = "college_pub_count";
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 COAUTHORSHIP_VIS_SHORT_URL = "author-network";
public static final String COINVESTIGATOR_VIS_SHORT_URL = "investigator-network";
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 ENTITY_COMPARISON_VIS = "entity_comparison";
public static final String PUBLICATION_TEMPORAL_VIS_SHORT_URL = "publication-graph";
public static final String GRANT_TEMPORAL_VIS_SHORT_URL = "grant-graph";
public static final String CO_PI_VIS = "coprincipalinvestigator"; public static final String CO_PI_VIS = "coprincipalinvestigator";

View file

@ -4,9 +4,9 @@ package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.coauthorship;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.Map.Entry;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -14,10 +14,8 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.DataVisualizationController; import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.DataVisualizationController;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.VisualizationFrameworkConstants; import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException; import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
@ -44,6 +42,13 @@ public class CoAuthorshipRequestHandler implements VisualizationRequestHandler {
throw new UnsupportedOperationException("CoAuthorship does not provide Ajax Response."); throw new UnsupportedOperationException("CoAuthorship does not provide Ajax Response.");
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("CoAuthorship does not provide Short URL Response.");
}
@Override @Override
public Map<String, String> generateDataVisualization( public Map<String, String> generateDataVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset) VitroRequest vitroRequest, Log log, Dataset dataset)
@ -288,4 +293,5 @@ public class CoAuthorshipRequestHandler implements VisualizationRequestHandler {
return fileData; return fileData;
} }
} }

View file

@ -24,10 +24,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.ModelC
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.QueryRunner; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.QueryRunner;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.UtilityFunctions; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler;
/**
* @author bkoniden
* Deepak Konidena
*/
public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler { public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler {
@ -38,6 +35,14 @@ public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler
+ " does not provide Ajax response."); + " does not provide Ajax response.");
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Co-PI Grant Count"
+ " does not provide Short URL response.");
}
@Override @Override
public Map<String, String> generateDataVisualization( public Map<String, String> generateDataVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset) VitroRequest vitroRequest, Log log, Dataset dataset)
@ -282,4 +287,5 @@ public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler
return fileData; return fileData;
} }
} }

View file

@ -57,6 +57,14 @@ public class EntityPublicationCountRequestHandler implements
return prepareStandaloneMarkupResponse(vitroRequest, entityURI); return prepareStandaloneMarkupResponse(vitroRequest, entityURI);
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Uncached implementation for Publication Temporal "
+ "Visualization does not provide Short URL Response.");
}
private Map<String, String> getSubjectEntityAndGenerateDataResponse( private Map<String, String> getSubjectEntityAndGenerateDataResponse(
VitroRequest vitroRequest, Log log, Dataset dataset, VitroRequest vitroRequest, Log log, Dataset dataset,
String subjectEntityURI) String subjectEntityURI)
@ -327,4 +335,5 @@ public class EntityPublicationCountRequestHandler implements
} }
return csvFileContent.toString(); return csvFileContent.toString();
} }
} }

View file

@ -15,7 +15,6 @@ import org.apache.commons.logging.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
@ -27,7 +26,6 @@ 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.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.EntityComparisonUtilityFunctions; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.EntityComparisonUtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.ConstructedModelTracker;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Entity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Entity;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.JsonObject; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.JsonObject;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.SubEntity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.SubEntity;
@ -48,6 +46,14 @@ public class TemporalGrantVisualizationRequestHandler implements
String entityURI = vitroRequest String entityURI = vitroRequest
.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
return generateStandardVisualizationForGrantTemporalVis(vitroRequest,
log, dataset, entityURI);
}
private ResponseValues generateStandardVisualizationForGrantTemporalVis(
VitroRequest vitroRequest, Log log, Dataset dataset,
String entityURI) throws MalformedQueryParametersException {
if (StringUtils.isBlank(entityURI)) { if (StringUtils.isBlank(entityURI)) {
entityURI = EntityComparisonUtilityFunctions entityURI = EntityComparisonUtilityFunctions
@ -58,13 +64,25 @@ public class TemporalGrantVisualizationRequestHandler implements
} }
System.out.println("current models in the system are"); /* System.out.println("current models in the system are");
for (Map.Entry<String, Model> entry : ConstructedModelTracker.getAllModels().entrySet()) { for (Map.Entry<String, Model> entry : ConstructedModelTracker.getAllModels().entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue().size()); System.out.println(entry.getKey() + " -> " + entry.getValue().size());
} }
// */
return prepareStandaloneMarkupResponse(vitroRequest, entityURI); return prepareStandaloneMarkupResponse(vitroRequest, entityURI);
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataset) throws MalformedQueryParametersException {
return generateStandardVisualizationForGrantTemporalVis(
vitroRequest, log, dataset, parameters.get(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY));
}
@Override @Override
public Map<String, String> generateDataVisualization( public Map<String, String> generateDataVisualization(

View file

@ -46,6 +46,25 @@ public class TemporalPublicationVisualizationRequestHandler implements
String entityURI = vitroRequest String entityURI = vitroRequest
.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
return generateStandardVisualizationForPublicationTemporalVis(
vitroRequest, log, dataset, entityURI);
}
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataset) throws MalformedQueryParametersException {
return generateStandardVisualizationForPublicationTemporalVis(
vitroRequest, log, dataset, parameters.get(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY));
}
private ResponseValues generateStandardVisualizationForPublicationTemporalVis(
VitroRequest vitroRequest, Log log, Dataset dataset,
String entityURI) throws MalformedQueryParametersException {
if (StringUtils.isBlank(entityURI)) { if (StringUtils.isBlank(entityURI)) {
entityURI = EntityComparisonUtilityFunctions entityURI = EntityComparisonUtilityFunctions
@ -350,4 +369,5 @@ public class TemporalPublicationVisualizationRequestHandler implements
} }
return csvFileContent.toString(); return csvFileContent.toString();
} }
} }

View file

@ -58,6 +58,14 @@ public class EntityGrantCountRequestHandler implements
return prepareStandaloneMarkupResponse(vitroRequest, entityURI); return prepareStandaloneMarkupResponse(vitroRequest, entityURI);
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Uncached implementation for Grant Temporal "
+ "Visualization does not provide Short URL Response.");
}
@Override @Override
public Map<String, String> generateDataVisualization( public Map<String, String> generateDataVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset) VitroRequest vitroRequest, Log log, Dataset dataset)
@ -328,5 +336,6 @@ public class EntityGrantCountRequestHandler implements
} }
return csvFileContent.toString(); return csvFileContent.toString();
} }
} }

View file

@ -75,6 +75,13 @@ public class PersonGrantCountRequestHandler implements VisualizationRequestHandl
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Person Grant Count Visualization does not provide "
+ "Short URL Response.");
}
@Override @Override
public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log, public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log,

View file

@ -71,15 +71,36 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
public ResponseValues generateStandardVisualization( public ResponseValues generateStandardVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset) VitroRequest vitroRequest, Log log, Dataset dataset)
throws MalformedQueryParametersException { throws MalformedQueryParametersException {
String egoURI = vitroRequest.getParameter( String egoURI = vitroRequest.getParameter(
VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
String visMode = vitroRequest.getParameter( String visMode = vitroRequest.getParameter(
VisualizationFrameworkConstants.VIS_MODE_KEY); VisualizationFrameworkConstants.VIS_MODE_KEY);
return generateStandardVisualizationForPersonLevelVis(vitroRequest,
log, dataset, egoURI, visMode);
if (VisualizationFrameworkConstants.COPI_VIS_MODE.equalsIgnoreCase(visMode)) { }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataset) throws MalformedQueryParametersException {
return generateStandardVisualizationForPersonLevelVis(
vitroRequest,
log,
dataset,
parameters.get(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY),
parameters.get(VisualizationFrameworkConstants.VIS_MODE_KEY));
}
private ResponseValues generateStandardVisualizationForPersonLevelVis(
VitroRequest vitroRequest, Log log, Dataset dataset, String egoURI,
String visMode) throws MalformedQueryParametersException {
if (VisualizationFrameworkConstants.COPI_VIS_MODE.equalsIgnoreCase(visMode)) {
ModelConstructor constructQueryRunner = ModelConstructor constructQueryRunner =
new CoPIGrantCountConstructQueryRunner(egoURI, dataset, log); new CoPIGrantCountConstructQueryRunner(egoURI, dataset, log);
@ -140,7 +161,6 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
coPIData, coPIData,
vitroRequest); vitroRequest);
} else { } else {
QueryRunner<CollaborationData> coAuthorshipQueryManager = QueryRunner<CollaborationData> coAuthorshipQueryManager =
@ -198,7 +218,6 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
vitroRequest); vitroRequest);
} }
} }
private TemplateResponseValues prepareCoAuthorStandaloneResponse( private TemplateResponseValues prepareCoAuthorStandaloneResponse(
@ -273,5 +292,4 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
return new TemplateResponseValues(standaloneTemplate, body); return new TemplateResponseValues(standaloneTemplate, body);
} }
} }

View file

@ -94,6 +94,14 @@ VisualizationRequestHandler {
shouldVIVOrenderVis); shouldVIVOrenderVis);
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Person Publication Count Visualization does not provide "
+ "Short URL Response.");
}
@Override @Override
public Map<String, String> generateDataVisualization(VitroRequest vitroRequest, Log log, public Map<String, String> generateDataVisualization(VitroRequest vitroRequest, Log log,

View file

@ -434,5 +434,13 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler {
throws MalformedQueryParametersException { throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Utilities does not provide Standard Response."); throw new UnsupportedOperationException("Utilities does not provide Standard Response.");
} }
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Utilities Visualization does not provide "
+ "Short URL Response.");
}
} }

View file

@ -27,6 +27,12 @@ public interface VisualizationRequestHandler {
Log log, Log log,
Dataset dataSource) throws MalformedQueryParametersException; Dataset dataSource) throws MalformedQueryParametersException;
ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters,
VitroRequest vitroRequest,
Log log,
Dataset dataSource) throws MalformedQueryParametersException;
Object generateAjaxVisualization(VitroRequest vitroRequest, Object generateAjaxVisualization(VitroRequest vitroRequest,
Log log, Log log,
Dataset dataSource) throws MalformedQueryParametersException; Dataset dataSource) throws MalformedQueryParametersException;

View file

@ -9,6 +9,8 @@ import java.util.Map;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
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.openrdf.model.URI;
import org.openrdf.model.impl.URIImpl;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Individual;
@ -17,6 +19,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class IndividualTemplateModel extends BaseIndividualTemplateModel { public class IndividualTemplateModel extends BaseIndividualTemplateModel {
@ -29,28 +32,9 @@ public class IndividualTemplateModel extends BaseIndividualTemplateModel {
} }
private String getBaseVisUrl() { private String getBaseVisUrl() {
return getUrl(Route.VISUALIZATION.path(), "uri", getUri()); return getUrl(Route.VISUALIZATION_SHORT.path());
} }
private String getVisUrl(ParamMap params) {
String baseVisUrl = getBaseVisUrl();
return UrlBuilder.addParams(baseVisUrl, params);
}
private String getVisUrl(String...params) {
return getVisUrl(new ParamMap(params));
}
private String getPersonVisUrl(ParamMap params) {
if (!isPerson()) {
return null;
}
ParamMap paramMap = new ParamMap("vis", "person_level");
paramMap.put(params);
return getVisUrl(paramMap);
}
/* Access methods for templates */ /* Access methods for templates */
public boolean isPerson() { public boolean isPerson() {
@ -62,18 +46,61 @@ public class IndividualTemplateModel extends BaseIndividualTemplateModel {
} }
public String getCoAuthorVisUrl() { public String getCoAuthorVisUrl() {
return getPersonVisUrl(new ParamMap("vis_mode", "coauthor"));
String coauthorVisURL = getBaseVisUrl() + "/" + VisualizationFrameworkConstants.COAUTHORSHIP_VIS_SHORT_URL + "/";
return getVisUrl(coauthorVisURL);
} }
/**
* TODO: Remove this method once Rebecca creates one. Right now it is the exact copy of the method found in
* BaseIndividualTemplateModel.getRdfUrl
* @return
*/
private boolean isIndividualURIBasedOnDefaultNamespace() {
URI uri = new URIImpl(getUri());
String namespace = uri.getNamespace();
// Individuals in the default namespace
// e.g., http://vivo.cornell.edu/individual/n2345/n2345.rdf
// where default namespace = http://vivo.cornell.edu/individual/
// Other individuals: http://some.other.namespace/n2345?format=rdfxml
String defaultNamespace = vreq.getWebappDaoFactory().getDefaultNamespace();
return (defaultNamespace.equals(namespace)) ? true : false;
}
public String getCoInvestigatorVisUrl() { public String getCoInvestigatorVisUrl() {
return getPersonVisUrl(new ParamMap("vis_mode", "copi"));
String coinvestigatorVisURL = getBaseVisUrl() + "/" + VisualizationFrameworkConstants.COINVESTIGATOR_VIS_SHORT_URL + "/";
return getVisUrl(coinvestigatorVisURL);
} }
private String getVisUrl(String coinvestigatorVisURL) {
boolean isUsingDefaultNameSpace = isIndividualURIBasedOnDefaultNamespace();
if (isUsingDefaultNameSpace) {
return coinvestigatorVisURL + getLocalName();
} else {
return UrlBuilder.addParams(
coinvestigatorVisURL,
new ParamMap(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY, getUri()));
}
}
public String getTemporalGraphUrl() { public String getTemporalGraphUrl() {
if (!isOrganization()) { if (!isOrganization()) {
return null; return null;
} }
return getVisUrl("vis", "entity_comparison");
String temporalVisURL = getBaseVisUrl() + "/" + VisualizationFrameworkConstants.PUBLICATION_TEMPORAL_VIS_SHORT_URL + "/";
return getVisUrl(temporalVisURL);
} }
public String getSelfEditingId() { public String getSelfEditingId() {