1. Refactored code to use a utility method instead of having the same method being defined in each of the vis request handlers.
2. Adding a "person level" vis package to handle combination of sparkline & co-authorship vis page. 3. Testing out the concept of accessing fields of a class form jsp page.
This commit is contained in:
parent
d87ffcc3be
commit
0e8e1dc9e2
16 changed files with 848 additions and 152 deletions
|
@ -113,6 +113,9 @@ public class VisualizationController extends BaseEditController {
|
|||
public static final String COAUTHORSHIP_VIS_URL_VALUE
|
||||
= "coauthorship";
|
||||
|
||||
public static final String PERSON_LEVEL_VIS_URL_VALUE
|
||||
= "person_level";
|
||||
|
||||
public static final String UTILITIES_URL_VALUE
|
||||
= "utilities";
|
||||
|
||||
|
@ -204,7 +207,32 @@ public class VisualizationController extends BaseEditController {
|
|||
* This is side-effecting because the visualization content is added
|
||||
* to the request object.
|
||||
* */
|
||||
visRequestHandler.generateVisualization(this, dataSource);
|
||||
visRequestHandler.generateVisualization(dataSource);
|
||||
|
||||
} else {
|
||||
log.error("ERROR! data model empoty");
|
||||
}
|
||||
|
||||
} else if (PERSON_LEVEL_VIS_URL_VALUE
|
||||
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||
|
||||
edu.cornell.mannlib.vitro.webapp.visualization.personlevel.VisualizationRequestHandler visRequestHandler =
|
||||
new edu.cornell.mannlib.vitro.webapp.visualization.personlevel.VisualizationRequestHandler(vreq, request, response, log);
|
||||
|
||||
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||
|
||||
DataSource dataSource = setupJENADataSource(request,
|
||||
response,
|
||||
vreq,
|
||||
rdfResultFormatParam);
|
||||
|
||||
if (dataSource != null) {
|
||||
|
||||
/*
|
||||
* This is side-effecting because the visualization content is added
|
||||
* to the request object.
|
||||
* */
|
||||
visRequestHandler.generateVisualization(dataSource);
|
||||
|
||||
} else {
|
||||
log.error("ERROR! data model empoty");
|
||||
|
|
|
@ -15,7 +15,6 @@ import com.hp.hpl.jena.query.DataSource;
|
|||
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||
|
||||
|
@ -36,7 +35,7 @@ public class VisualizationRequestHandler {
|
|||
|
||||
}
|
||||
|
||||
public void generateVisualization(VisualizationController visualizationController, DataSource dataSource) {
|
||||
public void generateVisualization(DataSource dataSource) {
|
||||
|
||||
String resultFormatParam = "RS_TEXT";
|
||||
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||
|
|
|
@ -40,6 +40,7 @@ import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
|
|||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoDepartmentOrDivision;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoEmployee;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
|
||||
|
||||
public class VisualizationRequestHandler {
|
||||
|
||||
|
@ -275,7 +276,7 @@ public class VisualizationRequestHandler {
|
|||
authorName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(authorName + "-report")
|
||||
String outputFileName = UtilityFunctions.slugify(authorName + "-report")
|
||||
+ ".pdf";
|
||||
|
||||
response.setContentType("application/pdf");
|
||||
|
@ -335,7 +336,7 @@ public class VisualizationRequestHandler {
|
|||
collegeName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(collegeName) + "depts-pub-count" + ".csv";
|
||||
String outputFileName = UtilityFunctions.slugify(collegeName) + "depts-pub-count" + ".csv";
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||
|
@ -359,17 +360,6 @@ public class VisualizationRequestHandler {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently the approach for slugifying filenames is naive. In future if there is need,
|
||||
* we can write more sophisticated method.
|
||||
* @param textToBeSlugified
|
||||
* @return
|
||||
*/
|
||||
private String slugify(String textToBeSlugified) {
|
||||
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
|
||||
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
|
||||
}
|
||||
|
||||
private void generateCsvFileBuffer(
|
||||
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
|
||||
Map<String, VivoCollegeOrSchool> collegeURLToVO, PrintWriter printWriter) {
|
||||
|
|
|
@ -0,0 +1,213 @@
|
|||
package edu.cornell.mannlib.vitro.webapp.visualization.personlevel;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
import javax.servlet.RequestDispatcher;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import com.hp.hpl.jena.query.DataSource;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.CoAuthorshipGraphMLWriter;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.QueryHandler;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.coauthorship.VisVOContainer;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
|
||||
|
||||
public class VisualizationRequestHandler {
|
||||
|
||||
private VitroRequest vitroRequest;
|
||||
private HttpServletRequest request;
|
||||
private HttpServletResponse response;
|
||||
private Log log;
|
||||
|
||||
public VisualizationRequestHandler(VitroRequest vitroRequest,
|
||||
HttpServletRequest request, HttpServletResponse response, Log log) {
|
||||
|
||||
this.vitroRequest = vitroRequest;
|
||||
this.request = request;
|
||||
this.response = response;
|
||||
this.log = log;
|
||||
|
||||
}
|
||||
|
||||
public void generateVisualization(DataSource dataSource) {
|
||||
|
||||
String resultFormatParam = "RS_TEXT";
|
||||
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||
|
||||
String egoURIParam = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE);
|
||||
|
||||
String renderMode = vitroRequest.getParameter(VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE);
|
||||
|
||||
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE);
|
||||
|
||||
String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE);
|
||||
|
||||
QueryHandler queryManager =
|
||||
new QueryHandler(egoURIParam,
|
||||
resultFormatParam,
|
||||
rdfResultFormatParam,
|
||||
dataSource,
|
||||
|
||||
log);
|
||||
|
||||
try {
|
||||
|
||||
VisVOContainer authorNodesAndEdges = queryManager.getVisualizationJavaValueObjects();
|
||||
|
||||
/*
|
||||
* In order to avoid unneeded computations we have pushed this "if" condition up.
|
||||
* This case arises when the render mode is data. In that case we dont want to generate
|
||||
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow.
|
||||
* It is ugly!
|
||||
* */
|
||||
if (VisualizationFrameworkConstants.DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||
|
||||
/*
|
||||
* When just the graphML file is required - based on which actual visualization will
|
||||
* be rendered.
|
||||
* */
|
||||
prepareVisualizationQueryDataResponse(authorNodesAndEdges);
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Computations required to generate HTML for the sparklines & related context.
|
||||
* */
|
||||
|
||||
/*
|
||||
* This is required because when deciding the range of years over which the vis
|
||||
* was rendered we dont want to be influenced by the "DEFAULT_PUBLICATION_YEAR".
|
||||
* */
|
||||
// publishedYearsForCollege.remove(VOConstants.DEFAULT_PUBLICATION_YEAR);
|
||||
|
||||
/*
|
||||
VisualizationCodeGenerator visualizationCodeGenerator =
|
||||
new VisualizationCodeGenerator(yearToPublicationCount, log);
|
||||
|
||||
String visContentCode = visualizationCodeGenerator
|
||||
.getMainVisualizationCode(authorDocuments,
|
||||
publishedYears,
|
||||
visMode,
|
||||
visContainer);
|
||||
|
||||
String visContextCode = visualizationCodeGenerator
|
||||
.getVisualizationContextCode(vitroRequest.getRequestURI(),
|
||||
collegeURIParam,
|
||||
visMode);
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is side-effecting because the response of this method is just to redirect to
|
||||
* a page with visualization on it.
|
||||
* */
|
||||
|
||||
RequestDispatcher requestDispatcher = null;
|
||||
|
||||
prepareVisualizationQueryStandaloneResponse(egoURIParam, request, response, vitroRequest);
|
||||
|
||||
// requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
|
||||
|
||||
try {
|
||||
requestDispatcher.forward(request, response);
|
||||
} catch (Exception e) {
|
||||
log.error("EntityEditController could not forward to view.");
|
||||
log.error(e.getMessage());
|
||||
log.error(e.getStackTrace());
|
||||
}
|
||||
|
||||
} catch (MalformedQueryParametersException e) {
|
||||
try {
|
||||
handleMalformedParameters(e.getMessage());
|
||||
} catch (ServletException e1) {
|
||||
log.error(e1.getStackTrace());
|
||||
} catch (IOException e1) {
|
||||
log.error(e1.getStackTrace());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void prepareVisualizationQueryDataResponse(VisVOContainer coAuthorsipVO) {
|
||||
|
||||
String outputFileName = UtilityFunctions.slugify(coAuthorsipVO.getEgoNode().getNodeName())
|
||||
+ "-coauthor-net" + ".graphml";
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
|
||||
|
||||
try {
|
||||
|
||||
PrintWriter responseWriter = response.getWriter();
|
||||
|
||||
/*
|
||||
* We are side-effecting responseWriter since we are directly manipulating the response
|
||||
* object of the servlet.
|
||||
* */
|
||||
|
||||
CoAuthorshipGraphMLWriter coAuthorShipGraphMLWriter = new CoAuthorshipGraphMLWriter(coAuthorsipVO);
|
||||
|
||||
responseWriter.append(coAuthorShipGraphMLWriter.getCoAuthorshipGraphMLContent());
|
||||
|
||||
responseWriter.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareVisualizationQueryStandaloneResponse(String egoURIParam,
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
VitroRequest vreq) {
|
||||
|
||||
Portal portal = vreq.getPortal();
|
||||
|
||||
// request.setAttribute("visContentCode", visContentCode);
|
||||
// request.setAttribute("visContextCode", visContextCode);
|
||||
|
||||
request.setAttribute("egoURIParam", egoURIParam);
|
||||
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/person_level.jsp");
|
||||
request.setAttribute("portalBean", portal);
|
||||
// request.setAttribute("title", "Individual Publication Count Visualization");
|
||||
// request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
|
||||
|
||||
}
|
||||
|
||||
private void handleMalformedParameters(String errorMessage)
|
||||
throws ServletException, IOException {
|
||||
|
||||
Portal portal = vitroRequest.getPortal();
|
||||
|
||||
request.setAttribute("error", errorMessage);
|
||||
|
||||
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
|
||||
request.setAttribute("portalBean", portal);
|
||||
request.setAttribute("title", "Visualization Query Error - Individual Publication Count");
|
||||
|
||||
try {
|
||||
requestDispatcher.forward(request, response);
|
||||
} catch (Exception e) {
|
||||
log.error("EntityEditController could not forward to view.");
|
||||
log.error(e.getMessage());
|
||||
log.error(e.getStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -164,7 +164,9 @@ public class VisualizationCodeGenerator {
|
|||
"position:absolute;" +
|
||||
"}" +
|
||||
".sparkline_range {" +
|
||||
"color:#7BS69E;" +
|
||||
"color:#7BA69E;" +
|
||||
"font-size:0.9em;" +
|
||||
"font-style:italic;" +
|
||||
"}" +
|
||||
"</style>\n");
|
||||
|
||||
|
@ -360,7 +362,7 @@ public class VisualizationCodeGenerator {
|
|||
"+ " + renderedFullSparks + "" +
|
||||
"+ ' papers with year from '" +
|
||||
"+ ' " + totalPublications + " '" +
|
||||
"+ ' total'" +
|
||||
"+ ' total " +
|
||||
"<span class=\"sparkline_range\">" +
|
||||
"(" + minPubYearConsidered + " - " + currentYear + ")" +
|
||||
"</span>'" +
|
||||
|
|
|
@ -34,6 +34,7 @@ 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.valueobjects.BiboDocument;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Individual;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
|
||||
|
||||
public class VisualizationRequestHandler {
|
||||
|
||||
|
@ -147,7 +148,7 @@ public class VisualizationRequestHandler {
|
|||
|
||||
} else {
|
||||
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
|
||||
visContentCode, visContextCode);
|
||||
visContentCode, visContextCode, valueObjectContainer);
|
||||
|
||||
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||
}
|
||||
|
@ -193,7 +194,7 @@ public class VisualizationRequestHandler {
|
|||
authorName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(authorName) + "report" + ".pdf";
|
||||
String outputFileName = UtilityFunctions.slugify(authorName) + "report" + ".pdf";
|
||||
|
||||
response.setContentType("application/pdf");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
|
||||
|
@ -249,7 +250,7 @@ public class VisualizationRequestHandler {
|
|||
authorName = "";
|
||||
}
|
||||
|
||||
String outputFileName = slugify(authorName) + "pub-count-sparkline" + ".csv";
|
||||
String outputFileName = UtilityFunctions.slugify(authorName) + "pub-count-sparkline" + ".csv";
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||
|
@ -272,17 +273,6 @@ public class VisualizationRequestHandler {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently the approach for slugifying filenames is naive. In future if there is need,
|
||||
* we can write more sophisticated method.
|
||||
* @param textToBeSlugified
|
||||
* @return
|
||||
*/
|
||||
private String slugify(String textToBeSlugified) {
|
||||
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
|
||||
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
|
||||
}
|
||||
|
||||
private void generateCsvFileBuffer(Map<String, Integer> yearToPublicationCount,
|
||||
PrintWriter responseWriter) {
|
||||
|
||||
|
@ -304,12 +294,13 @@ public class VisualizationRequestHandler {
|
|||
|
||||
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
|
||||
HttpServletResponse response, VitroRequest vreq,
|
||||
String visContentCode, String visContextCode) {
|
||||
String visContentCode, String visContextCode, VisVOContainer valueObjectContainer) {
|
||||
|
||||
Portal portal = vreq.getPortal();
|
||||
|
||||
request.setAttribute("visContentCode", visContentCode);
|
||||
request.setAttribute("visContextCode", visContextCode);
|
||||
request.setAttribute("sparklineVO", valueObjectContainer);
|
||||
|
||||
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
|
||||
request.setAttribute("portalBean", portal);
|
||||
|
|
|
@ -8,7 +8,7 @@ import java.util.Set;
|
|||
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -64,7 +64,7 @@ public class Edge {
|
|||
@SuppressWarnings("serial")
|
||||
public Map<String, Integer> getEarliestCollaborationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -96,7 +96,7 @@ public class Edge {
|
|||
@SuppressWarnings("serial")
|
||||
public Map<String, Integer> getLatestCollaborationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -128,7 +128,7 @@ public class Edge {
|
|||
@SuppressWarnings("serial")
|
||||
public Integer getUnknownCollaborationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(collaboratorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(collaboratorDocuments);
|
||||
}
|
||||
|
||||
Integer unknownYearPubCount = yearToPublicationCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR);
|
||||
|
|
|
@ -8,7 +8,7 @@ import java.util.Set;
|
|||
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UtilityFunctions;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -65,7 +65,7 @@ public class Node extends Individual {
|
|||
@SuppressWarnings("serial")
|
||||
public Map<String, Integer> getEarliestPublicationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
|
||||
System.out.println("early - " + yearToPublicationCount);
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ public class Node extends Individual {
|
|||
@SuppressWarnings("serial")
|
||||
public Map<String, Integer> getLatestPublicationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -130,7 +130,7 @@ public class Node extends Individual {
|
|||
|
||||
public Integer getUnknownPublicationYearCount() {
|
||||
if (yearToPublicationCount == null) {
|
||||
yearToPublicationCount = VOUtils.getYearToPublicationCount(authorDocuments);
|
||||
yearToPublicationCount = UtilityFunctions.getYearToPublicationCount(authorDocuments);
|
||||
}
|
||||
|
||||
Integer unknownYearPubCount = yearToPublicationCount.get(VOConstants.DEFAULT_PUBLICATION_YEAR);
|
||||
|
|
|
@ -4,9 +4,10 @@ import java.util.Map;
|
|||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VisConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||
|
||||
public class VOUtils {
|
||||
public class UtilityFunctions {
|
||||
|
||||
public static Map<String, Integer> getYearToPublicationCount(
|
||||
Set<BiboDocument> authorDocuments) {
|
||||
|
@ -51,5 +52,16 @@ public class VOUtils {
|
|||
|
||||
return yearToPublicationCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently the approach for slugifying filenames is naive. In future if there is need,
|
||||
* we can write more sophisticated method.
|
||||
* @param textToBeSlugified
|
||||
* @return
|
||||
*/
|
||||
public static String slugify(String textToBeSlugified) {
|
||||
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-")
|
||||
.substring(0, VisConstants.MAX_NAME_TEXT_LENGTH);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue