1. Adding the tools menu for visualizations. This will provide detailed explanation on why we need the cache refreshing for visualizations and also the link to initiating the reconstruct. It is only accessible to the admins.

This commit is contained in:
tankchintan 2011-07-13 00:36:53 +00:00
parent a83c1180f4
commit 51208948f2
3 changed files with 110 additions and 0 deletions

View file

@ -46,6 +46,9 @@
<bean id="regenerate_vis_models"
class="edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.ModelConstructorRequestHandler" />
<bean id="tools"
class="edu.cornell.mannlib.vitro.webapp.visualization.tools.ToolsRequestHandler" />
<bean id="visualizationInjector"
class="edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationInjector">
<property name="visualizations">
@ -118,6 +121,10 @@
<entry key="refresh-cache">
<ref bean="regenerate_vis_models"></ref>
</entry>
<entry key="tools">
<ref bean="tools"></ref>
</entry>
</map>

View file

@ -0,0 +1,31 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#assign shortVisualizationURLRoot ="/vis">
<#assign refreshCacheURL = "${urls.base}${shortVisualizationURLRoot}/refresh-cache">
<h2>Visualization Tools</h2>
<a href="${refreshCacheURL}">Refresh Cached Models for Visualization</a>
<h5>Why</h5>
Certain class of visualizations like Temporal graph and Map of Science that work on a large scale
attempt to calculate counts of publications (or grants) for all the organizations within an organization.
These queries tend to be both memory intensive and time consuming. In order to provide a good user experience when
these visualizations are served we decided to save the results of these queries to be reused later.
<h5>What</h5>
To this end we have devised a caching solution which will store information about the organization
hierarchy, which publications were published from which organizations etc (among other things) in
semantic way (i.e. we store the rdf model).<br/>
We're currently caching these models in-memory, which works nicely, for now. Currently the cache is only built
once, on first user request after a server restart, so the visualization will essentially never be updated
until the server is restarted again. It is not being updated real-time or periodically. This means that the data in these
models might be stale depending upon when was it last created. In future releases we will come
up with a solution that stores these models on disk and be updated periodically.<br />
<h5>How</h5>
To refresh these models either restart the server or click on "refresh cache" link above. We realize that
in production VIVO instances it is not feasible to restart the server to refresh these models. Hence we
recommend the above link. Administrators can use this link to trigger regeneration of all the existing
models.<br />

View file

@ -0,0 +1,72 @@
package edu.cornell.mannlib.vitro.webapp.visualization.tools;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
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.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 ToolsRequestHandler implements VisualizationRequestHandler {
public static final Actions REQUIRED_ACTIONS = new Actions(new RefreshVisualizationCacheAction());
@Override
public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Visualization Tool does not provide Ajax Response.");
}
@Override
public Map<String, String> generateDataVisualization(
VitroRequest vitroRequest, Log log, Dataset dataset)
throws MalformedQueryParametersException {
throw new UnsupportedOperationException("Visualization Tool does not provide Data Response.");
}
@Override
public ResponseValues generateStandardVisualization(
VitroRequest vitroRequest, Log log, Dataset dataSource)
throws MalformedQueryParametersException {
return renderToolsMenu(vitroRequest, log, dataSource);
}
@Override
public ResponseValues generateVisualizationForShortURLRequests(
Map<String, String> parameters, VitroRequest vitroRequest, Log log,
Dataset dataSource) throws MalformedQueryParametersException {
return renderToolsMenu(vitroRequest, log, dataSource);
}
@Override
public Actions getRequiredPrivileges() {
return REQUIRED_ACTIONS;
}
private ResponseValues renderToolsMenu(VitroRequest vitroRequest,
Log log, Dataset dataSource) {
String standaloneTemplate = "tools.ftl";
Map<String, Object> body = new HashMap<String, Object>();
body.put("title", "Visualization Tools");
return new TemplateResponseValues(standaloneTemplate, body);
}
}