blob: bdf4aa914eb1fb463a8385a9f00bfc10629275c8 [file] [log] [blame]
Shawn Pearce68311c72015-06-09 17:01:34 -07001// Copyright 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
17import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
18
19import com.google.gitiles.doc.DocServlet;
20
21import org.eclipse.jgit.errors.RepositoryNotFoundException;
22import org.eclipse.jgit.lib.ObjectId;
23import org.eclipse.jgit.lib.Repository;
24import org.eclipse.jgit.revwalk.RevCommit;
25import org.eclipse.jgit.revwalk.RevObject;
26import org.eclipse.jgit.revwalk.RevWalk;
27import org.eclipse.jgit.transport.resolver.RepositoryResolver;
28import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
29import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
30import org.slf4j.Logger;
31import org.slf4j.LoggerFactory;
32
33import java.io.IOException;
34
35import javax.servlet.ServletConfig;
36import javax.servlet.ServletException;
37import javax.servlet.http.HttpServlet;
38import javax.servlet.http.HttpServletRequest;
39import javax.servlet.http.HttpServletResponse;
40
41/** Serves Markdown at the root of a host. */
42public class RootedDocServlet extends HttpServlet {
43 private static final Logger log = LoggerFactory.getLogger(ViewFilter.class);
44 private static final long serialVersionUID = 1L;
45 public static final String BRANCH = "refs/heads/md-pages";
46
47 private final RepositoryResolver<HttpServletRequest> resolver;
48 private final DocServlet docServlet;
49
50 public RootedDocServlet(RepositoryResolver<HttpServletRequest> resolver,
51 GitilesAccess.Factory accessFactory, Renderer renderer) {
52 this.resolver = resolver;
53 docServlet = new DocServlet(accessFactory, renderer);
54 }
55
56 @Override
57 public void init(ServletConfig config) throws ServletException {
58 super.init(config);
59 docServlet.init(config);
60 }
61
62 @Override
63 public void service(HttpServletRequest req, HttpServletResponse res)
64 throws IOException, ServletException {
65 try (Repository repo = resolver.open(req, null);
66 RevWalk rw = new RevWalk(repo)) {
67 ObjectId id = repo.resolve(BRANCH);
68 if (id == null) {
69 res.sendError(HttpServletResponse.SC_NOT_FOUND);
70 return;
71 }
72
73 RevObject obj = rw.peel(rw.parseAny(id));
74 if (!(obj instanceof RevCommit)) {
75 res.sendError(HttpServletResponse.SC_NOT_FOUND);
76 return;
77 }
78
79 req.setAttribute(ATTRIBUTE_REPOSITORY, repo);
80 ViewFilter.setView(req, GitilesView.rootedDoc()
81 .setHostName(req.getServerName())
82 .setServletPath(req.getContextPath() + req.getServletPath())
83 .setRevision(BRANCH, obj)
84 .setPathPart(req.getPathInfo())
85 .build());
86
87 docServlet.service(req, res);
88 } catch (RepositoryNotFoundException | ServiceNotAuthorizedException
89 | ServiceNotEnabledException e) {
90 log.error(String.format("cannot open repository for %s", req.getServerName()), e);
91 res.sendError(HttpServletResponse.SC_NOT_FOUND);
92 } finally {
93 ViewFilter.removeView(req);
94 req.removeAttribute(ATTRIBUTE_REPOSITORY);
95 }
96 }
97}