diff --git a/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml b/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml
index f979b5cc..850a1652 100644
--- a/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml
+++ b/productMods/WEB-INF/visualization/visualizations-beans-injection-fm.xml
@@ -32,11 +32,13 @@
class="edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.EntityPublicationCountRequestHandler" />
+ class="edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.cached.TemporalPublicationVisualizationRequestHandler" />
-
+
+
@@ -62,16 +64,16 @@
+
-
@@ -83,7 +85,11 @@
-
+
+
+
+
+
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
new file mode 100644
index 00000000..2776907a
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityComparisonConstants.java
@@ -0,0 +1,11 @@
+/* $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
new file mode 100644
index 00000000..b2918425
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalGrantVisualizationRequestHandler.java
@@ -0,0 +1,332 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.entitycomparison.cached;
+
+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 com.hp.hpl.jena.rdf.model.Model;
+
+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.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;
+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 TemporalGrantVisualizationRequestHandler implements
+ VisualizationRequestHandler {
+
+ @Override
+ public ResponseValues generateStandardVisualization(
+ VitroRequest vitroRequest, Log log, Dataset dataset)
+ throws MalformedQueryParametersException {
+
+ String entityURI = vitroRequest
+ .getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
+
+ if (StringUtils.isBlank(entityURI)) {
+
+ entityURI = EntityComparisonUtilityFunctions
+ .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);
+ }
+
+ @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 temporal 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,
+ EntityComparisonConstants.DataVisMode.JSON);
+ } else {
+
+ return getSubjectEntityAndGenerateDataResponse(
+ vitroRequest,
+ log,
+ dataset,
+ EntityComparisonUtilityFunctions
+ .getStaffProvidedOrComputedHighestLevelOrganization(
+ log,
+ dataset,
+ vitroRequest),
+ EntityComparisonConstants.DataVisMode.JSON);
+ }
+
+ } else {
+ /*
+ * This provides csv download files for the content in the tables.
+ * */
+ return getSubjectEntityAndGenerateDataResponse(
+ vitroRequest,
+ log,
+ dataset,
+ entityURI,
+ EntityComparisonConstants.DataVisMode.CSV);
+ }
+ }
+
+ private Map prepareDataErrorResponse() {
+
+ String outputFileName = "no-organization_grants-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;
+ }
+
+ @Override
+ public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log,
+ Dataset dataset) throws MalformedQueryParametersException {
+
+ throw new UnsupportedOperationException("Entity Grant Count "
+ + "does not provide Ajax response.");
+ }
+
+ private Map getSubjectEntityAndGenerateDataResponse(
+ VitroRequest vitroRequest, Log log, Dataset dataset,
+ String subjectEntityURI, EntityComparisonConstants.DataVisMode visMode)
+ throws MalformedQueryParametersException {
+
+ Entity organizationEntity = SelectOnModelUtilities
+ .getSubjectOrganizationHierarchy(dataset, subjectEntityURI);
+
+ if (organizationEntity.getSubEntities() == null) {
+
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
+ return prepareStandaloneDataErrorResponse();
+ } else {
+ return prepareDataErrorResponse();
+ }
+ }
+
+ Map grantURIForAssociatedPeopleToVO = new HashMap();
+ Map allGrantURIToVO = new HashMap();
+
+ allGrantURIToVO = SelectOnModelUtilities.getGrantsForAllSubOrganizations(dataset, organizationEntity);
+
+ if (allGrantURIToVO.isEmpty() && grantURIForAssociatedPeopleToVO.isEmpty()) {
+
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
+ return prepareStandaloneDataErrorResponse();
+ } else {
+ return prepareDataErrorResponse();
+ }
+
+ } else {
+
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
+ return prepareStandaloneDataResponse(vitroRequest, organizationEntity);
+ } else {
+ return prepareDataResponse(organizationEntity);
+ }
+ }
+ }
+
+ 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 Grants for this Organization found in VIVO.\"}");
+ return fileData;
+ }
+
+
+ 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,
+ writeGrantsOverTimeJSON(vitroRequest,
+ entity.getSubEntities()));
+ return fileData;
+ }
+
+ /**
+ * Provides response when json file containing the grant 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)
+ + "_grants-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,
+ getEntityGrantsPerYearCSVContent(entity));
+ return fileData;
+ }
+
+
+ private TemplateResponseValues prepareStandaloneMarkupResponse(VitroRequest vreq,
+ String entityURI) {
+
+ Portal portal = vreq.getPortal();
+ String standaloneTemplate = "entityComparisonOnGrantsStandalone.ftl";
+
+ String organizationLabel = EntityComparisonUtilityFunctions.getEntityLabelFromDAO(vreq,
+ entityURI);
+
+ Map body = new HashMap();
+ body.put("portalBean", portal);
+ body.put("title", organizationLabel + " - Temporal Graph Visualization");
+ body.put("organizationURI", entityURI);
+ body.put("organizationLabel", organizationLabel);
+
+ return new TemplateResponseValues(standaloneTemplate, body);
+ }
+
+ /**
+ * Function to generate a json file for year <-> grant count mapping.
+ * @param vreq
+ * @param subentities
+ * @param subOrganizationTypesResult
+ */
+ private String writeGrantsOverTimeJSON(VitroRequest vreq,
+ Set subentities) {
+
+ Gson json = new Gson();
+ Set subEntitiesJson = new HashSet();
+
+ for (SubEntity subentity : subentities) {
+ JsonObject entityJson = new JsonObject(
+ subentity.getIndividualLabel());
+
+ List> yearGrantCount = new ArrayList>();
+
+ for (Map.Entry grantEntry : UtilityFunctions
+ .getYearToActivityCount(subentity.getActivities())
+ .entrySet()) {
+
+ List currentGrantYear = new ArrayList();
+ if (grantEntry.getKey().equals(
+ VOConstants.DEFAULT_GRANT_YEAR)) {
+ currentGrantYear.add(-1);
+ } else {
+ currentGrantYear.add(Integer.parseInt(grantEntry.getKey()));
+ }
+
+ currentGrantYear.add(grantEntry.getValue());
+ yearGrantCount.add(currentGrantYear);
+ }
+
+ entityJson.setYearToActivityCount(yearGrantCount);
+
+ entityJson.setOrganizationTypes(subentity.getEntityTypeLabels());
+
+ entityJson.setEntityURI(subentity.getIndividualURI());
+
+ if (subentity.getEntityClass().equals(VOConstants.EntityClassType.PERSON)) {
+ entityJson.setVisMode("PERSON");
+ } else if (subentity.getEntityClass().equals(VOConstants.EntityClassType.ORGANIZATION)) {
+ entityJson.setVisMode("ORGANIZATION");
+ }
+
+ subEntitiesJson.add(entityJson);
+ }
+
+ return json.toJson(subEntitiesJson);
+ }
+
+ private String getEntityGrantsPerYearCSVContent(Entity entity) {
+
+ StringBuilder csvFileContent = new StringBuilder();
+
+ csvFileContent.append("Entity Name, Grant 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();
+ }
+}
diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityPublicationRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java
similarity index 95%
rename from src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityPublicationRequestHandler.java
rename to src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java
index 1b65c18f..686a0d1d 100644
--- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/EntityPublicationRequestHandler.java
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/entitycomparison/cached/TemporalPublicationVisualizationRequestHandler.java
@@ -35,13 +35,9 @@ import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.Select
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.VisualizationRequestHandler;
-public class EntityPublicationRequestHandler implements
+public class TemporalPublicationVisualizationRequestHandler implements
VisualizationRequestHandler {
- public enum DataVisMode {
- CSV, JSON
- };
-
@Override
public ResponseValues generateStandardVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset)
@@ -67,15 +63,12 @@ public class EntityPublicationRequestHandler implements
System.out.println(entry.getKey() + " -> " + entry.getValue().size());
}
-
-
-
return prepareStandaloneMarkupResponse(vitroRequest, entityURI);
}
private Map getSubjectEntityAndGenerateDataResponse(
VitroRequest vitroRequest, Log log, Dataset dataset,
- String subjectEntityURI, DataVisMode visMode)
+ String subjectEntityURI, EntityComparisonConstants.DataVisMode visMode)
throws MalformedQueryParametersException {
@@ -84,7 +77,7 @@ public class EntityPublicationRequestHandler implements
if (organizationEntity.getSubEntities() == null) {
- if (DataVisMode.JSON.equals(visMode)) {
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
return prepareStandaloneDataErrorResponse();
} else {
return prepareDataErrorResponse();
@@ -113,7 +106,7 @@ public class EntityPublicationRequestHandler implements
if (allDocumentURIToVOs.isEmpty() && documentURIForAssociatedPeopleTOVO.isEmpty()) {
- if (DataVisMode.JSON.equals(visMode)) {
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
return prepareStandaloneDataErrorResponse();
} else {
return prepareDataErrorResponse();
@@ -121,7 +114,7 @@ public class EntityPublicationRequestHandler implements
} else {
- if (DataVisMode.JSON.equals(visMode)) {
+ if (EntityComparisonConstants.DataVisMode.JSON.equals(visMode)) {
return prepareStandaloneDataResponse(vitroRequest, organizationEntity);
} else {
return prepareDataResponse(organizationEntity);
@@ -210,7 +203,7 @@ public class EntityPublicationRequestHandler implements
log,
dataset,
entityURI,
- DataVisMode.JSON);
+ EntityComparisonConstants.DataVisMode.JSON);
} else {
return getSubjectEntityAndGenerateDataResponse(
@@ -222,7 +215,7 @@ public class EntityPublicationRequestHandler implements
log,
dataset,
vitroRequest),
- DataVisMode.JSON);
+ EntityComparisonConstants.DataVisMode.JSON);
}
} else {
@@ -235,7 +228,7 @@ public class EntityPublicationRequestHandler implements
log,
dataset,
entityURI,
- DataVisMode.CSV);
+ EntityComparisonConstants.DataVisMode.CSV);
}
@@ -321,7 +314,6 @@ public class EntityPublicationRequestHandler implements
entityJson.setOrganizationTypes(subentity.getEntityTypeLabels());
-
entityJson.setEntityURI(subentity.getIndividualURI());
if (subentity.getEntityClass().equals(VOConstants.EntityClassType.PERSON)) {
diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/ModelConstructorUtilities.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/ModelConstructorUtilities.java
index d6295f4c..a6678c76 100644
--- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/ModelConstructorUtilities.java
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/ModelConstructorUtilities.java
@@ -11,6 +11,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryP
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.ModelFactoryInterface;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.OrganizationAssociatedPeopleModelWithTypesFactory;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.OrganizationModelWithTypesFactory;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.OrganizationToGrantsForSubOrganizationsFactory;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.OrganizationToPublicationsForSubOrganizationsFactory;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory.PersonToPublicationsFactory;
@@ -20,6 +21,7 @@ public class ModelConstructorUtilities {
private static final Map modelTypeIdentifierToFactory = new HashMap() {{
put(PersonToPublicationsModelConstructor.MODEL_TYPE, new PersonToPublicationsFactory());
put(OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE, new OrganizationToPublicationsForSubOrganizationsFactory());
+ put(OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE, new OrganizationToGrantsForSubOrganizationsFactory());
put(OrganizationAssociatedPeopleModelWithTypesConstructor.MODEL_TYPE, new OrganizationAssociatedPeopleModelWithTypesFactory());
put(OrganizationModelWithTypesConstructor.MODEL_TYPE, new OrganizationModelWithTypesFactory());
}};
diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/OrganizationToGrantsForSubOrganizationsModelConstructor.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/OrganizationToGrantsForSubOrganizationsModelConstructor.java
new file mode 100644
index 00000000..e4dc522f
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/OrganizationToGrantsForSubOrganizationsModelConstructor.java
@@ -0,0 +1,133 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor;
+
+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.Query;
+import com.hp.hpl.jena.query.QueryExecution;
+import com.hp.hpl.jena.query.QueryExecutionFactory;
+import com.hp.hpl.jena.query.QueryFactory;
+import com.hp.hpl.jena.query.Syntax;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+
+import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
+import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.ModelConstructor;
+
+public class OrganizationToGrantsForSubOrganizationsModelConstructor implements ModelConstructor {
+
+ protected static final Syntax SYNTAX = Syntax.syntaxARQ;
+
+ private Dataset dataset;
+
+ public static final String MODEL_TYPE = "ORGANIZATION_TO_GRANTS_FOR_SUBORGANIZATIONS";
+
+ private String organizationURI;
+
+ private Log log = LogFactory.getLog(OrganizationToGrantsForSubOrganizationsModelConstructor.class.getName());
+
+ private long before, after;
+
+ public OrganizationToGrantsForSubOrganizationsModelConstructor(String organizationURI, Dataset dataset) {
+ this.organizationURI = organizationURI;
+ this.dataset = dataset;
+ }
+
+ private String constructOrganizationToGrantsQuery() {
+
+ return ""
+ + " CONSTRUCT { "
+ + " <" + organizationURI + "> rdfs:label ?organizationLabel . "
+ + " <" + organizationURI + "> vivosocnet:lastCachedAt ?now . "
+ + " <" + organizationURI + "> vivosocnet:hasPersonWithGrant ?Grant . "
+ + " "
+ + " ?Grant rdf:type core:Grant . "
+ + " ?Grant rdfs:label ?grantLabel . "
+ + " "
+ + " ?Grant vivosocnet:startDateTimeOnGrant ?startDateTimeValueForGrant . "
+ + " ?Grant vivosocnet:endDateTimeOnGrant ?endDateTimeValueForGrant . "
+ + " "
+ + " ?Grant vivosocnet:startDateTimeOnRole ?startDateTimeValue . "
+ + " ?Grant vivosocnet:endDateTimeOnRole ?endDateTimeValue . "
+ + " } "
+ + " WHERE { "
+ + " <" + organizationURI + "> rdfs:label ?organizationLabel . "
+ + " <" + organizationURI + "> core:hasSubOrganization* ?subOrganization . "
+ + " ?subOrganization core:organizationForPosition ?Position . "
+ + " ?Position core:positionForPerson ?Person . "
+ + " ?Person core:hasInvestigatorRole ?Role . "
+ + " ?Role core:roleIn ?Grant . "
+ + " ?Grant rdfs:label ?grantLabel . "
+ + " "
+ + " OPTIONAL { "
+ + " ?Grant core:dateTimeInterval ?dateTimeIntervalValueForGrant . "
+ + " OPTIONAL { "
+ + " ?dateTimeIntervalValueForGrant core:start ?startDateForGrant . "
+ + " ?startDateForGrant core:dateTime ?startDateTimeValueForGrant . "
+ + " } "
+ + " OPTIONAL { "
+ + " ?dateTimeIntervalValueForGrant core:end ?endDateForGrant . "
+ + " ?endDateForGrant core:dateTime ?endDateTimeValueForGrant "
+ + " } "
+ + " } "
+ + " "
+ + " OPTIONAL { "
+ + " ?Role core:dateTimeInterval ?dateTimeIntervalValue . "
+ + " OPTIONAL { "
+ + " ?dateTimeIntervalValue core:start ?startDate . "
+ + " ?startDate core:dateTime ?startDateTimeValue . "
+ + " } "
+ + " "
+ + " OPTIONAL { "
+ + " ?dateTimeIntervalValue core:end ?endDate . "
+ + " ?endDate core:dateTime ?endDateTimeValue . "
+ + " } "
+ + " } "
+ + " "
+ + " LET(?now := afn:now()) "
+ + " } ";
+
+ }
+
+ private Model executeQuery(String constructQuery) {
+
+ System.out.println("in execute query - org to grants for - " + organizationURI);
+
+ Model constructedModel = ModelFactory.createDefaultModel();
+
+ before = System.currentTimeMillis();
+ log.debug("CONSTRUCT query string : " + constructQuery);
+
+ Query query = null;
+
+ try {
+ query = QueryFactory.create(QueryConstants.getSparqlPrefixQuery()
+ + constructQuery, SYNTAX);
+ } catch (Throwable th) {
+ log.error("Could not create CONSTRUCT SPARQL query for query "
+ + "string. " + th.getMessage());
+ log.error(constructQuery);
+ }
+
+ QueryExecution qe = QueryExecutionFactory.create(query, dataset);
+
+ try {
+ qe.execConstruct(constructedModel);
+ } finally {
+ qe.close();
+ }
+
+ after = System.currentTimeMillis();
+ log.debug("Time taken to execute the CONSTRUCT queries is in milliseconds: "
+ + (after - before));
+
+ return constructedModel;
+ }
+
+ public Model getConstructedModel() throws MalformedQueryParametersException {
+ return executeQuery(constructOrganizationToGrantsQuery());
+ }
+}
diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/factory/OrganizationToGrantsForSubOrganizationsFactory.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/factory/OrganizationToGrantsForSubOrganizationsFactory.java
new file mode 100644
index 00000000..b3b93b28
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/modelconstructor/factory/OrganizationToGrantsForSubOrganizationsFactory.java
@@ -0,0 +1,46 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.factory;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.Model;
+
+import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.OrganizationToGrantsForSubOrganizationsModelConstructor;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.ConstructedModelTracker;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils.ModelConstructor;
+
+public class OrganizationToGrantsForSubOrganizationsFactory implements
+ ModelFactoryInterface {
+
+ @Override
+ public Model getOrCreateModel(String uri, Dataset dataset)
+ throws MalformedQueryParametersException {
+
+ Model candidateModel = ConstructedModelTracker.getModel(
+ ConstructedModelTracker
+ .generateModelIdentifier(
+ uri,
+ OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE));
+
+ if (candidateModel != null) {
+
+ return candidateModel;
+
+ } else {
+
+ ModelConstructor model = new OrganizationToGrantsForSubOrganizationsModelConstructor(uri, dataset);
+
+ Model constructedModel = model.getConstructedModel();
+ ConstructedModelTracker.trackModel(
+ ConstructedModelTracker
+ .generateModelIdentifier(
+ uri,
+ OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE),
+ constructedModel);
+
+ return constructedModel;
+ }
+
+ }
+
+}
diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/SelectOnModelUtilities.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/SelectOnModelUtilities.java
index f1e44fb7..6725e419 100644
--- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/SelectOnModelUtilities.java
+++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/SelectOnModelUtilities.java
@@ -21,6 +21,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryP
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.ModelConstructorUtilities;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.OrganizationAssociatedPeopleModelWithTypesConstructor;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.OrganizationModelWithTypesConstructor;
+import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.OrganizationToGrantsForSubOrganizationsModelConstructor;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.OrganizationToPublicationsForSubOrganizationsModelConstructor;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.modelconstructor.PersonToPublicationsModelConstructor;
import edu.cornell.mannlib.vitro.webapp.visualization.freemarker.valueobjects.Activity;
@@ -267,6 +268,89 @@ public class SelectOnModelUtilities {
return currentEntityPublications;
}
+
+ private static Collection getGrantForEntity(
+ ResultSet queryResult,
+ Map allGrantURIToVO) {
+
+ Set currentEntityGrants = new HashSet();
+
+ while (queryResult.hasNext()) {
+
+ QuerySolution solution = queryResult.nextSolution();
+
+ RDFNode grantNode = solution.get(QueryFieldLabels.GRANT_URL);
+ Activity coreGrant;
+
+ if (allGrantURIToVO.containsKey(grantNode.toString())) {
+ coreGrant = allGrantURIToVO.get(grantNode.toString());
+
+ } else {
+
+ coreGrant = new Activity(grantNode.toString());
+ allGrantURIToVO.put(grantNode.toString(), coreGrant);
+
+ RDFNode grantStartDateNode = solution.get(QueryFieldLabels.ROLE_START_DATE);
+
+ if (grantStartDateNode != null) {
+ coreGrant.setActivityDate(grantStartDateNode.toString());
+ } else {
+ grantStartDateNode = solution
+ .get(QueryFieldLabels.GRANT_START_DATE);
+ if (grantStartDateNode != null) {
+ coreGrant.setActivityDate(grantStartDateNode.toString());
+ }
+ }
+ }
+ currentEntityGrants.add(coreGrant);
+ }
+ return currentEntityGrants;
+ }
+
+ public static Map getGrantsForAllSubOrganizations(
+ Dataset dataset, Entity organizationEntity)
+ throws MalformedQueryParametersException {
+ Map allGrantURIToVO = new HashMap();
+
+ for (SubEntity subOrganization : organizationEntity.getSubEntities()) {
+
+ Model subOrganizationGrantsModel = ModelConstructorUtilities
+ .getOrConstructModel(
+ subOrganization.getIndividualURI(),
+ OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE,
+ dataset);
+
+ System.out.println("getting grants for " + subOrganization.getIndividualLabel());
+
+ Map fieldLabelToOutputFieldLabel = new HashMap();
+ fieldLabelToOutputFieldLabel.put("grant", QueryFieldLabels.GRANT_URL);
+ fieldLabelToOutputFieldLabel.put("grantLabel", QueryFieldLabels.GRANT_LABEL);
+ fieldLabelToOutputFieldLabel.put("grantStartDate", QueryFieldLabels.GRANT_START_DATE);
+ fieldLabelToOutputFieldLabel.put("roleStartDate", QueryFieldLabels.ROLE_START_DATE);
+
+ String whereClause = ""
+ + " <" + subOrganization.getIndividualURI() + "> vivosocnet:hasPersonWithGrant ?grant . "
+ + " ?grant rdfs:label ?grantLabel . "
+ + " OPTIONAL { "
+ + " ?grant vivosocnet:startDateTimeOnGrant ?grantStartDate } . "
+ + " OPTIONAL { "
+ + " ?grant vivosocnet:startDateTimeOnRole ?roleStartDate } . ";
+
+ QueryRunner subOrganizationGrantsQuery =
+ new GenericQueryRunnerOnModel(fieldLabelToOutputFieldLabel,
+ "",
+ whereClause,
+ "",
+ subOrganizationGrantsModel);
+
+ subOrganization.addActivities(getGrantForEntity(
+ subOrganizationGrantsQuery.getQueryResult(),
+ allGrantURIToVO));
+
+ }
+ return allGrantURIToVO;
+ }
+
public static Map getPublicationsForAssociatedPeople(
Dataset dataset, Collection people)
throws MalformedQueryParametersException {