From 1e82115d649a40d3655193379d0f5c1f8eb65b4b Mon Sep 17 00:00:00 2001 From: cdtank Date: Wed, 11 May 2011 20:51:54 +0000 Subject: [PATCH] 1. refactored code in preparation for adding code structure for map of science vis --- .../mapOfScience/mapOfScienceSetup.ftl | 26 ++ .../mapOfScience/mapOfScienceStandalone.ftl | 38 ++ .../visualization/constants/VisConstants.java | 4 + .../EntityPublicationCountRequestHandler.java | 10 +- ...java => OrganizationUtilityFunctions.java} | 6 +- .../cached/EntityComparisonConstants.java | 11 - ...poralGrantVisualizationRequestHandler.java | 25 +- ...ublicationVisualizationRequestHandler.java | 25 +- .../EntityGrantCountRequestHandler.java | 12 +- ...pOfScienceVisualizationRequestHandler.java | 373 ++++++++++++++++++ 10 files changed, 481 insertions(+), 49 deletions(-) create mode 100644 productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceSetup.ftl create mode 100644 productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceStandalone.ftl rename src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/{EntityComparisonUtilityFunctions.java => OrganizationUtilityFunctions.java} (97%) delete mode 100644 src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityComparisonConstants.java create mode 100644 src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/mapofscience/MapOfScienceVisualizationRequestHandler.java diff --git a/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceSetup.ftl b/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceSetup.ftl new file mode 100644 index 00000000..b33450af --- /dev/null +++ b/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceSetup.ftl @@ -0,0 +1,26 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#assign standardVisualizationURLRoot ="/visualization"> +<#assign ajaxVisualizationURLRoot ="/visualizationAjax"> +<#assign dataVisualizationURLRoot ="/visualizationData"> +<#assign shortVisualizationURLRoot ="/vis"> + +<#assign organizationURI ="${organizationURI?url}"> +<#assign organizationVivoProfileURL = "${urls.base}/individual?uri=${organizationURI}"> + +<#assign subOrganizationVivoProfileURL = "${urls.base}/individual?"> + +<#assign subOrganizationMapOfScienceCommonURL = "${urls.base}${shortVisualizationURLRoot}/map-of-science/"> + + +<#if organizationLocalName?has_content > + + <#assign organizationMapOfScienceURL = "${urls.base}${shortVisualizationURLRoot}/map-of-science/${organizationLocalName}"> + +<#else> + + <#assign organizationMapOfScienceURL = '${urls.base}${shortVisualizationURLRoot}/map-of-science/?uri=${organizationURI}'> + + + +<#assign organizationMapOfScienceDataURL = "${urls.base}${dataVisualizationURLRoot}?vis=map-of-science&uri=${organizationURI}&vis_mode=json"> \ No newline at end of file diff --git a/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceStandalone.ftl b/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceStandalone.ftl new file mode 100644 index 00000000..a806e67b --- /dev/null +++ b/productMods/templates/freemarker/visualization/mapOfScience/mapOfScienceStandalone.ftl @@ -0,0 +1,38 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- The Order of each element in this file is very important. Do not make any changes to it unless making +corresponding changes in the included Templates. --> + + +<#include "scienceMapSetup.ftl"> + + \ No newline at end of file diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/constants/VisConstants.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/constants/VisConstants.java index 8b6f07d4..e792b969 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/constants/VisConstants.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/constants/VisConstants.java @@ -14,4 +14,8 @@ public class VisConstants { public static final String RESULT_FORMAT_PARAM = "RS_TEXT"; public static final String RDF_RESULT_FORMAT_PARAM = "RDF/XML-ABBREV"; + public static enum DataVisMode { + CSV, JSON + }; + } 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 a2715c21..6b528bfb 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 @@ -53,7 +53,7 @@ public class EntityPublicationCountRequestHandler implements if (StringUtils.isBlank(entityURI)) { - entityURI = EntityComparisonUtilityFunctions + entityURI = OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -120,7 +120,7 @@ public class EntityPublicationCountRequestHandler implements throws MalformedQueryParametersException { Map> subOrganizationTypesResult = - EntityComparisonUtilityFunctions.getSubEntityTypes( + OrganizationUtilityFunctions.getSubEntityTypes( log, dataset, subjectEntityURI); return prepareStandaloneDataResponse(vitroRequest, entity, entity.getSubEntities(), @@ -155,7 +155,7 @@ public class EntityPublicationCountRequestHandler implements vitroRequest, log, dataset, - EntityComparisonUtilityFunctions + OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -178,7 +178,7 @@ public class EntityPublicationCountRequestHandler implements Entity entity = queryManager.getQueryResult(); Map> subOrganizationTypesResult = - EntityComparisonUtilityFunctions.getSubEntityTypes( + OrganizationUtilityFunctions.getSubEntityTypes( log, dataset, entityURI); return prepareDataResponse(entity, entity.getSubEntities(), subOrganizationTypesResult); @@ -251,7 +251,7 @@ public class EntityPublicationCountRequestHandler implements String standaloneTemplate = "entityComparisonOnPublicationsStandalone.ftl"; - String organizationLabel = EntityComparisonUtilityFunctions + String organizationLabel = OrganizationUtilityFunctions .getEntityLabelFromDAO(vreq, entityURI); diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityComparisonUtilityFunctions.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/OrganizationUtilityFunctions.java similarity index 97% rename from src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityComparisonUtilityFunctions.java rename to src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/OrganizationUtilityFunctions.java index 129d6a90..f2b94577 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/EntityComparisonUtilityFunctions.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/OrganizationUtilityFunctions.java @@ -28,7 +28,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.Generi import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.ModelConstructor; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.QueryRunner; -public class EntityComparisonUtilityFunctions { +public class OrganizationUtilityFunctions { public static String getHighestLevelOrganizationURI(ResultSet resultSet, Map fieldLabelToOutputFieldLabel) { @@ -94,7 +94,7 @@ public class EntityComparisonUtilityFunctions { fieldLabelToOutputFieldLabel, aggregationRules, whereClause, groupOrderClause, dataset, log); - String highestLevelOrgURI = EntityComparisonUtilityFunctions + String highestLevelOrgURI = OrganizationUtilityFunctions .getHighestLevelOrganizationURI( highestLevelOrganizationQueryHandler.getQueryResult(), fieldLabelToOutputFieldLabel); @@ -165,7 +165,7 @@ public class EntityComparisonUtilityFunctions { /* * If the provided value was not proper compute it yourself. * */ - return EntityComparisonUtilityFunctions.getHighestLevelOrganizationURI(log, dataset); + return OrganizationUtilityFunctions.getHighestLevelOrganizationURI(log, dataset); } public static Entity mergeEntityIfShareSameURI(Entity entityA, Entity entityB) { diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityComparisonConstants.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityComparisonConstants.java deleted file mode 100644 index 2776907a..00000000 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityComparisonConstants.java +++ /dev/null @@ -1,11 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.cached; - -public class EntityComparisonConstants { - - public static enum DataVisMode { - CSV, JSON - }; - -} 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 ce59b51a..9b26c7a6 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 @@ -22,8 +22,9 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Tem 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.constants.VOConstants; +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.entitycomparison.EntityComparisonUtilityFunctions; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.OrganizationUtilityFunctions; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Entity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.JsonObject; @@ -55,7 +56,7 @@ public class TemporalGrantVisualizationRequestHandler implements String entityURI) throws MalformedQueryParametersException { if (StringUtils.isBlank(entityURI)) { - entityURI = EntityComparisonUtilityFunctions + entityURI = OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -105,19 +106,19 @@ public class TemporalGrantVisualizationRequestHandler implements log, dataset, entityURI, - EntityComparisonConstants.DataVisMode.JSON); + VisConstants.DataVisMode.JSON); } else { return getSubjectEntityAndGenerateDataResponse( vitroRequest, log, dataset, - EntityComparisonUtilityFunctions + OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, vitroRequest), - EntityComparisonConstants.DataVisMode.JSON); + VisConstants.DataVisMode.JSON); } } else { @@ -129,7 +130,7 @@ public class TemporalGrantVisualizationRequestHandler implements log, dataset, entityURI, - EntityComparisonConstants.DataVisMode.CSV); + VisConstants.DataVisMode.CSV); } } @@ -157,7 +158,7 @@ public class TemporalGrantVisualizationRequestHandler implements private Map getSubjectEntityAndGenerateDataResponse( VitroRequest vitroRequest, Log log, Dataset dataset, - String subjectEntityURI, EntityComparisonConstants.DataVisMode visMode) + String subjectEntityURI, VisConstants.DataVisMode visMode) throws MalformedQueryParametersException { Entity organizationEntity = SelectOnModelUtilities @@ -165,7 +166,7 @@ public class TemporalGrantVisualizationRequestHandler implements if (organizationEntity.getSubEntities() == null) { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataErrorResponse(); } else { return prepareDataErrorResponse(); @@ -194,14 +195,14 @@ public class TemporalGrantVisualizationRequestHandler implements grantURIForAssociatedPeopleToVO = SelectOnModelUtilities .getGrantsForAssociatedPeople(dataset, organizationWithAssociatedPeople.getSubEntities()); - organizationEntity = EntityComparisonUtilityFunctions.mergeEntityIfShareSameURI( + organizationEntity = OrganizationUtilityFunctions.mergeEntityIfShareSameURI( organizationEntity, organizationWithAssociatedPeople); } if (allGrantURIToVO.isEmpty() && grantURIForAssociatedPeopleToVO.isEmpty()) { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataErrorResponse(); } else { return prepareDataErrorResponse(); @@ -209,7 +210,7 @@ public class TemporalGrantVisualizationRequestHandler implements } else { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataResponse(vitroRequest, organizationEntity); } else { return prepareDataResponse(organizationEntity); @@ -283,7 +284,7 @@ public class TemporalGrantVisualizationRequestHandler implements String standaloneTemplate = "entityComparisonOnGrantsStandalone.ftl"; - String organizationLabel = EntityComparisonUtilityFunctions.getEntityLabelFromDAO(vreq, + String organizationLabel = OrganizationUtilityFunctions.getEntityLabelFromDAO(vreq, entityURI); Map body = new HashMap(); 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 4583d4d8..bbd94a9d 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 @@ -22,8 +22,9 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Tem 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.constants.VOConstants; +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.entitycomparison.EntityComparisonUtilityFunctions; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.OrganizationUtilityFunctions; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Entity; import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.JsonObject; @@ -66,7 +67,7 @@ public class TemporalPublicationVisualizationRequestHandler implements if (StringUtils.isBlank(entityURI)) { - entityURI = EntityComparisonUtilityFunctions + entityURI = OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -85,7 +86,7 @@ public class TemporalPublicationVisualizationRequestHandler implements private Map getSubjectEntityAndGenerateDataResponse( VitroRequest vitroRequest, Log log, Dataset dataset, - String subjectEntityURI, EntityComparisonConstants.DataVisMode visMode) + String subjectEntityURI, VisConstants.DataVisMode visMode) throws MalformedQueryParametersException { Entity organizationEntity = SelectOnModelUtilities @@ -93,7 +94,7 @@ public class TemporalPublicationVisualizationRequestHandler implements if (organizationEntity.getSubEntities() == null) { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataErrorResponse(); } else { return prepareDataErrorResponse(); @@ -113,14 +114,14 @@ public class TemporalPublicationVisualizationRequestHandler implements documentURIForAssociatedPeopleTOVO = SelectOnModelUtilities .getPublicationsForAssociatedPeople(dataset, organizationWithAssociatedPeople.getSubEntities()); - organizationEntity = EntityComparisonUtilityFunctions.mergeEntityIfShareSameURI( + organizationEntity = OrganizationUtilityFunctions.mergeEntityIfShareSameURI( organizationEntity, organizationWithAssociatedPeople); } if (allDocumentURIToVOs.isEmpty() && documentURIForAssociatedPeopleTOVO.isEmpty()) { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataErrorResponse(); } else { return prepareDataErrorResponse(); @@ -128,7 +129,7 @@ public class TemporalPublicationVisualizationRequestHandler implements } else { - if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) { + if (VisConstants.DataVisMode.JSON.equals(visMode)) { return prepareStandaloneDataResponse(vitroRequest, organizationEntity); } else { return prepareDataResponse(organizationEntity); @@ -217,19 +218,19 @@ public class TemporalPublicationVisualizationRequestHandler implements log, dataset, entityURI, - EntityComparisonConstants.DataVisMode.JSON); + VisConstants.DataVisMode.JSON); } else { return getSubjectEntityAndGenerateDataResponse( vitroRequest, log, dataset, - EntityComparisonUtilityFunctions + OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, vitroRequest), - EntityComparisonConstants.DataVisMode.JSON); + VisConstants.DataVisMode.JSON); } } else { @@ -242,7 +243,7 @@ public class TemporalPublicationVisualizationRequestHandler implements log, dataset, entityURI, - EntityComparisonConstants.DataVisMode.CSV); + VisConstants.DataVisMode.CSV); } @@ -274,7 +275,7 @@ public class TemporalPublicationVisualizationRequestHandler implements String standaloneTemplate = "entityComparisonOnPublicationsStandalone.ftl"; - String organizationLabel = EntityComparisonUtilityFunctions + String organizationLabel = OrganizationUtilityFunctions .getEntityLabelFromDAO(vreq, entityURI); 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 380cafd6..1666563e 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 @@ -24,7 +24,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.Data import edu.cornell.mannlib.vitro.webapp.controller.visualization.freemarker.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.freemarker.entitycomparison.EntityComparisonUtilityFunctions; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.OrganizationUtilityFunctions; 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; @@ -54,7 +54,7 @@ public class EntityGrantCountRequestHandler implements String entityURI) throws MalformedQueryParametersException { if (StringUtils.isBlank(entityURI)) { - entityURI = EntityComparisonUtilityFunctions + entityURI = OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -102,7 +102,7 @@ public class EntityGrantCountRequestHandler implements vitroRequest, log, dataset, - EntityComparisonUtilityFunctions + OrganizationUtilityFunctions .getStaffProvidedOrComputedHighestLevelOrganization( log, dataset, @@ -125,7 +125,7 @@ public class EntityGrantCountRequestHandler implements Map> subOrganizationTypesResult = - EntityComparisonUtilityFunctions.getSubEntityTypes( + OrganizationUtilityFunctions.getSubEntityTypes( log, dataset, entityURI); return prepareDataResponse(entity, entity.getSubEntities(), subOrganizationTypesResult); @@ -173,7 +173,7 @@ public class EntityGrantCountRequestHandler implements throws MalformedQueryParametersException { Map> subOrganizationTypesResult = - EntityComparisonUtilityFunctions.getSubEntityTypes( + OrganizationUtilityFunctions.getSubEntityTypes( log, dataset, subjectOrganization); return prepareStandaloneDataResponse(vitroRequest, entity, subOrganizationTypesResult); @@ -250,7 +250,7 @@ public class EntityGrantCountRequestHandler implements String standaloneTemplate = "entityComparisonOnGrantsStandalone.ftl"; - String organizationLabel = EntityComparisonUtilityFunctions.getEntityLabelFromDAO(vreq, + String organizationLabel = OrganizationUtilityFunctions.getEntityLabelFromDAO(vreq, entityURI); Map body = new HashMap(); diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/mapofscience/MapOfScienceVisualizationRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/mapofscience/MapOfScienceVisualizationRequestHandler.java new file mode 100644 index 00000000..4b2bd1e8 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/mapofscience/MapOfScienceVisualizationRequestHandler.java @@ -0,0 +1,373 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.mapofscience; + +import java.util.ArrayList; +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.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; + +import com.google.gson.Gson; +import com.hp.hpl.jena.query.Dataset; + +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.constants.VOConstants; +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.entitycomparison.OrganizationUtilityFunctions; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity; +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; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.SubjectEntityJSON; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.SelectOnModelUtilities; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.UtilityFunctions; +import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler; + +public class MapOfScienceVisualizationRequestHandler implements + VisualizationRequestHandler { + + @Override + public ResponseValues generateStandardVisualization( + VitroRequest vitroRequest, Log log, Dataset dataset) + throws MalformedQueryParametersException { + + + String entityURI = vitroRequest + .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); + + return generateStandardVisualizationForScienceMapVis( + vitroRequest, log, dataset, entityURI); + } + + @Override + public ResponseValues generateVisualizationForShortURLRequests( + Map parameters, VitroRequest vitroRequest, Log log, + Dataset dataset) throws MalformedQueryParametersException { + + + return generateStandardVisualizationForScienceMapVis( + vitroRequest, log, dataset, parameters.get(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY)); + + } + + private ResponseValues generateStandardVisualizationForScienceMapVis( + VitroRequest vitroRequest, Log log, Dataset dataset, + String entityURI) throws MalformedQueryParametersException { + + if (StringUtils.isBlank(entityURI)) { + + entityURI = OrganizationUtilityFunctions + .getStaffProvidedOrComputedHighestLevelOrganization( + log, + dataset, + vitroRequest); + + } + + +// 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); + } + + private Map getSubjectEntityAndGenerateDataResponse( + VitroRequest vitroRequest, Log log, Dataset dataset, + String subjectEntityURI, VisConstants.DataVisMode visMode) + throws MalformedQueryParametersException { + + Entity organizationEntity = SelectOnModelUtilities + .getSubjectOrganizationHierarchy(dataset, subjectEntityURI); + + if (organizationEntity.getSubEntities() == null) { + + if (VisConstants.DataVisMode.JSON.equals(visMode)) { + return prepareStandaloneDataErrorResponse(); + } else { + return prepareDataErrorResponse(); + } + } + + Map documentURIForAssociatedPeopleTOVO = new HashMap(); + Map allDocumentURIToVOs = new HashMap(); + + allDocumentURIToVOs = SelectOnModelUtilities.getPublicationsForAllSubOrganizations(dataset, organizationEntity); + + Entity organizationWithAssociatedPeople = SelectOnModelUtilities + .getSubjectOrganizationAssociatedPeople(dataset, subjectEntityURI); + + if (organizationWithAssociatedPeople.getSubEntities() != null) { + + documentURIForAssociatedPeopleTOVO = SelectOnModelUtilities + .getPublicationsForAssociatedPeople(dataset, organizationWithAssociatedPeople.getSubEntities()); + + organizationEntity = OrganizationUtilityFunctions.mergeEntityIfShareSameURI( + organizationEntity, + organizationWithAssociatedPeople); + } + + if (allDocumentURIToVOs.isEmpty() && documentURIForAssociatedPeopleTOVO.isEmpty()) { + + if (VisConstants.DataVisMode.JSON.equals(visMode)) { + return prepareStandaloneDataErrorResponse(); + } else { + return prepareDataErrorResponse(); + } + + } else { + + if (VisConstants.DataVisMode.JSON.equals(visMode)) { + return prepareStandaloneDataResponse(vitroRequest, organizationEntity); + } else { + return prepareDataResponse(organizationEntity); + } + } + } + + /** + * Provides response when json file containing the publication count over the + * years is requested. + * + * @param entity + * @param subentities + * @param subOrganizationTypesResult + */ + private Map prepareDataResponse(Entity entity) { + + String entityLabel = entity.getEntityLabel(); + + /* + * To make sure that null/empty records for entity names do not cause any mischief. + * */ + if (StringUtils.isBlank(entityLabel)) { + entityLabel = "no-organization"; + } + + String outputFileName = UtilityFunctions.slugify(entityLabel) + + "_publications-per-year" + ".csv"; + + + Map fileData = new HashMap(); + + fileData.put(DataVisualizationController.FILE_NAME_KEY, + outputFileName); + fileData.put(DataVisualizationController.FILE_CONTENT_TYPE_KEY, + "application/octet-stream"); + fileData.put(DataVisualizationController.FILE_CONTENT_KEY, + getEntityPublicationsPerYearCSVContent(entity)); + return fileData; + } + + private Map prepareDataErrorResponse() { + + String outputFileName = "no-organization_publications-per-year.csv"; + + Map fileData = new HashMap(); + + fileData.put(DataVisualizationController.FILE_NAME_KEY, + outputFileName); + fileData.put(DataVisualizationController.FILE_CONTENT_TYPE_KEY, + "application/octet-stream"); + fileData.put(DataVisualizationController.FILE_CONTENT_KEY, ""); + return fileData; + } + + private Map prepareStandaloneDataErrorResponse() { + + Map fileData = new HashMap(); + + fileData.put(DataVisualizationController.FILE_CONTENT_TYPE_KEY, + "application/octet-stream"); + fileData.put(DataVisualizationController.FILE_CONTENT_KEY, + "{\"error\" : \"No Publications for this Organization found in VIVO.\"}"); + return fileData; + } + + @Override + public Map generateDataVisualization( + VitroRequest vitroRequest, Log log, Dataset dataset) + throws MalformedQueryParametersException { + + String entityURI = vitroRequest + .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); + + /* + * This will provide the data in json format mainly used for standalone tmeporal vis. + * */ + if (VisualizationFrameworkConstants.TEMPORAL_GRAPH_JSON_DATA_VIS_MODE + .equalsIgnoreCase(vitroRequest.getParameter( + VisualizationFrameworkConstants.VIS_MODE_KEY))) { + + if (StringUtils.isNotBlank(entityURI)) { + + return getSubjectEntityAndGenerateDataResponse( + vitroRequest, + log, + dataset, + entityURI, + VisConstants.DataVisMode.JSON); + } else { + + return getSubjectEntityAndGenerateDataResponse( + vitroRequest, + log, + dataset, + OrganizationUtilityFunctions + .getStaffProvidedOrComputedHighestLevelOrganization( + log, + dataset, + vitroRequest), + VisConstants.DataVisMode.JSON); + } + + } else { + /* + * This provides csv download files for the content in the tables. + * */ + + return getSubjectEntityAndGenerateDataResponse( + vitroRequest, + log, + dataset, + entityURI, + VisConstants.DataVisMode.CSV); + + } + + } + + + @Override + public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log, + Dataset dataset) throws MalformedQueryParametersException { + throw new UnsupportedOperationException("Entity Pub Count does not provide Ajax Response."); + } + + private Map prepareStandaloneDataResponse( + VitroRequest vitroRequest, + Entity entity) { + + Map fileData = new HashMap(); + + fileData.put(DataVisualizationController.FILE_CONTENT_TYPE_KEY, + "application/octet-stream"); + fileData.put(DataVisualizationController.FILE_CONTENT_KEY, + writePublicationsOverTimeJSON(vitroRequest, + entity)); + return fileData; + } + + private TemplateResponseValues prepareStandaloneMarkupResponse(VitroRequest vreq, + String entityURI) { + + String standaloneTemplate = "mapOfScienceStandalone.ftl"; + + String organizationLabel = OrganizationUtilityFunctions + .getEntityLabelFromDAO(vreq, + entityURI); + + Map body = new HashMap(); + body.put("title", organizationLabel + " - Map of Science Visualization"); + body.put("organizationURI", entityURI); + body.put("organizationLocalName", UtilityFunctions.getIndividualLocalName(entityURI, vreq)); + body.put("vivoDefaultNamespace", vreq.getWebappDaoFactory().getDefaultNamespace()); + body.put("organizationLabel", organizationLabel); + + return new TemplateResponseValues(standaloneTemplate, body); + } + + /** + * Function to generate a json file for year <-> publication count mapping. + * @param vreq + * @param subentities + * @param subOrganizationTypesResult + */ + private String writePublicationsOverTimeJSON(VitroRequest vreq, + Entity subjectEntity) { + + Gson json = new Gson(); + Set subEntitiesJson = new HashSet(); + + for (SubEntity subentity : subjectEntity.getSubEntities()) { + + JsonObject entityJson = new JsonObject( + subentity.getIndividualLabel()); + + List> yearPubCount = new ArrayList>(); + + for (Map.Entry pubEntry : UtilityFunctions + .getYearToActivityCount(subentity.getActivities()) + .entrySet()) { + + List currentPubYear = new ArrayList(); + 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.setYearToActivityCount(yearPubCount); + + entityJson.setOrganizationTypes(subentity.getEntityTypeLabels()); + + entityJson.setEntityURI(subentity.getIndividualURI()); + + entityJson.setLastCachedAtDateTime(subentity.getLastCachedAtDateTime()); + + if (subentity.getEntityClass().equals(VOConstants.EntityClassType.PERSON)) { + entityJson.setVisMode("PERSON"); + } else if (subentity.getEntityClass().equals(VOConstants.EntityClassType.ORGANIZATION)) { + entityJson.setVisMode("ORGANIZATION"); + } + + subEntitiesJson.add(entityJson); + } + + SubjectEntityJSON subjectEntityJSON = new SubjectEntityJSON(subjectEntity.getEntityLabel(), + subjectEntity.getEntityURI(), + subjectEntity.getParents()); + + subEntitiesJson.add(subjectEntityJSON); + + return json.toJson(subEntitiesJson); + } + + private String getEntityPublicationsPerYearCSVContent(Entity entity) { + + StringBuilder csvFileContent = new StringBuilder(); + + csvFileContent.append("Entity Name, Publication Count, Entity Type\n"); + + for (SubEntity subEntity : entity.getSubEntities()) { + + csvFileContent.append(StringEscapeUtils.escapeCsv(subEntity.getIndividualLabel())); + csvFileContent.append(", "); + csvFileContent.append(subEntity.getActivities().size()); + csvFileContent.append(", "); + + String allTypes = StringUtils.join(subEntity.getEntityTypeLabels(), "; "); + + csvFileContent.append(StringEscapeUtils.escapeCsv(allTypes)); + csvFileContent.append("\n"); + } + return csvFileContent.toString(); + } + +} \ No newline at end of file