Retrieve sitemap profile URLs only after consuming result set in order to avoid transaction errors with TDB. Resolve https://jira.lyrasis.org/browse/VIVO-1910 (#231)
This commit is contained in:
parent
d00d7de585
commit
fe09808b1b
1 changed files with 45 additions and 28 deletions
|
@ -2,29 +2,40 @@
|
||||||
|
|
||||||
package org.vivoweb.webapp.sitemap;
|
package org.vivoweb.webapp.sitemap;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import java.io.FileInputStream;
|
||||||
import org.apache.jena.query.QuerySolution;
|
import java.io.IOException;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
|
import java.io.InputStream;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
import java.util.ArrayList;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
|
import java.util.List;
|
||||||
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.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
import javax.servlet.annotation.WebServlet;
|
import javax.servlet.annotation.WebServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
import org.apache.commons.io.IOUtils;
|
||||||
import java.io.InputStream;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.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;
|
||||||
|
|
||||||
@WebServlet(name = "SiteMapServlet", urlPatterns = {"/robots.txt","/sitemap.xml"})
|
@WebServlet(name = "SiteMapServlet", urlPatterns = {"/robots.txt","/sitemap.xml"})
|
||||||
public class SiteMapServlet extends VitroHttpServlet {
|
public class SiteMapServlet extends VitroHttpServlet {
|
||||||
|
|
||||||
|
private static final int MAX_URLS = 50000; // max URLs per sitemap
|
||||||
|
private static final Log log = LogFactory.getLog(SiteMapServlet.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException {
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
|
|
||||||
if (requestURI != null) {
|
if (requestURI != null) {
|
||||||
|
@ -60,7 +71,7 @@ public class SiteMapServlet extends VitroHttpServlet {
|
||||||
"WHERE\n" +
|
"WHERE\n" +
|
||||||
"{\n" +
|
"{\n" +
|
||||||
" ?person a foaf:Person .\n" +
|
" ?person a foaf:Person .\n" +
|
||||||
"}\n";
|
"} LIMIT " + MAX_URLS + "\n";
|
||||||
|
|
||||||
final VitroRequest vreq = new VitroRequest(request);
|
final VitroRequest vreq = new VitroRequest(request);
|
||||||
final ServletOutputStream out = response.getOutputStream();
|
final ServletOutputStream out = response.getOutputStream();
|
||||||
|
@ -68,28 +79,33 @@ public class SiteMapServlet extends VitroHttpServlet {
|
||||||
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||||
out.println("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
|
out.println("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
|
||||||
|
|
||||||
|
List<String> personURIs = new ArrayList<String>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
vreq.getRDFService().sparqlSelectQuery(query, new ResultSetConsumer() {
|
vreq.getRDFService().sparqlSelectQuery(query, new ResultSetConsumer() {
|
||||||
@Override
|
@Override
|
||||||
protected void processQuerySolution(QuerySolution qs) {
|
protected void processQuerySolution(QuerySolution qs) {
|
||||||
String person = qs.getResource("person").getURI();
|
personURIs.add(qs.getResource("person").getURI());
|
||||||
|
|
||||||
String profileUrl = UrlBuilder.getIndividualProfileUrl(person, vreq);
|
|
||||||
|
|
||||||
if (!StringUtils.isEmpty(profileUrl)) {
|
|
||||||
try {
|
|
||||||
out.println(" <url>");
|
|
||||||
out.println(" <loc>" + schemeAndServer + profileUrl + "</loc>");
|
|
||||||
out.println(" <changefreq>weekly</changefreq>");
|
|
||||||
out.println(" </url>");
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (RDFServiceException rse) {
|
} catch (RDFServiceException rse) {
|
||||||
|
log.error(rse, rse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(String person : personURIs) {
|
||||||
|
String profileUrl = UrlBuilder.getIndividualProfileUrl(person, vreq);
|
||||||
|
if (!StringUtils.isEmpty(profileUrl)) {
|
||||||
|
try {
|
||||||
|
out.println(" <url>");
|
||||||
|
out.println(" <loc>" + schemeAndServer + profileUrl + "</loc>");
|
||||||
|
out.println(" <changefreq>weekly</changefreq>");
|
||||||
|
out.println(" </url>");
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out.println("</urlset>");
|
out.println("</urlset>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +120,8 @@ public class SiteMapServlet extends VitroHttpServlet {
|
||||||
if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
|
if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append(scheme).append("://").append(serverName);
|
builder.append(scheme).append("://").append(serverName);
|
||||||
if (("http".equalsIgnoreCase(scheme) && serverPort != 80) || ("https".equalsIgnoreCase(scheme) && serverPort != 443) ) {
|
if (("http".equalsIgnoreCase(scheme) && serverPort != 80)
|
||||||
|
|| ("https".equalsIgnoreCase(scheme) && serverPort != 443) ) {
|
||||||
builder.append(":").append(serverPort);
|
builder.append(":").append(serverPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue