View Javadoc
1   package com.github.searls.jasmine.coffee;
2   
3   import com.gargoylesoftware.htmlunit.MockWebConnection;
4   import com.gargoylesoftware.htmlunit.ScriptResult;
5   import com.gargoylesoftware.htmlunit.WebClient;
6   import com.gargoylesoftware.htmlunit.html.HtmlPage;
7   import com.github.searls.jasmine.io.IOUtilsWrapper;
8   import org.apache.commons.lang3.StringEscapeUtils;
9   
10  import java.io.IOException;
11  import java.util.Collections;
12  import java.util.Map;
13  import java.util.WeakHashMap;
14  
15  public class CoffeeScript {
16  
17    private static Map<String, String> cache = Collections.synchronizedMap(new WeakHashMap<String, String>());
18  
19    private final ThreadLocal<HtmlPage> htmlPage = new ThreadLocal<HtmlPage>() {
20      @Override
21      protected HtmlPage initialValue() {
22        MockWebConnection webConnection = new MockWebConnection();
23        WebClient webClient = new WebClient();
24        webClient.setWebConnection(webConnection);
25        try {
26          HtmlPage page = webClient.getPage(WebClient.URL_ABOUT_BLANK);
27          page.executeJavaScript(ioUtilsWrapper.toString("/vendor/js/coffee-script.js"));
28          return page;
29        } catch (IOException e) {
30          throw new RuntimeException(e);
31        }
32      }
33    };
34  
35    private final IOUtilsWrapper ioUtilsWrapper = new IOUtilsWrapper();
36  
37    public String compile(String coffee) throws IOException {
38      String escapedCoffee = StringEscapeUtils.escapeEcmaScript(coffee);
39      return cache.containsKey(escapedCoffee) ? cache.get(escapedCoffee) : compileAndCache(escapedCoffee);
40    }
41  
42    private String compileAndCache(String input) {
43      ScriptResult scriptResult = htmlPage.get().executeJavaScript(String.format("CoffeeScript.compile(\"%s\");", input));
44      String result = (String) scriptResult.getJavaScriptResult();
45      cache.put(input, result);
46      return result;
47    }
48  
49  }