1. Modified visualization request handlers so that they can handle privileges i.e. give access to users who have the right permissions to view that visualization related page.

2. Improved how short url parameters were extracted.
3. Added a new feature "Refresh Visualziation Cache" which reconstructs all the models that are currently saved. This so that the admin can rebuild the vis cache instead of having to restart the server to rebuilding the cache.
This commit is contained in:
tankchintan 2011-07-12 19:30:05 +00:00
parent 5a64d388c8
commit f2148a785c
33 changed files with 490 additions and 27 deletions

View file

@ -43,6 +43,9 @@
<bean id="map_of_science" <bean id="map_of_science"
class="edu.cornell.mannlib.vitro.webapp.visualization.mapofscience.MapOfScienceVisualizationRequestHandler" /> class="edu.cornell.mannlib.vitro.webapp.visualization.mapofscience.MapOfScienceVisualizationRequestHandler" />
<bean id="regenerate_vis_models"
class="edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.ModelConstructorRequestHandler" />
<bean id="visualizationInjector" <bean id="visualizationInjector"
class="edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationInjector"> class="edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationInjector">
<property name="visualizations"> <property name="visualizations">
@ -111,6 +114,10 @@
<entry key="map-of-science"> <entry key="map-of-science">
<ref bean="map_of_science"></ref> <ref bean="map_of_science"></ref>
</entry>
<entry key="refresh-cache">
<ref bean="regenerate_vis_models"></ref>
</entry> </entry>
</map> </map>

View file

@ -0,0 +1,56 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#if (currentModels?size > 0)>
Below cached models will be regenerated.<hr />
<ul>
<#list currentModels as model>
<li>
<#if model.uri == "">
URI Independent Model
<#else>
<a href="${urls.base}/individual?uri=${model.uri?url}">${model.individualLabel}</a>
</#if>
<span class="display-title">${model.humanReadableType}</span>
</li>
</#list>
</ul>
<#else>
Currently there are no constructed models for use by visualization.
</#if>
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/search.css" />')}
<#assign standardVisualizationURLRoot ="/visualization">
<#assign ajaxVisualizationURLRoot ="/visualizationAjax">
<#assign dataVisualizationURLRoot ="/visualizationData">
<#assign shortVisualizationURLRoot ="/vis">
<#assign refreshCacheVisTypeParam = "refresh-cache">
<#assign regenerateCacheURL = "${urls.base}${ajaxVisualizationURLRoot}?vis=${refreshCacheVisTypeParam}">
<script language="JavaScript" type="text/javascript">
$(document).ready(function() {
$.ajax({
url: "${regenerateCacheURL}",
dataType: "json",
timeout: 5 * 60 * 1000
});
});
</script>

View file

