From 29ca04f6489bdd01f99bfaadfdd885863a7cea5c Mon Sep 17 00:00:00 2001 From: cdtank Date: Thu, 28 Apr 2011 20:28:36 +0000 Subject: [PATCH] 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. --- .../visualizations-beans-injection-fm.xml | 19 +- productMods/WEB-INF/web.xml | 15 +- .../personlevel/coAuthorPersonLevel.ftl | 3 +- .../personlevel/coPIPersonLevel.ftl | 3 +- .../ShortURLVisualizationController.java | 256 ++++++++++++++++++ .../VisualizationFrameworkConstants.java | 15 + .../CoAuthorshipRequestHandler.java | 12 +- .../CoPIGrantCountRequestHandler.java | 14 +- .../EntityPublicationCountRequestHandler.java | 9 + ...poralGrantVisualizationRequestHandler.java | 26 +- ...ublicationVisualizationRequestHandler.java | 20 ++ .../EntityGrantCountRequestHandler.java | 11 +- .../PersonGrantCountRequestHandler.java | 7 + .../PersonLevelRequestHandler.java | 28 +- .../PersonPublicationCountRequestHandler.java | 8 + .../utilities/UtilitiesRequestHandler.java | 8 + .../visutils/VisualizationRequestHandler.java | 6 + .../individual/IndividualTemplateModel.java | 73 +++-- 18 files changed, 488 insertions(+), 45 deletions(-) create mode 100644 src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/ShortURLVisualizationController.java diff --git a/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml b/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml index 850a1652..8fa37a1b 100644 --- a/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml +++ b/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml @@ -63,6 +63,14 @@ + + + + + + + + + + ShortURLVisualizationController + /vis/* + AjaxVisualizationController diff --git a/productMods/templates/freemarker/visualization/personlevel/coAuthorPersonLevel.ftl b/productMods/templates/freemarker/visualization/personlevel/coAuthorPersonLevel.ftl index c0507fce..e2221f78 100644 --- a/productMods/templates/freemarker/visualization/personlevel/coAuthorPersonLevel.ftl +++ b/productMods/templates/freemarker/visualization/personlevel/coAuthorPersonLevel.ftl @@ -1,13 +1,14 @@ <#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#assign standardVisualizationURLRoot ="/visualization"> +<#assign shortVisualizationURLRoot ="/vis"> <#assign ajaxVisualizationURLRoot ="/visualizationAjax"> <#assign dataVisualizationURLRoot ="/visualizationData"> <#assign egoURI ="${egoURIParam?url}"> <#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 egoCoAuthorshipNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coauthorship&uri=${egoURI}&vis_mode=coauthor_network_download'> diff --git a/productMods/templates/freemarker/visualization/personlevel/coPIPersonLevel.ftl b/productMods/templates/freemarker/visualization/personlevel/coPIPersonLevel.ftl index e977f4ac..a69964eb 100644 --- a/productMods/templates/freemarker/visualization/personlevel/coPIPersonLevel.ftl +++ b/productMods/templates/freemarker/visualization/personlevel/coPIPersonLevel.ftl @@ -1,13 +1,14 @@ <#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#assign standardVisualizationURLRoot ="/visualization"> +<#assign shortVisualizationURLRoot ="/vis"> <#assign ajaxVisualizationURLRoot ="/visualizationAjax"> <#assign dataVisualizationURLRoot ="/visualizationData"> <#assign egoURI ="${egoURIParam?url}"> <#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 egoCoInvestigationNetworkDataFileURL = '${urls.base}${dataVisualizationURLRoot}?vis=coprincipalinvestigator&uri=${egoURI}&vis_mode=copi_network_download'> diff --git a/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/ShortURLVisualizationController.java b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/ShortURLVisualizationController.java new file mode 100644 index 00000000..3b5b8b93 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/ShortURLVisualizationController.java @@ -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 matchedPatternGroups = extractShortURLParameters(vitroRequest); + + + Map 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 getParamatersForVis(List matchedPatternGroups, + VitroRequest vitroRequest) { + + Map parameters = new HashMap(); + + /* + * 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 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//" + * as an input. + */ + private List extractShortURLParameters(VitroRequest vitroRequest) { + + Matcher requestPatternMatcher = VisualizationFrameworkConstants + .SHORT_URL_REQUEST_PATTERN + .matcher(vitroRequest.getRequestURI() + .substring(vitroRequest.getContextPath().length())); + + List matchedGroups = new ArrayList(); + + 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(); + } + +} + diff --git a/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java index 0910598a..f1f69366 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java +++ b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java @@ -2,6 +2,8 @@ package edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker; +import java.util.regex.Pattern; + public class VisualizationFrameworkConstants { /* @@ -24,11 +26,20 @@ public class VisualizationFrameworkConstants { * Vis URL prefix that is seen by all the users */ 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 AJAX_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationAjax"; public static final String DATA_VISUALIZATION_SERVICE_URL_PREFIX = "/visualizationData"; 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. @@ -100,8 +111,12 @@ public class VisualizationFrameworkConstants { public static final String COLLEGE_PUBLICATION_COUNT_VIS = "college_pub_count"; public static final String COAUTHORSHIP_VIS = "coauthorship"; 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 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"; diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coauthorship/CoAuthorshipRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coauthorship/CoAuthorshipRequestHandler.java index 60adfbe2..ddf1b389 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coauthorship/CoAuthorshipRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coauthorship/CoAuthorshipRequestHandler.java @@ -4,9 +4,9 @@ package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.coauthorship; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; +import java.util.Map.Entry; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; @@ -14,10 +14,8 @@ import org.apache.commons.logging.Log; 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.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.VisualizationFrameworkConstants; 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."); } + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataSource) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("CoAuthorship does not provide Short URL Response."); + } + @Override public Map generateDataVisualization( VitroRequest vitroRequest, Log log, Dataset dataset) @@ -288,4 +293,5 @@ public class CoAuthorshipRequestHandler implements VisualizationRequestHandler { return fileData; } + } diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coprincipalinvestigator/CoPIGrantCountRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coprincipalinvestigator/CoPIGrantCountRequestHandler.java index 79bac3f2..2ecb135e 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coprincipalinvestigator/CoPIGrantCountRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/coprincipalinvestigator/CoPIGrantCountRequestHandler.java @@ -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.UtilityFunctions; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler; -/** - * @author bkoniden - * Deepak Konidena - */ + public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler { @@ -38,6 +35,14 @@ public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler + " does not provide Ajax response."); } + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataSource) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("Co-PI Grant Count" + + " does not provide Short URL response."); + } + @Override public Map generateDataVisualization( VitroRequest vitroRequest, Log log, Dataset dataset) @@ -282,4 +287,5 @@ public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler return fileData; } + } \ No newline at end of file diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityPublicationCountRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityPublicationCountRequestHandler.java index e08d350d..059864b3 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityPublicationCountRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityPublicationCountRequestHandler.java @@ -57,6 +57,14 @@ public class EntityPublicationCountRequestHandler implements return prepareStandaloneMarkupResponse(vitroRequest, entityURI); } + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map 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 getSubjectEntityAndGenerateDataResponse( VitroRequest vitroRequest, Log log, Dataset dataset, String subjectEntityURI) @@ -327,4 +335,5 @@ public class EntityPublicationCountRequestHandler implements } return csvFileContent.toString(); } + } \ No newline at end of file diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalGrantVisualizationRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalGrantVisualizationRequestHandler.java index baf2fce5..966d1087 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalGrantVisualizationRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalGrantVisualizationRequestHandler.java @@ -15,7 +15,6 @@ import org.apache.commons.logging.Log; import com.google.gson.Gson; 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.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.freemarker.entitycomparison.EntityComparisonUtilityFunctions; 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.JsonObject; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.SubEntity; @@ -48,6 +46,14 @@ public class TemporalGrantVisualizationRequestHandler implements String entityURI = vitroRequest .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)) { 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 entry : ConstructedModelTracker.getAllModels().entrySet()) { System.out.println(entry.getKey() + " -> " + entry.getValue().size()); } -// +*/ return prepareStandaloneMarkupResponse(vitroRequest, entityURI); } + + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataset) throws MalformedQueryParametersException { + + + return generateStandardVisualizationForGrantTemporalVis( + vitroRequest, log, dataset, parameters.get(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY)); + + } @Override public Map generateDataVisualization( diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java index 9fd0f5e5..10f80ff2 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java @@ -46,6 +46,25 @@ public class TemporalPublicationVisualizationRequestHandler implements String entityURI = vitroRequest .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); + return generateStandardVisualizationForPublicationTemporalVis( + vitroRequest, log, dataset, entityURI); + } + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map 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)) { entityURI = EntityComparisonUtilityFunctions @@ -350,4 +369,5 @@ public class TemporalPublicationVisualizationRequestHandler implements } return csvFileContent.toString(); } + } \ No newline at end of file diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitygrantcount/EntityGrantCountRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitygrantcount/EntityGrantCountRequestHandler.java index 0e1770be..5e602a1a 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitygrantcount/EntityGrantCountRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitygrantcount/EntityGrantCountRequestHandler.java @@ -58,6 +58,14 @@ public class EntityGrantCountRequestHandler implements return prepareStandaloneMarkupResponse(vitroRequest, entityURI); } + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map 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 public Map generateDataVisualization( VitroRequest vitroRequest, Log log, Dataset dataset) @@ -328,5 +336,6 @@ public class EntityGrantCountRequestHandler implements } return csvFileContent.toString(); - } + } + } diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/persongrantcount/PersonGrantCountRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/persongrantcount/PersonGrantCountRequestHandler.java index 1165c52f..3ab4deee 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/persongrantcount/PersonGrantCountRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/persongrantcount/PersonGrantCountRequestHandler.java @@ -75,6 +75,13 @@ public class PersonGrantCountRequestHandler implements VisualizationRequestHandl } + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataSource) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("Person Grant Count Visualization does not provide " + + "Short URL Response."); + } @Override public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log, diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personlevel/PersonLevelRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personlevel/PersonLevelRequestHandler.java index aea7938e..0649623c 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personlevel/PersonLevelRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personlevel/PersonLevelRequestHandler.java @@ -71,15 +71,36 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler { public ResponseValues generateStandardVisualization( VitroRequest vitroRequest, Log log, Dataset dataset) throws MalformedQueryParametersException { - + String egoURI = vitroRequest.getParameter( VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); String visMode = vitroRequest.getParameter( VisualizationFrameworkConstants.VIS_MODE_KEY); + return generateStandardVisualizationForPersonLevelVis(vitroRequest, + log, dataset, egoURI, visMode); - if (VisualizationFrameworkConstants.COPI_VIS_MODE.equalsIgnoreCase(visMode)) { + } + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map 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 = new CoPIGrantCountConstructQueryRunner(egoURI, dataset, log); @@ -140,7 +161,6 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler { coPIData, vitroRequest); - } else { QueryRunner coAuthorshipQueryManager = @@ -198,7 +218,6 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler { vitroRequest); } - } private TemplateResponseValues prepareCoAuthorStandaloneResponse( @@ -273,5 +292,4 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler { return new TemplateResponseValues(standaloneTemplate, body); } - } diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountRequestHandler.java index 61b2d14b..d6182cb0 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountRequestHandler.java @@ -94,6 +94,14 @@ VisualizationRequestHandler { shouldVIVOrenderVis); } + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataSource) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("Person Publication Count Visualization does not provide " + + "Short URL Response."); + } @Override public Map generateDataVisualization(VitroRequest vitroRequest, Log log, diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java index 2f37d877..16ed748d 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java @@ -434,5 +434,13 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler { throws MalformedQueryParametersException { throw new UnsupportedOperationException("Utilities does not provide Standard Response."); } + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataSource) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("Utilities Visualization does not provide " + + "Short URL Response."); + } } diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/VisualizationRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/VisualizationRequestHandler.java index ffe92245..99dd685c 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/VisualizationRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/VisualizationRequestHandler.java @@ -27,6 +27,12 @@ public interface VisualizationRequestHandler { Log log, Dataset dataSource) throws MalformedQueryParametersException; + ResponseValues generateVisualizationForShortURLRequests( + Map parameters, + VitroRequest vitroRequest, + Log log, + Dataset dataSource) throws MalformedQueryParametersException; + Object generateAjaxVisualization(VitroRequest vitroRequest, Log log, Dataset dataSource) throws MalformedQueryParametersException; diff --git a/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java b/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java index da1c1561..0a21057f 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java +++ b/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java @@ -9,6 +9,8 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; 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.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.ParamMap; 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; public class IndividualTemplateModel extends BaseIndividualTemplateModel { @@ -29,28 +32,9 @@ public class IndividualTemplateModel extends BaseIndividualTemplateModel { } 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 */ public boolean isPerson() { @@ -62,18 +46,61 @@ public class IndividualTemplateModel extends BaseIndividualTemplateModel { } 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() { - 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() { if (!isOrganization()) { return null; } - return getVisUrl("vis", "entity_comparison"); + + String temporalVisURL = getBaseVisUrl() + "/" + VisualizationFrameworkConstants.PUBLICATION_TEMPORAL_VIS_SHORT_URL + "/"; + + return getVisUrl(temporalVisURL); + } public String getSelfEditingId() {