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}'>
+
+#if>
+
+<#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