1 package com.github.searls.jasmine.thirdpartylibs;
2
3 import org.apache.commons.io.IOUtils;
4 import org.eclipse.jetty.http.HttpHeaders;
5 import org.eclipse.jetty.server.Request;
6 import org.eclipse.jetty.server.handler.ResourceHandler;
7
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.UnsupportedEncodingException;
14 import java.util.Date;
15
16 public abstract class AbstractThirdPartyLibsResourceHandler extends ResourceHandler {
17
18 @Override
19 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
20 if (baseRequest.isHandled()) {
21 return;
22 }
23
24 String resourcePath = getResourcePath(target);
25 InputStream resource = findResource(resourcePath);
26
27 if (resource != null) {
28 String javascript = IOUtils.toString(resource, "UTF-8");
29 if ("/jasmine/boot.js".equals(target)) {
30 javascript = javascript.replaceAll("window.onload =", "jasmine.boot =");
31 }
32 setHeaders(response, resourcePath, javascript);
33 writeResponse(response, javascript);
34 baseRequest.setHandled(true);
35 }
36 }
37
38 protected abstract InputStream findResource(String resourcePath);
39
40 private String getResourcePath(String url) {
41 return url.replaceFirst("^/", "");
42 }
43
44 private void setHeaders(HttpServletResponse response, String resourcePath, String content) {
45 response.setCharacterEncoding("UTF-8");
46
47 if (resourcePath.endsWith(".css")) {
48 response.setContentType("text/css");
49 } else {
50 response.setContentType("text/javascript");
51 }
52 response.addDateHeader("EXPIRES", 0L);
53 response.setDateHeader(HttpHeaders.LAST_MODIFIED, new Date().getTime());
54 try {
55 int contentLength = content.getBytes("UTF-8").length;
56 response.setHeader(HttpHeaders.CONTENT_LENGTH, Integer.toString(contentLength));
57 } catch (UnsupportedEncodingException e) {
58 throw new RuntimeException("The JVM does not support javascript default encoding.", e);
59 }
60 }
61
62 private void writeResponse(HttpServletResponse response, String javascript) throws IOException {
63 response.getWriter().write(javascript);
64 }
65 }