org.apache.archiva.web.docs.RestDocsServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.archiva.web.docs.RestDocsServlet.java

Source

package org.apache.archiva.web.docs;
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author Olivier Lamy
 * @since 1.4-M4
 */
public class RestDocsServlet extends HttpServlet {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        logger.debug("docs request to path: {}", req.getPathInfo());

        String path = StringUtils.removeStart(req.getPathInfo(), "/");
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);

        if (StringUtils.endsWith(path, ".xsd")) {
            StringEscapeUtils.escapeXml(resp.getWriter(), IOUtils.toString(is));
            //IOUtils.copy( is, resp.getOutputStream() );
            return;
        }

        String startPath = StringUtils.substringBefore(path, "/");

        // replace all links !!
        Document document = Jsoup.parse(is, "UTF-8", "");

        Element body = document.body().child(0);

        Elements links = body.select("a[href]");

        for (Element link : links) {
            link.attr("href", "#" + startPath + "/" + link.attr("href"));
        }

        Elements datalinks = body.select("[data-href]");

        for (Element link : datalinks) {
            link.attr("data-href", "#" + startPath + "/" + link.attr("data-href"));
        }

        Elements codes = body.select("code");

        for (Element code : codes) {
            code.attr("class", code.attr("class") + " nice-code");
        }

        //default generated enunciate use h1/h2/h3 which is quite big so transform to h3/h4/h5

        Elements headers = body.select("h1");

        for (Element header : headers) {
            header.tagName("h3");
        }

        headers = body.select("h2");

        for (Element header : headers) {
            header.tagName("h4");
        }

        headers = body.select("h3");

        for (Element header : headers) {
            header.tagName("h5");
        }

        Document res = new Document("");
        res.appendChild(body.select("div[id=main]").first());

        Elements scripts = body.select("script");
        for (Element script : scripts) {
            res.appendChild(script);
        }
        resp.getOutputStream().write(res.outerHtml().getBytes());

    }
}