View Javadoc
1   package com.github.searls.jasmine.server;
2   
3   import com.github.searls.jasmine.config.JasmineConfiguration;
4   import com.github.searls.jasmine.io.RelativizesFilePaths;
5   import com.github.searls.jasmine.mojo.Context;
6   import com.github.searls.jasmine.runner.CreatesRunner;
7   import com.github.searls.jasmine.thirdpartylibs.ClassPathResourceHandler;
8   import com.github.searls.jasmine.thirdpartylibs.WebJarResourceHandler;
9   import org.apache.commons.lang3.StringUtils;
10  import org.eclipse.jetty.server.Handler;
11  import org.eclipse.jetty.server.handler.ContextHandler;
12  import org.eclipse.jetty.server.handler.ContextHandlerCollection;
13  import org.eclipse.jetty.server.handler.ResourceHandler;
14  
15  import java.io.File;
16  import java.io.IOException;
17  
18  public class ResourceHandlerConfigurator {
19  
20    private final JasmineConfiguration configuration;
21    private final RelativizesFilePaths relativizesFilePaths;
22    private final CreatesRunner createsRunner;
23  
24    public ResourceHandlerConfigurator(JasmineConfiguration configuration,
25                                       RelativizesFilePaths relativizesFilePaths,
26                                       CreatesRunner createsRunner) {
27      this.configuration = configuration;
28      this.relativizesFilePaths = relativizesFilePaths;
29      this.createsRunner = createsRunner;
30    }
31  
32    public Handler createHandler() throws IOException {
33      ContextHandlerCollection contexts = new ContextHandlerCollection();
34  
35      for (Context context : this.configuration.getContexts()) {
36        String contextRoot = StringUtils.prependIfMissing(context.getContextRoot(), "/");
37        ContextHandler handler = contexts.addContext(contextRoot, "");
38        handler.setAliases(true);
39        handler.setHandler(this.createResourceHandler(true, context.getDirectory().getCanonicalPath(), null));
40      }
41  
42      ContextHandler rootContextHandler = contexts.addContext("/", "");
43      rootContextHandler.setHandler(this.createResourceHandler(false, this.configuration.getBasedir().getCanonicalPath(), new String[]{this.getWelcomeFilePath()}));
44      rootContextHandler.setAliases(true);
45  
46      ContextHandler classPathContextHandler = contexts.addContext("/classpath", "");
47      classPathContextHandler.setHandler(new ClassPathResourceHandler(configuration.getProjectClassLoader()));
48      classPathContextHandler.setAliases(true);
49  
50      ContextHandler webJarsContextHandler = contexts.addContext("/webjars", "");
51      webJarsContextHandler.setHandler(new WebJarResourceHandler(configuration.getProjectClassLoader()));
52      webJarsContextHandler.setAliases(true);
53  
54      return contexts;
55    }
56  
57    private ResourceHandler createResourceHandler(boolean directory, String absolutePath, String[] welcomeFiles) {
58      ResourceHandler resourceHandler = new JasmineResourceHandler(this.createsRunner, this.configuration);
59      resourceHandler.setDirectoriesListed(directory);
60      if (welcomeFiles != null) {
61        resourceHandler.setWelcomeFiles(welcomeFiles);
62      }
63      resourceHandler.setResourceBase(absolutePath);
64      return resourceHandler;
65    }
66  
67    private String getWelcomeFilePath() throws IOException {
68      return this.relativizesFilePaths.relativize(this.configuration.getBasedir(), this.configuration.getJasmineTargetDir()) + File.separator + createsRunner.getRunnerFile();
69    }
70  }