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
+
+