@ -16,6 +16,7 @@ import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
@ -41,6 +42,27 @@ public class AjaxVisualizationController extends FreemarkerHttpServlet {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static ServletContext servletContext; public static ServletContext servletContext;
@Override
protected Actions requiredActions(VitroRequest vreq) {
/*
* Based on the query parameters passed via URI get the appropriate visualization
* request handler.
* */
VisualizationRequestHandler visRequestHandler =
getVisualizationRequestHandler(vreq);
if (visRequestHandler != null) {
Actions requiredPrivileges = visRequestHandler.getRequiredPrivileges();
if (requiredPrivileges != null) {
return requiredPrivileges;
}
}
return super.requiredActions(vreq);
}
@Override @Override
public void doGet(HttpServletRequest request, HttpServletResponse response) public void doGet(HttpServletRequest request, HttpServletResponse response)

View file

@ -45,7 +45,7 @@ public class DataVisualizationController extends VitroHttpServlet {
@Override @Override
public void doGet(HttpServletRequest request, HttpServletResponse response) public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException { throws IOException, ServletException {
VitroRequest vreq = new VitroRequest(request); VitroRequest vreq = new VitroRequest(request);
/* /*
@ -55,8 +55,15 @@ public class DataVisualizationController extends VitroHttpServlet {
VisualizationRequestHandler visRequestHandler = VisualizationRequestHandler visRequestHandler =
getVisualizationRequestHandler(vreq); getVisualizationRequestHandler(vreq);
if (visRequestHandler != null) {
if (visRequestHandler != null) {
if (visRequestHandler.getRequiredPrivileges() != null) {
if (!isAuthorizedToDisplayPage(request, response, visRequestHandler.getRequiredPrivileges())) {
return;
}
}
/* /*
* Pass the query to the selected visualization request handler & render the vis. * Pass the query to the selected visualization request handler & render the vis.
* Since the visualization content is directly added to the response object we are side- * Since the visualization content is directly added to the response object we are side-

View file

@ -6,11 +6,9 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -18,6 +16,7 @@ import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
@ -42,6 +41,25 @@ public class ShortURLVisualizationController extends FreemarkerHttpServlet {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static ServletContext servletContext; public static ServletContext servletContext;
@Override
protected Actions requiredActions(VitroRequest vreq) {
/*
* Based on the query parameters passed via URI get the appropriate visualization
* request handler.
* */
VisualizationRequestHandler visRequestHandler =
getVisualizationRequestHandler(vreq);
if (visRequestHandler != null) {
Actions requiredPrivileges = visRequestHandler.getRequiredPrivileges();
if (requiredPrivileges != null) {
return requiredPrivileges;
}
}
return super.requiredActions(vreq);
}
@Override @Override
protected ResponseValues processRequest(VitroRequest vreq) { protected ResponseValues processRequest(VitroRequest vreq) {
@ -145,7 +163,7 @@ public class ShortURLVisualizationController extends FreemarkerHttpServlet {
* url. * url.
* */ * */
String subjectURI = null; String subjectURI = null;
if (StringUtils.isBlank(matchedPatternGroups.get(1))) { if (matchedPatternGroups.size() <= 1) {
subjectURI = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY); subjectURI = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY);
@ -226,21 +244,17 @@ public class ShortURLVisualizationController extends FreemarkerHttpServlet {
* as an input. * as an input.
*/ */
private List<String> extractShortURLParameters(VitroRequest vitroRequest) { private List<String> extractShortURLParameters(VitroRequest vitroRequest) {
Matcher requestPatternMatcher = VisualizationFrameworkConstants
.SHORT_URL_REQUEST_PATTERN
.matcher(vitroRequest.getRequestURI()
.substring(vitroRequest.getContextPath().length()));
List<String> matchedGroups = new ArrayList<String>(); List<String> matchedGroups = new ArrayList<String>();
if(requestPatternMatcher.matches() && requestPatternMatcher.groupCount() >= 1) { String[] urlParams = vitroRequest.getRequestURI().substring(vitroRequest.getContextPath().length()+1).split("/");
for (int ii=1; ii<=requestPatternMatcher.groupCount(); ii++) { if (urlParams.length > 1
matchedGroups.add(requestPatternMatcher.group(ii)); && urlParams[0].equalsIgnoreCase("vis")) {
} for (int ii=1; ii < urlParams.length; ii++) {
matchedGroups.add(urlParams[ii]);
} }
}
return matchedGroups; return matchedGroups;
} }

View file

@ -11,6 +11,7 @@ import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
@ -35,10 +36,28 @@ public class StandardVisualizationController extends FreemarkerHttpServlet {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static ServletContext servletContext; public static ServletContext servletContext;
@Override
protected Actions requiredActions(VitroRequest vreq) {
/*
* Based on the query parameters passed via URI get the appropriate visualization
* request handler.
* */
VisualizationRequestHandler visRequestHandler =
getVisualizationRequestHandler(vreq);
if (visRequestHandler != null) {
Actions requiredPrivileges = visRequestHandler.getRequiredPrivileges();
if (requiredPrivileges != null) {
return requiredPrivileges;
}
}
return super.requiredActions(vreq);
}
@Override @Override
protected ResponseValues processRequest(VitroRequest vreq) { protected ResponseValues processRequest(VitroRequest vreq) {
/* /*
* Based on the query parameters passed via URI get the appropriate visualization * Based on the query parameters passed via URI get the appropriate visualization
* request handler. * request handler.
@ -122,6 +141,7 @@ public class StandardVisualizationController extends FreemarkerHttpServlet {
.VIS_TYPE_KEY); .VIS_TYPE_KEY);
VisualizationRequestHandler visRequestHandler = null; VisualizationRequestHandler visRequestHandler = null;
try { try {
visRequestHandler = VisualizationsDependencyInjector visRequestHandler = VisualizationsDependencyInjector
.getVisualizationIDsToClassMap(getServletContext()) .getVisualizationIDsToClassMap(getServletContext())

View file

@ -14,6 +14,7 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.DataVisualizationController; import edu.cornell.mannlib.vitro.webapp.controller.visualization.DataVisualizationController;
@ -294,4 +295,9 @@ public class CoAuthorshipRequestHandler implements VisualizationRequestHandler {
return fileData; return fileData;
} }
@Override
public Actions getRequiredPrivileges() {
return null;
}
} }

View file

@ -13,6 +13,7 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.DataVisualizationController; import edu.cornell.mannlib.vitro.webapp.controller.visualization.DataVisualizationController;
@ -288,4 +289,9 @@ public class CoPIGrantCountRequestHandler implements VisualizationRequestHandler
} }
@Override
public Actions getRequiredPrivileges() {
return null;
}
} }

View file

@ -17,6 +17,7 @@ import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -346,4 +347,10 @@ public class EntityPublicationCountRequestHandler implements
return csvFileContent.toString(); return csvFileContent.toString();
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -16,6 +16,7 @@ import org.apache.commons.logging.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -378,5 +379,11 @@ public class TemporalGrantVisualizationRequestHandler implements
} }
return csvFileContent.toString(); return csvFileContent.toString();
}
@Override
public Actions getRequiredPrivileges() {
return null;
} }
} }

View file

@ -16,6 +16,7 @@ import org.apache.commons.logging.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -370,4 +371,10 @@ public class TemporalPublicationVisualizationRequestHandler implements
return csvFileContent.toString(); return csvFileContent.toString();
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -17,6 +17,7 @@ import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -345,5 +346,11 @@ public class EntityGrantCountRequestHandler implements
return csvFileContent.toString(); return csvFileContent.toString();
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -0,0 +1,21 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.exceptions;
public class IllegalConstructedModelIdentifierException extends Exception {
private static final long serialVersionUID = 1L;
public IllegalConstructedModelIdentifierException(String message) {
super(message);
}
public IllegalConstructedModelIdentifierException(Exception cause) {
super(createMessage(cause), cause);
}
private static String createMessage(Exception cause) {
return "Illegal Constructed Model Identifier provided. It should be of the form <TYPE>$<URI>. " + cause.getMessage();
}
}

View file

@ -19,6 +19,7 @@ import org.apache.commons.logging.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -602,6 +603,12 @@ public class MapOfScienceVisualizationRequestHandler implements
this.journalToPublicationCount = journalToPublicationCount; this.journalToPublicationCount = journalToPublicationCount;
} }
}
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
} }
} }

View file

@ -0,0 +1,144 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor;
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.logging.Log;
import com.google.gson.Gson;
import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.usepages.RefreshVisualizationCacheAction;
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.DataVisualizationController;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.IllegalConstructedModelIdentifierException;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.ConstructedModel;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.ConstructedModelTracker;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler;
public class ModelConstructorRequestHandler implements
VisualizationRequestHandler {
public static final Actions REQUIRED_ACTIONS = new Actions(new RefreshVisualizationCacheAction());
@Override
public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
return regenerateConstructedModels(vitroRequest, dataSource);
}
@Override
public Map<String, String> generateDataVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset)
throws MalformedQueryParametersException {
throw new UnsupportedOperationException(
"Cached Model does not provide Data Response.");
}
private ResponseValues renderRefreshCacheMarkup(VitroRequest vitroRequest,
Log log, Dataset dataSource) {
String standaloneTemplate = "regenerateConstructedModels.ftl";
List<ConstructedModel> currentConstructedModels = new ArrayList<ConstructedModel>();
List<String> unidentifiedModels = new ArrayList<String>();
for (String currentIdentifier : ConstructedModelTracker.getAllModels()
.keySet()) {
try {
ConstructedModel parseModelIdentifier = ConstructedModelTracker
.parseModelIdentifier(currentIdentifier);
parseModelIdentifier.setIndividualLabel(UtilityFunctions
.getIndividualLabelFromDAO(vitroRequest,
parseModelIdentifier.getUri()));
currentConstructedModels.add(parseModelIdentifier);
} catch (IllegalConstructedModelIdentifierException e) {
unidentifiedModels.add(e.getMessage());
}
}
Map<String, Object> body = new HashMap<String, Object>();
body.put("title", "Regenerate Constructed Models");
body.put("vivoDefaultNamespace", vitroRequest.getWebappDaoFactory()
.getDefaultNamespace());
body.put("currentModels", currentConstructedModels);
body.put("unidentifiedModels", unidentifiedModels);
return new TemplateResponseValues(standaloneTemplate, body);
}
private Map<String, String> regenerateConstructedModels(VitroRequest vitroRequest,
Dataset dataSource) {
List<ConstructedModel> refreshedModels = new ArrayList<ConstructedModel>();
Set<String> currentModelIdentifiers = new HashSet<String>(ConstructedModelTracker.getAllModels().keySet());
for (String currentIdentifier : currentModelIdentifiers) {
try {
ConstructedModel parseModelIdentifier = ConstructedModelTracker
.parseModelIdentifier(currentIdentifier);
ConstructedModelTracker.removeModel(parseModelIdentifier.getUri(),
parseModelIdentifier.getType());
ModelConstructorUtilities.getOrConstructModel(parseModelIdentifier.getUri(),
parseModelIdentifier.getType(), dataSource);
refreshedModels.add(parseModelIdentifier);
} catch (IllegalConstructedModelIdentifierException e) {
e.printStackTrace();
} catch (MalformedQueryParametersException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Map<String, String> fileData = new HashMap<String, String>();
fileData.put(DataVisualizationController.FILE_CONTENT_TYPE_KEY,
"application/octet-stream");
Gson json = new Gson();
fileData.put(DataVisualizationController.FILE_CONTENT_KEY,
json.toJson(refreshedModels));
return fileData;
}
@Override
public ResponseValues generateStandardVisualization(
VitroRequest vitroRequest, Log log, Dataset dataSource)
throws MalformedQueryParametersException {
return renderRefreshCacheMarkup(vitroRequest, log, dataSource);
}
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
return renderRefreshCacheMarkup(vitroRequest, log, dataSource);
}
@Override
public Actions getRequiredPrivileges() {
return REQUIRED_ACTIONS;
}
}

View file

@ -19,9 +19,9 @@ import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.factory.P
import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.factory.PersonToPublicationsFactory; import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.factory.PersonToPublicationsFactory;
import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.factory.SubOrganizationWithinModelFactory; import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.factory.SubOrganizationWithinModelFactory;
@SuppressWarnings("serial")
public class ModelConstructorUtilities { public class ModelConstructorUtilities {
@SuppressWarnings("serial")
private static final Map<String, ModelFactoryInterface> modelTypeIdentifierToFactory = new HashMap<String, ModelFactoryInterface>() {{ private static final Map<String, ModelFactoryInterface> modelTypeIdentifierToFactory = new HashMap<String, ModelFactoryInterface>() {{
put(PersonToPublicationsModelConstructor.MODEL_TYPE, new PersonToPublicationsFactory()); put(PersonToPublicationsModelConstructor.MODEL_TYPE, new PersonToPublicationsFactory());
put(PeopleToPublicationsModelConstructor.MODEL_TYPE, new PeopleToPublicationsFactory()); put(PeopleToPublicationsModelConstructor.MODEL_TYPE, new PeopleToPublicationsFactory());
@ -34,6 +34,18 @@ public class ModelConstructorUtilities {
put(SubOrganizationWithinModelConstructor.MODEL_TYPE, new SubOrganizationWithinModelFactory()); put(SubOrganizationWithinModelConstructor.MODEL_TYPE, new SubOrganizationWithinModelFactory());
}}; }};
public static final Map<String, String> modelTypeToHumanReadableName = new HashMap<String, String>() {{
put(PersonToPublicationsModelConstructor.MODEL_TYPE, PersonToPublicationsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(PeopleToPublicationsModelConstructor.MODEL_TYPE, PeopleToPublicationsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(PersonToGrantsModelConstructor.MODEL_TYPE, PersonToGrantsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(PeopleToGrantsModelConstructor.MODEL_TYPE, PeopleToGrantsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE, OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE, OrganizationToGrantsForSubOrganizationsModelConstructor.MODEL_TYPE_HUMAN_READABLE);
put(OrganizationAssociatedPeopleModelWithTypesConstructor.MODEL_TYPE, OrganizationAssociatedPeopleModelWithTypesConstructor.MODEL_TYPE_HUMAN_READABLE);
put(OrganizationModelWithTypesConstructor.MODEL_TYPE, OrganizationModelWithTypesConstructor.MODEL_TYPE_HUMAN_READABLE);
put(SubOrganizationWithinModelConstructor.MODEL_TYPE, SubOrganizationWithinModelConstructor.MODEL_TYPE_HUMAN_READABLE);
}};
public static Model getOrConstructModel(String uri, String modelType, Dataset dataset) public static Model getOrConstructModel(String uri, String modelType, Dataset dataset)
throws MalformedQueryParametersException { throws MalformedQueryParametersException {
return modelTypeIdentifierToFactory.get(modelType).getOrCreateModel(uri, dataset); return modelTypeIdentifierToFactory.get(modelType).getOrCreateModel(uri, dataset);

View file

@ -21,7 +21,8 @@ public class OrganizationAssociatedPeopleModelWithTypesConstructor implements Mo
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static final String MODEL_TYPE = "ORGANIZATION_ASSOCIATED_MODEL_WITH_TYPES"; public static final String MODEL_TYPE = "ORGANIZATION_ASSOCIATED_MODEL_WITH_TYPES";
public static final String MODEL_TYPE_HUMAN_READABLE = "People for specific organization";
private Dataset dataset; private Dataset dataset;

View file

@ -21,7 +21,8 @@ public class OrganizationModelWithTypesConstructor implements ModelConstructor {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static final String MODEL_TYPE = "ORGANIZATION_MODEL_WITH_TYPES"; public static final String MODEL_TYPE = "ORGANIZATION_MODEL_WITH_TYPES";
public static final String MODEL_TYPE_HUMAN_READABLE = "Organization hierarchy";
private Dataset dataset; private Dataset dataset;

View file

@ -26,7 +26,8 @@ public class OrganizationToGrantsForSubOrganizationsModelConstructor implements
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "ORGANIZATION_TO_GRANTS_FOR_SUBORGANIZATIONS"; public static final String MODEL_TYPE = "ORGANIZATION_TO_GRANTS_FOR_SUBORGANIZATIONS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Grants for specific organization via all descendants";
private String organizationURI; private String organizationURI;

View file

@ -24,6 +24,7 @@ public class OrganizationToPublicationsForSubOrganizationsModelConstructor imple
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "ORGANIZATION_TO_PUBLICATIONS_FOR_SUBORGANIZATIONS"; public static final String MODEL_TYPE = "ORGANIZATION_TO_PUBLICATIONS_FOR_SUBORGANIZATIONS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Publications for specific organization via all descendants";
private String organizationURI; private String organizationURI;

View file

@ -27,6 +27,7 @@ public class PeopleToGrantsModelConstructor implements ModelConstructor {
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "PEOPLE_TO_GRANTS"; public static final String MODEL_TYPE = "PEOPLE_TO_GRANTS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Grants for all people via all roles";
private Log log = LogFactory.getLog(PeopleToGrantsModelConstructor.class.getName()); private Log log = LogFactory.getLog(PeopleToGrantsModelConstructor.class.getName());

View file

@ -24,6 +24,7 @@ public class PeopleToPublicationsModelConstructor implements ModelConstructor {
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "PEOPLE_TO_PUBLICATIONS"; public static final String MODEL_TYPE = "PEOPLE_TO_PUBLICATIONS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Publications for all people";
private Log log = LogFactory.getLog(PeopleToPublicationsModelConstructor.class.getName()); private Log log = LogFactory.getLog(PeopleToPublicationsModelConstructor.class.getName());

View file

@ -27,6 +27,7 @@ public class PersonToGrantsModelConstructor implements ModelConstructor {
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "PERSON_TO_GRANTS"; public static final String MODEL_TYPE = "PERSON_TO_GRANTS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Grants for specific person via all roles";
private String personURI; private String personURI;

View file

@ -23,7 +23,8 @@ public class PersonToPublicationsModelConstructor implements ModelConstructor {
private Dataset dataset; private Dataset dataset;
public static final String MODEL_TYPE = "PERSON_TO_PUBLICATIONS"; public static final String MODEL_TYPE = "PERSON_TO_PUBLICATIONS";
public static final String MODEL_TYPE_HUMAN_READABLE = "Specific Person to Publications";
private String personURI; private String personURI;

View file

@ -22,6 +22,7 @@ public class SubOrganizationWithinModelConstructor implements ModelConstructor {
protected static final Syntax SYNTAX = Syntax.syntaxARQ; protected static final Syntax SYNTAX = Syntax.syntaxARQ;
public static final String MODEL_TYPE = "SUBORGANIZATION_WITHIN_HIERARCHY_MODEL"; public static final String MODEL_TYPE = "SUBORGANIZATION_WITHIN_HIERARCHY_MODEL";
public static final String MODEL_TYPE_HUMAN_READABLE = "Bottom-up Organization hierarchy";
private Dataset dataset; private Dataset dataset;

View file

@ -13,6 +13,7 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -277,4 +278,10 @@ public class PersonGrantCountRequestHandler implements VisualizationRequestHandl
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -11,8 +11,8 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants; import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
@ -291,4 +291,10 @@ public class PersonLevelRequestHandler implements VisualizationRequestHandler {
return new TemplateResponseValues(standaloneTemplate, body); return new TemplateResponseValues(standaloneTemplate, body);
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -13,6 +13,7 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
@ -283,4 +284,10 @@ VisualizationRequestHandler {
return new TemplateResponseValues(dynamicTemplate, body); return new TemplateResponseValues(dynamicTemplate, body);
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -17,6 +17,7 @@ import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
@ -479,5 +480,11 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler {
throw new UnsupportedOperationException("Utilities Visualization does not provide " throw new UnsupportedOperationException("Utilities Visualization does not provide "
+ "Short URL Response."); + "Short URL Response.");
} }
@Override
public Actions getRequiredPrivileges() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -0,0 +1,39 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.ModelConstructorUtilities;
public class ConstructedModel {
private String uri;
private String individualLabel;
private String type;
private String humanReadableType;
public ConstructedModel(String type, String uri) {
this.type = type;
this.humanReadableType = ModelConstructorUtilities.modelTypeToHumanReadableName.get(type);
this.uri = uri == null ? "" : uri;
}
public String getUri() {
return uri;
}
public String getType() {
return type;
}
public String getHumanReadableType() {
return humanReadableType;
}
public void setIndividualLabel(String indiviualLabel) {
this.individualLabel = indiviualLabel;
}
public String getIndividualLabel() {
return individualLabel;
}
}

View file

@ -4,10 +4,14 @@ package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Model;
public class ConstructedModelTracker { import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.IllegalConstructedModelIdentifierException;
public class ConstructedModelTracker {
private static Map<String, Model> modelIdentifierToConstructedModel = new HashMap<String, Model>(); private static Map<String, Model> modelIdentifierToConstructedModel = new HashMap<String, Model>();
public static void trackModel(String identifier, Model model) { public static void trackModel(String identifier, Model model) {
@ -18,6 +22,10 @@ public class ConstructedModelTracker {
return modelIdentifierToConstructedModel.get(identifier); return modelIdentifierToConstructedModel.get(identifier);
} }
public static Model removeModel(String uri, String modelType) {
return modelIdentifierToConstructedModel.remove(generateModelIdentifier(uri, modelType));
}
public static String generateModelIdentifier(String uri, String modelType) { public static String generateModelIdentifier(String uri, String modelType) {
if (uri == null) { if (uri == null) {
@ -30,4 +38,17 @@ public class ConstructedModelTracker {
return modelIdentifierToConstructedModel; return modelIdentifierToConstructedModel;
} }
public static ConstructedModel parseModelIdentifier(String modelIdentifier)
throws IllegalConstructedModelIdentifierException {
String[] parts = StringUtils.split(modelIdentifier, '$');
if (parts.length == 0) {
throw new IllegalConstructedModelIdentifierException(modelIdentifier + " provided.");
} else if (parts.length == 1) {
return new ConstructedModel(parts[0], null);
} else {
return new ConstructedModel(parts[0], parts[1]);
}
}
} }

View file

@ -25,13 +25,13 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMa
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants; import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.visualization.collaborationutils.CollaborationData; import edu.cornell.mannlib.vitro.webapp.visualization.collaborationutils.CollaborationData;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants; 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.constants.VisConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Activity; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Activity;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Collaborator; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Collaborator;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.GenericQueryMap; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.GenericQueryMap;
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.SubEntity;
public class UtilityFunctions { public class UtilityFunctions {
@ -285,4 +285,18 @@ public class UtilityFunctions {
return ""; return "";
} }
public static String getIndividualLabelFromDAO(VitroRequest vitroRequest,
String entityURI) {
IndividualDao iDao = vitroRequest.getWebappDaoFactory().getIndividualDao();
Individual ind = iDao.getIndividualByURI(entityURI);
String individualLabel = "Unknown Individual";
if (ind != null) {
individualLabel = ind.getName();
}
return individualLabel;
}
} }

View file

@ -7,6 +7,7 @@ import org.apache.commons.logging.Log;
import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Dataset;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException; import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
@ -22,6 +23,8 @@ import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryP
* @author cdtank * @author cdtank
*/ */
public interface VisualizationRequestHandler { public interface VisualizationRequestHandler {
Actions getRequiredPrivileges();
ResponseValues generateStandardVisualization(VitroRequest vitroRequest, ResponseValues generateStandardVisualization(VitroRequest vitroRequest,
Log log, Log log,