From 605a88b4ff7c4682c02aff65faab48776aa91cf2 Mon Sep 17 00:00:00 2001 From: Graham Triggs Date: Mon, 4 Jul 2016 19:13:20 +0100 Subject: [PATCH] [VIVO-1237] Add sitemap for profiles --- .../webapp/sitemap/SiteMapServlet.java | 115 ++++++++++++++++++ webapp/src/main/webapp/WEB-INF/web.xml | 14 +++ 2 files changed, 129 insertions(+) create mode 100644 api/src/main/java/org/vivoweb/webapp/sitemap/SiteMapServlet.java diff --git a/api/src/main/java/org/vivoweb/webapp/sitemap/SiteMapServlet.java b/api/src/main/java/org/vivoweb/webapp/sitemap/SiteMapServlet.java new file mode 100644 index 00000000..ac1cb4f4 --- /dev/null +++ b/api/src/main/java/org/vivoweb/webapp/sitemap/SiteMapServlet.java @@ -0,0 +1,115 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package org.vivoweb.webapp.sitemap; + +import com.hp.hpl.jena.query.QuerySolution; +import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; +import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants; +import org.apache.axis.utils.StringUtils; +import org.apache.commons.io.IOUtils; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class SiteMapServlet extends VitroHttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String requestURI = request.getRequestURI(); + + if (requestURI != null) { + if (requestURI.contains("robots.txt")) { + String robotsPath = getServletContext().getRealPath("/robots.txt"); + String contextPath = request.getContextPath(); + + StringBuilder builder = new StringBuilder("Sitemap: "); + builder.append(getSchemeAndServer(request)); + + if (!"/".equals(contextPath)) { + builder.append(contextPath); + } + builder.append("/sitemap.xml"); + + response.getOutputStream().println(builder.toString()); + response.getOutputStream().println(); + + InputStream is = null; + try { + is = new FileInputStream(robotsPath); + IOUtils.copy(is, response.getOutputStream()); + } finally { + if (is != null) { + is.close(); + } + } + } else { + final String schemeAndServer = getSchemeAndServer(request); + + String query = QueryConstants.getSparqlPrefixQuery() + + "SELECT ?person\n" + + "WHERE\n" + + "{\n" + + " ?person a foaf:Person .\n" + + "}\n"; + + final VitroRequest vreq = new VitroRequest(request); + final ServletOutputStream out = response.getOutputStream(); + + out.println(""); + out.println(""); + + try { + vreq.getRDFService().sparqlSelectQuery(query, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + String person = qs.getResource("person").getURI(); + + String profileUrl = UrlBuilder.getIndividualProfileUrl(person, vreq); + + if (!StringUtils.isEmpty(profileUrl)) { + try { + out.println(" "); + out.println(" " + schemeAndServer + profileUrl + ""); + out.println(" weekly"); + out.println(" "); + } catch (Exception e) { + } + } + } + }); + } catch (RDFServiceException rse) { + } + + out.println(""); + } + } + super.doGet(request, response); + } + + private String getSchemeAndServer(HttpServletRequest request) { + String serverName = request.getServerName(); + int serverPort = request.getServerPort(); + String scheme = request.getScheme(); + + if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) { + StringBuilder builder = new StringBuilder(); + builder.append(scheme).append("://").append(serverName); + if (("http".equalsIgnoreCase(scheme) && serverPort != 80) || ("https".equalsIgnoreCase(scheme) && serverPort != 443) ) { + builder.append(":").append(serverPort); + } + + return builder.toString(); + } + + return ""; + } +} diff --git a/webapp/src/main/webapp/WEB-INF/web.xml b/webapp/src/main/webapp/WEB-INF/web.xml index 2f7b50ce..525428a7 100644 --- a/webapp/src/main/webapp/WEB-INF/web.xml +++ b/webapp/src/main/webapp/WEB-INF/web.xml @@ -1324,6 +1324,20 @@ /selectLocale + + SiteMap support + SiteMapServlet + org.vivoweb.webapp.sitemap.SiteMapServlet + + + SiteMapServlet + /robots.txt + + + SiteMapServlet + /sitemap.xml + +