1 package com.highstreet.technologies.helpserver;
3 import java.io.BufferedReader;
5 import java.io.FileInputStream;
6 import java.io.FileReader;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.io.StringReader;
12 import java.net.URLDecoder;
13 import java.nio.file.Path;
14 import java.util.regex.Matcher;
15 import java.util.regex.Pattern;
17 import javax.servlet.ServletException;
18 import javax.servlet.http.HttpServlet;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 import com.highstreet.technologies.helpserver.data.HelpInfrastructureObject;
27 public class HelpServlet extends HttpServlet implements AutoCloseable {
29 private static Logger LOG = LoggerFactory.getLogger(HelpServlet.class);
30 private static final long serialVersionUID = -4285072760648493461L;
32 private static final boolean USE_FILESYSTEM = true;
33 private static final boolean USE_RESSOURCES = !USE_FILESYSTEM;
34 private static final String BASEURI = "/help";
36 private static final boolean REDIRECT_LINKS = true;
38 private Path basePath;
40 public HelpServlet() {
41 LOG.info("Starting HelpServlet instance {}", this.hashCode());
42 HelpInfrastructureObject.createFilesFromResources();
43 this.basePath = HelpInfrastructureObject.getHelpDirectoryBase();
47 protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
48 resp.addHeader("Access-Control-Allow-Origin", "*");
49 resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE");
50 resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
57 * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
58 * javax.servlet.http.HttpServletResponse) Handle Get Request: if
59 * query=?meta=send json infrastructure for README.md else if file exist send
63 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
64 String query = req.getQueryString();
65 resp.addHeader("Access-Control-Allow-Origin", "*");
66 resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE");
67 resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
68 if (query != null && query.contains("meta")) {
70 * LOG.debug("received post with uri="+req.getRequestURI()); String
71 * uri=req.getRequestURI().substring(BASEURI.length()); if(uri.startsWith("/"))
72 * uri=uri.substring(1);
74 File f=new File(HelpInfrastructureObject.KARAFHELPDIRECTORY,"meta.json");
78 LOG.debug("found local meta file");
79 BufferedReader rd=new BufferedReader(new FileReader(f));
80 String line=rd.readLine();
83 resp.getOutputStream().println(line);
90 LOG.debug("start walking from path=" + basePath.toAbsolutePath().toString());
91 HelpInfrastructureObject o = null;
93 o = new HelpInfrastructureObject(this.basePath);
94 else if (USE_RESSOURCES) {
95 // o=new HelpInfrastructureObject()
97 resp.getOutputStream().println(o != null ? o.toString() : "");
99 resp.setHeader("Content-Type", "application/json");
100 } catch (Exception err) {
101 err.printStackTrace();
104 LOG.debug("received get with uri=" + req.getRequestURI());
105 String uri = URLDecoder.decode(req.getRequestURI().substring(BASEURI.length()), "UTF-8");
106 if (uri.startsWith("/"))
107 uri = uri.substring(1);
108 Path p = basePath.resolve(uri);
109 if (USE_FILESYSTEM) {
111 if (f.isFile() && f.exists()) {
112 LOG.debug("found file for request");
113 if (this.isTextFile(f)) {
114 resp.setHeader("Content-Type", "application/text");
115 resp.setHeader("charset", "utf-8");
116 } else if (this.isImageFile(f)) {
117 resp.setHeader("Content-Type", "image/*");
118 } else if (this.ispdf(f)) {
119 resp.setHeader("Content-Type", "application/pdf");
121 LOG.debug("file is not allowed to deliver");
125 LOG.debug("delivering file");
126 OutputStream out = resp.getOutputStream();
129 version=getVersionFromRequestedUri(uri);
130 if (this.isTextFile(f) && REDIRECT_LINKS && version!=null) {
131 final String regex = "(!?\\[[^\\]]*?\\])\\(((?:(?!http|www\\.|\\#|\\.com|\\.net|\\.info|\\.org|\\.svg|\\.png|\\.jpg|\\.gif|\\.jpeg|\\.pdf).)*?)\\)";
132 final Pattern pattern = Pattern.compile(regex);
135 try (BufferedReader br = new BufferedReader(new FileReader(f))) {
136 line = br.readLine();
137 while (line != null) {
138 //check line for internal link
139 matcher = pattern.matcher(line);
142 //extend link with specific version
143 line=line.replace(matcher.group(2),"../"+matcher.group(2)+version+"/README.md");
145 out.write((line+"\n").getBytes());
146 line = br.readLine();
155 try (FileInputStream in = new FileInputStream(f)) {
157 byte[] buffer = new byte[1024];
159 while ((len = in.read(buffer)) != -1) {
160 out.write(buffer, 0, len);
168 LOG.debug("found not file for request");
171 } else if (USE_RESSOURCES) {
172 URL resurl = this.getClass().getResource(p.toString());
173 if (resurl != null)// resource file found
175 if (this.isTextFile(resurl)) {
176 resp.setHeader("Content-Type", "application/text");
177 resp.setHeader("charset", "utf-8");
178 } else if (this.isImageFile(resurl)) {
179 resp.setHeader("Content-Type", "image/*");
180 } else if (this.ispdf(resurl)) {
181 resp.setHeader("Content-Type", "application/pdf");
186 try (InputStream in = this.getClass().getResourceAsStream(p.toString())) {
187 OutputStream out = resp.getOutputStream();
188 byte[] buffer = new byte[1024];
190 while ((len = in.read(buffer)) != -1) {
191 out.write(buffer, 0, len);
198 } else // resource file not found
208 * uri = "help/folder1/folder2/version/README.md"
210 private static String getVersionFromRequestedUri(String uri) {
213 int lastidx=uri.lastIndexOf("/");
216 int slastidx=uri.lastIndexOf("/", lastidx-1);
219 return uri.substring(slastidx+1, lastidx);
222 private boolean isTextFile(URL url) {
223 return url != null ? this.isTextFile(url.toString()) : false;
226 private boolean ispdf(URL url) {
227 return url != null ? this.ispdf(url.toString()) : false;
230 private boolean isImageFile(URL url) {
231 return url != null ? this.isImageFile(url.toString()) : false;
234 private boolean ispdf(File f) {
235 return f != null ? this.ispdf(f.getName()) : false;
238 private boolean ispdf(String name) {
239 return name != null ? name.toLowerCase().endsWith("pdf") : false;
242 private boolean isImageFile(File f) {
243 return f != null ? this.isImageFile(f.getName()) : false;
246 private boolean isImageFile(String name) {
249 ? (name.toLowerCase().endsWith("png") || name.toLowerCase().endsWith("jpg")
250 || name.toLowerCase().endsWith("jpeg") || name.toLowerCase().endsWith("svg")
251 || name.toLowerCase().endsWith("eps"))
255 private boolean isTextFile(File f) {
256 return f != null ? this.isTextFile(f.getName()) : false;
260 private boolean isTextFile(String name) {
262 ? (name.toLowerCase().endsWith("md") || name.toLowerCase().endsWith("txt")
263 || name.toLowerCase().endsWith("html") || name.toLowerCase().endsWith("htm")
264 || name.toLowerCase().endsWith("js") || name.toLowerCase().endsWith("css"))
269 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
273 public void close() throws Exception {